原文請參考: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/configserver2.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訪問,測試發現如果不在同一台機器上,會報錯:連接誒拒絕
使用:略
