• SpringCloud 整合 Python


    前言

    该篇文章分享如何将Python Web服务融入到Spring Cloud微服务体系中,并调用其服务,Python Web框架用的是Tornado

    构建Python web服务

    • 引入py-eureka-client客户端
    pip install py_eureka_client
    
    • manage.py
    import tornado.httpserver
    import tornado.ioloop
    import tornado.options
    import tornado.web
    import py_eureka_client.eureka_client as eureka_client
    from tornado.options import define, options
    from time import sleep
    
    define("port", default=3000, help="run on the given port", type=int)
    
    class IndexHandler(tornado.web.RequestHandler):
        def get(self):
            username = self.get_argument('username', 'Hello')
            self.write(username + ', Administrator User!')
    
        def post(self):
            username = self.get_argument('username', 'Hello')
            self.write(username + ', Administrator User!')
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            username = self.get_argument('username', 'Hello')
            self.write(username + ', Coisini User!')
    
        def post(self):
            username = self.get_argument('username', 'Hello')
            self.write(username + ', Coisini User!')
    
    def main():
        tornado.options.parse_command_line()
        # 注册eureka服务
        eureka_client.init_registry_client(eureka_server="http://localhost:31091/eureka/,http://localhost:8761/eureka/",
                                           app_name="tornado-server",
                                           instance_port=3000)
        app = tornado.web.Application(handlers=[(r"/test", IndexHandler), (r"/main", MainHandler)])
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()
    
    if __name__ == '__main__':
        main()
    

    大致说下上述代码,向端口为31091的注册中心注册服务名为tornado-server的服务,端口为3000,提供两个请求方式为GETPOST,接口路径为/test/main的外部调用接口

    • 启动python服务(在此之前要创建一个Eureka服务注册中心)
    python manage.py runserver
    
    • 运行结果

    在这里插入图片描述

    在这里插入图片描述

    服务调用 - consumer-server工程

    • pom.xml
    <dependencies>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-eureka-server</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-hystrix</artifactId>
    		</dependency>
    		<!-- Feign Client -->
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-feign</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>io.github.openfeign.form</groupId>
    			<artifactId>feign-form</artifactId>
    			<version>3.4.1</version>
    		</dependency>
    		<dependency>
    			<groupId>io.github.openfeign.form</groupId>
    			<artifactId>feign-form-spring</artifactId>
    			<version>3.4.1</version>
    		</dependency>
    	</dependencies>
    
    • ConsumerApplication.java
    import org.springframework.boot.SpringApplication;
    import org.springframework.cloud.client.SpringCloudApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringCloudApplication
    public class ConsumerApplication {
    	@Bean
    	@LoadBalanced
    	RestTemplate restTemplate() {
    		return new RestTemplate();
    	}
    	public static void main(String[] args) {
    		SpringApplication.run(ConsumerApplication.class, args);
    	}
    }
    
    • application.yml
    spring:
      profiles:
        active: "dev"
      application:
        name: consumer-server
        
    server:
      port: 8325
    
    eureka:
      client:
        healthcheck:
          enabled: true
        service-url:
          defaultZone: http://${registry.host:localhost}:${registry.port:8761}/eureka/
          
    ---
    spring:
      profiles: dev
    
    registry:
      host: localhost
      port: 31091
    
    • TestController.java
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    import com.coisini.consumer.client.TestAPIClient;
    
    @RestController
    public class TestController {
        private TestAPIClient testAPIClient;
    
        @Autowired
        public TestController(TestAPIClient testAPIClient) {
            this.testAPIClient = testAPIClient;
        }
    
        @PostMapping("/test")
        public String test(@RequestParam String username) throws Exception {
            return this.testAPIClient.test(username);
        }
        
        @GetMapping("/test")
        public String test1() throws Exception {
            return this.testAPIClient.test1();
        }
    }
    
    • TestAPIClient.java
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import com.coisini.consumer.config.FeignConfigure;
    
    @FeignClient(name="tornado-server", configuration = FeignConfigure.class)
    public interface TestAPIClient {
    
        @PostMapping("/test")
        String test(@RequestParam("username") String username);
        
        @GetMapping("/test")
        String test1();
    }
    
    • FeignConfigure.java
    import feign.Logger;
    import feign.codec.Encoder;
    import feign.form.spring.SpringFormEncoder;
    import org.springframework.beans.factory.ObjectFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
    import org.springframework.cloud.netflix.feign.EnableFeignClients;
    import org.springframework.cloud.netflix.feign.support.SpringEncoder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableFeignClients(basePackages = "com.coisini")
    public class FeignConfigure {
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
    
        @Autowired
        private ObjectFactory<HttpMessageConverters> messageConverters;
        
        @Bean
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder(new SpringEncoder(messageConverters));
        }
    }
    

    运行结果

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里,我们用请求工具Postman来测试一下,可以看出,由TestController调用TestAPIClient再调用Python服务成功,至此,已完成微服务调用Python Web服务

    Demo下载

    GitHub:SpringCloud 整合 Python - Tornado
    Gitee:SpringCloud 整合 Python - Tornado

    end

  • 相关阅读:
    面试汇总
    Windows 环境下的 protoc 安装(转)
    Hbase 元数据一致性检查(转)
    Slow ReadProcessor&amp;Error Slow BlockReceiver错误日志分析(转)
    Hbase CMS GC 调优。
    [技术]排查线上问题
    crontab 误删恢复
    Hbase balancer RSgroup shell 脚本
    Hbase运维手册(1)
    Presto JVM.config
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/12099628.html
Copyright © 2020-2023  润新知