spring cloud sidecar 代理python的webapi服务

系统结构

spring cloud sidecar 代理python的webapi服务_第1张图片

系统方案

1.eurake服务中心的实现---略

2.python服务的特殊实现

python服务需要特别实现一个health的方法,并且返回指定的json格式如下

{
  "status":"UP"
}

3.基于sidecar的代理程序实现

  1. pom文件的引用配置
  2. 
            UTF-8
            UTF-8
            1.8
            8
            8
            2.1.5.RELEASE
            Greenwich.RELEASE
        
        
                   
                org.springframework.boot
                spring-boot-starter-web
            
            
            
                org.springframework.cloud
                spring-cloud-netflix-sidecar
            
            
                org.springframework.cloud
                spring-cloud-starter-openfeign
            
            
                org.springframework.cloud
                spring-cloud-starter-netflix-eureka-client
            
            
                org.springframework.boot
                spring-boot-starter-test
                test
            
        
        
            
                
                    org.springframework.boot
                    spring-boot-dependencies
                    ${spring-boot.version}
                    import
                    pom
                
                
                
                    org.springframework.cloud
                    spring-cloud-dependencies
                    ${spring-cloud.version}
                    pom
                    import
                
            
        

     

  3. application.properties文件配置
  4. server.port=端口号
    #配置Tomcat编码,默认为UTF-8
    server.tomcat.uri-encoding=UTF-8
    spring.application.name=程序名
    #python的webapi的端口
    sidecar.port=python服务的端口
    #python的webapi的hostname
    sidecar.hostname=ip地址
    #python的webapi的ip,多网卡的服务器需要指明ip
    sidecar.ip-address=ip地址
    sidecar.health-uri=http://ip地址:${sidecar.port}/health
    # 启动服务注册
    eureka.client.register-with-eureka = true
    #启动服务发现
    eureka.client.fetch-registry = true
    eureka.client.service-url.defaultZone = http://注册服务中心地址/eureka/
    eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
    ribbon.ConnectTimeout=5000
    ribbon.ReadTimeout=5000
  5. 入口程序类如下
  6. 
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.sidecar.EnableSidecar;
    
    
    @EnableSidecar
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
    }

     

4.调用python服务的java程序的实现

  1. pom引用
  2. 
            org.springframework.boot
            spring-boot-starter-parent
            2.1.8.RELEASE
             
        
    ......................省略常见配置
      
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                org.springframework.cloud
                spring-cloud-starter-openfeign
            
            
                org.springframework.cloud
                spring-cloud-starter-netflix-eureka-client
            
            
                org.springframework.boot
                spring-boot-starter-test
                test
            
        
        
            
                
                
                    org.springframework.cloud
                    spring-cloud-dependencies
                    Greenwich.RELEASE
                    pom
                    import
                
            
        
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
            
        

     

  3. application.properties的配置
  4. server.port=端口
    #配置Tomcat编码,默认为UTF-8
    server.tomcat.uri-encoding=UTF-8
    # 启动服务注册
    eureka.client.register-with-eureka = false
    #启动服务发现
    eureka.client.fetch-registry = true
    eureka.client.service-url.defaultZone = http://注册中心地址/eureka/
    ribbon.okhttp.enabled=true
    ribbon.restclient.enabled=true

     

  5. 标准fegin格式接口实现
  6. import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @FeignClient(value ="sidecar代理程序在配置文件中spring.application.name属性的值")
    public interface 接口名{
        /**
         * RequestMapping中的路径需要是端口后的路径
         * @return
         */
        @RequestMapping(value = "/路径/方法名/",method = {RequestMethod.POST})
        String 方法名【最好和Python一致,便于管理】();
    
    
    }

     

  7. 服务调用,正常的fegin接口调用
  8.  @Autowired
        private 接口名 service;

     

系统启动

  1. 启动python服务
  2. 启动sidecar程序【前提eureka服务中心已经在运行】
  3. 启动调用服务的java程序

注意

python的webapi请求格式

http://域名/路径/方法名/

需要以/结尾,如果没有/的话python的框架会发出http的308状态,自动跳转,对于java的fegin客户端来说这是不可接受的,所以在编写feginclient接口的方法时,一定注意要以/结尾设置RequestMapping的value值。

java的webapi请求格式

http://域名/路径/方法名

是没有/结尾的,如果按照java的习惯设置python服务的feginclient接口里RequestMapping的value值会引起问题。

你可能感兴趣的:(实践手册)