原文请参考:https://blog.csdn.net/hliq5399/article/details/80540760
个人应用场景:
使用python 实现一些算法,然后通过java springboot 项目去调用。。。。
************************************
1.引言
说到Python
这门语言,应该都会很熟悉,近几年来Python
大火,几乎都到了人人喊着:“人生苦短,我学Python
”的境地,确实Python
在机器学习方面有着得天独厚的优势,在Python
语言中拥有很多现成的机器学习函数库,然后在Web
开发中还是有着很多人使用Java
作为服务器的后台语言,尤其是近几年来微服务的兴起,也有着越来越多的人使用SpringCloud
(基于Java
语言实现的微服务框架),因此就产生了这么一个需求:能否将Python
的机器学习算法集成到SpringCloud
中,作为我们Web
系统的服务,当我们自己使用Python实现了一个新的机器学习算法的时候,可以同时为他人提供服务。用户在Web端提供数据,而Web平台提供算法进行计算,同时反馈给用户)。 要想实现上面的需求,其实就是存在着整合SpringCloud
整合Python
的必要性。因此我查了SpringCloud
的官网,还真的提供了整合Python
语言的解决方案(其实是整合第三方语言的解决方案)。这个解决方案叫做:sidecar
。通过使用sidecar
我们可以将Python
接口注册为SpringCloud
的一个服务,实现Java
(因为SpringCloud
是Java
语言的一款框架)和Python
的双向通信,即:Python
可以调用Java
语言的接口,同时Java
也可以调用Python
语言的接口。
2. 什么是sidecar
?
我们刚刚说了使用sidecar
可以将SpringCloud
和第三方语言整合,那什么是sidecar
呢?说白了sidecar
就是springcloud
提供的一个工具,使用该工具将第三方的rest
接口集成到springcloud
中来。那么如何使用sidecar
呢?首先我们看一下官网的描述。
2.1 Polyglot
支持Sidecar
(官网描述)
Spring Cloud Netflix Sidecar
包含一个简单的http api
来获取给定服务的所有实例(即主机和端口)。然后可以通过从Eureka
获取其路由条目的嵌入式Zuul
代理来代理服务调用。可以通过主机查找或通过Zuul
代理访问Spring Cloud Config
服务器。但是第三方程序必须执行健康检查,以便Sidecar
可以向应用程序启动或关闭时向eureka
报告(意思就是说:第三方程序必须提供一个接口告诉Spring Cloud
自身是否还在运行?)。如何使用Sidecar
呢?官网给出了如下的步骤:
2.1.1 使用Sidecar
步骤
- 添加Java包依赖
如果要在项目中包含Sidecar
,需要使用org.springframework.cloud
和artifact id spring-cloud-netflix-sidecar
的依赖。
- 注解启动
Sidecar
使用@EnableSidecar
创建Spring Boot
应用程序。此注释包括@EnableCircuitBreaker
,@EnableDiscoveryClient
和@EnableZuulProxy
。
- 修改配置
配置Sidecar
,应该将sidecar.port
和sidecar.health-uri
添加到application.yml
。sidecar.port
属性是非jvm
应用程序正在侦听的端口。这样,Sidecar
可以使用Eureka
正确注册该应用。sidecar.health-uri
是可以在非jvm
应用程序上访问的,可以模拟Spring Boot
健康指标。它应该返回一个json
文档,如下所示:
-
{
-
"status":"UP"
-
}
以下是Sidecar
应用程序的application.yml
示例:
-
server:
-
port: 5678
-
spring:
-
application:
-
name: sidecar
-
-
sidecar:
-
port: 8000
-
health-uri: http://localhost:8000/health.json
2.1.2 Java调用非JVM程序接口
我们使用
Sidecar
将第三方程序接口(比如Python
)注册到SpringCloud
之中,如何使用Python
接口呢?这时候就非常简单了,此时我们就可以将Python
接口当作Java
接口进行调用(其实时通过springcloud
去调用Sidecar
,然后通过Sidecar
去转发我们的程序请求)。2.1.3 非JVM接口调用Java接口
因为非
JVM
应用 被注册到SpringCloud
之中,对于第三方应用程序来说,整个SpringCloud
的内容,我们都可以进行调用了,比如我们有一个Java服务叫做customers
,那么我们就可以通过url来调用,比如http://localhost:5678/customers
(假设Sidecar
在端口5678
上),因为配置服务器(configserver
)也属于SpringCloud的一个服务,因此非JVM
语言也可以调用配置服务器的配置,比如使用如下的url
:http:// localhost:5678/configserver
2.2
Sidecar
总结看了官网的描述,似乎我们还是抓不住重点,到底应该如何结合
Sidecar
和第三方程序呢?依旧是如此的茫然。下面我着重说一下官网提供的重点:Sidecar
是一个用于监听非JVM应用程序(可以是Python
或者Node
或者Php
等等)的一个工具,通过Sidecar
可以实现Java
和第三方应用程序的双向交互- 第三方应用程序必须要实现一个接口,实时向
Sidecar
报告自己的状态,告诉Sidecar
自己还在运行着。 Sidecar
应用程序必须和第三方应用程序运行在同一台电脑上,也就是说他们之间是localhost
,不能是ip
访问(官网未提及)
sideCard 服务依赖:
<properties>
<java.version>1.8</java.version>
<spring.cloud.version>Finchley.RC2</spring.cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
定义sidecar
:(不用写任何代码)
main
方法
@EnableSidecar @SpringBootApplication public class PySidecarApplication { public static void main(String[] args) { SpringApplication.run(PySidecarApplication.class, args); } }
application.properties
配置文件:
spring.application.name=py-sidecar server.port=8001 sidecar.port=3000 sidecar.health-uri=http://localhost:${sidecar.port}/health #Python 服务的mock 健康检测 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 ribbon.ConnectTimeout=5000 ribbon.ReadTimeout=5000 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
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')
这样sideCard 服务就有python 服务的所有接口了,接下来就可以使用 RestTemplate 或是 spring-cloud-starter-openfeign 来使用这写接口
Sidecar
应用程序必须和第三方应用程序运行在同一台电脑上,也就是说他们之间是localhost
,不能是ip
访问,测试发现如果不在同一台机器上,会报错:连接诶拒绝
使用:略