最近需求需要将一些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报告。
org.springframework.cloud和artifact id spring-cloud-netflix-sidecar
@EnableSidecar创建Sping boot应用程序。此注释包括@EnableCircuitBreaker,@EnableDiscoveryClient和@EnableZuulProxy
配置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
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
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}
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
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);
}
}
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