springCloud整合python基于springBoot2.0.2

1背景

最近需求需要将一些python项目整合到web,项目架构基于springCloud。

通过sidecar将springCloud和第三方语言整合。Sidecar将第三方程序接口注册到SpringCloud中,然后就可以将第三方接口当作Java接口进行调用(通过springCloud去调用Sidecar,然后通过Sidecar转发程序请求)。

Sidecar是一个用于监听非JVM应用程序的一个工具,通过Sidecar可以实现Java和第三方程序的双向交互。(第三方程序必须要实现一个接口,实时向Sidecar报告自己的状态,告诉Sidecar自己还活着)。

Sidecar应用程序必须和第三方应用程序运行在同一个电脑上。

Spring Cloud Netflix Sidecar通过的http api来获取给定服务的所以实例(主机和端口)。然后通过Eureka获取路由条目的嵌入式Zuul代理来代理服务调用。通过主机查找或通过Zuul代理访问Spring Cloud Config服务器。但是第三方必须执行健康检查,以便Scar可以向应用程序启动或关闭时向eureka报告。

2Sidecar使用步骤

step1.添加java包依赖

org.springframework.cloud和artifact id spring-cloud-netflix-sidecar

step2.注解启动Sidecar

@EnableSidecar创建Sping boot应用程序。此注释包括@EnableCircuitBreaker,@EnableDiscoveryClient和@EnableZuulProxy

step3.修改配置

配置Sidecar,应该将Sidecar.port和sidecar.health-uri添加到application.properties。

sidecar.port属性是非jvm应用程序正在侦听的端口。这样,Sidecar可以使用Eureka正确注册应用。

sidecar.health-uri是可以在非jvm应用程序上访问的,可以模拟Spring Boot健康指标。它返回一个json文档

{

"status":"up"

}

Sidecar应用的application.propertie

3定义python服务

import json
from flask import Flask, Response
app = Flask(__name__)
@app.route("/health")
def health():
    result = {'status': 'UP'}
    return Response(json.dumps(result), mimetype='application/json')
@app.route("/getUser")
def getUser():
    result = {'username': 'python', 'password': 'python'}
    return Response(json.dumps(result), mimetype='application/json')
app.run(port=3000, host='0.0.0.0')

 

Python服务监听3000接口。

health方法用于给Sidecar提供健康接口,实时向Sidecar提供自己的健康状态。

getUser是Python向外界提供的服务。例子接口

 


    com.demo
    cloud
    pom
    1.0-SNAPSHOT
	springCloud学习

	
	
		org.springframework.boot
		spring-boot-starter-parent
		2.0.3.RELEASE
		
		
	

	
	
		UTF-8
		UTF-8
		1.8
		Finchley.RELEASE
	

	
	
		
			
				org.springframework.cloud
				spring-cloud-dependencies
				${spring-cloud.version}
				pom
				import
			
		
	

	
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	
	
		
			spring-milestones
			Spring Milestones
			https://repo.spring.io/milestone
			
				false
			
		
	
	
	    registry
        auth
        sidecar

	

4定义注册中心

maven



    4.0.0
    jar
    registry
    euraka project for Spring Boot
    
        cloud
        com.demo
        1.0-SNAPSHOT
    
    
        UTF-8
        UTF-8
        1.8
        spring-boot
    
    
        
            
            
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
            2.0.0.RELEASE
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        
            org.springframework.cloud
            spring-cloud-netflix-eureka-server
            RELEASE
            compile
        
    
    
        
            
                maven-compiler-plugin
                
                    ${java.version}
                    ${java.version}
                    true
                
            
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                    true
                
            
            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.6
                
                    
                        ${basedir}/src/main/resources/generator/generatorConfig.xml
                    
                    true
                    true
                
                
                    
                        mysql
                        mysql-connector-java
                        5.1.29
                    
                    
                        tk.mybatis
                        mapper
                        4.0.0
                    
                    
                        com.lpty
                        common-dao
                        1.0-SNAPSHOT
                    
                
            
 
    
    
        
            spring-snapshots
            Spring Snapshots
            https://repo.spring.io/snapshot
            
                true
            
        
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                false
            
        
    

配置

server.port=8000
spring.application.name=eureka-server
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

main方法

package com.example.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;


@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaApplication.class, args);
	}
}

注册中心端口:8000

5定义sidecar

pom




    4.0.0
    jar
    sidecar
    
        cloud
        com.lpty
        1.0-SNAPSHOT
    
    
        UTF-8
        UTF-8
        1.8
        Finchley.BUILD-SNAPSHOT
    

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.cloud
            spring-cloud-netflix-sidecar
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Finchley.RELEASE
                pom
                import
            
        
    
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

配置

spring.application.name=sidecar
server.port=8001
sidecar.port=3000
sidecar.health-uri=http://localhost:${sidecar.port}/health
#超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
ribbon.ConnectTimeout=5000
ribbon.ReadTimeout=5000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

sidecar.port代表第三方程序运行端口(比如上方python),所以监听端口为3000

server.port代表sidecar运行端口

spring.application.name=sidecar代表sidecar应用名字

sidecar.health-uri是python的健康接口。

main方法

package com.example.sidecar;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.sidecar.EnableSidecar;

@EnableSidecar
@SpringBootApplication
public class SidecarApplication {
    public static void main(String[] args){
        SpringApplication.run(SidecarApplication.class,args);
    }
}

6.定义Java服务

spring.application.name=java-service
server.port=8888
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
  • server.port代表Java服务运行的端口
  • spring.application.name代表Java服务应用的名字

controller

package com.example.demo;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class JavaController {
    @Autowired
    private RestTemplate restTemplate;
    @RequestMapping("/java-user")
    public String JavaUser() {
        return "{'username': 'java', 'password': 'java'}"  ;
    }
    @RequestMapping("/python-user")
    public String PythonUser() {
        return restTemplate.getForEntity("http://sidecar/getUser", String.class).getBody();
    }
 
}

main方法

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
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 RibbonConsumerApplication {
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }
}

在调用服务之前,回顾下代码做了什么事情:

定义了一个python服务,运行在端口3000

定义一个sidecar,运行在端口8001,监听python端口3000,应用名字为sidecar

定义一个JAVA服务,运行在端口8888,应用名字为java-service

启动Python服务,注册中心,sidecar,java-service

springCloud整合python基于springBoot2.0.2_第1张图片

你可能感兴趣的:(JAVA)