SpringCloud集成Python-web服务
对于springcloud集成python的web服务刚开始也没头绪,于是就翻官方文档,当然官网文档说的是相当笼统,具体链接奉上:
19.Polyglot support with Sidecar ,看19小节即可,看完后就决定自己摸一下喽,没想到可以实现,哈哈。好了不废话了直接说整体,我们公司需求就是讲python的web服务集成到springcloud中去,方便服务的对接和测试。当然
1. 准备python测试脚本,我是从网上拷贝了一份,取名为python-web.py,前提本机上已经安装python,脚本功能即提供python的web服务访问。
2.搭建注册中心:高可用模式,推荐节点数(application)为奇数数目,我在项目中由于机器内存问题采用了两个节点作为服务注册中心。
①:新建一个springboot项目,建议使用官网方式创建,链接奉上:新建springboot项目,打开网址后相应的输入内容,重点:在Dependencies选项内分别输入:web, Eureka Server即可,然后点击Generate Porject选项下载即可。
②:在eclipse中导入刚才下载的项目(需先解压出来),选择 file --> import --> maven --> Existing Maven Projects,然后再弹出的对话框内选择项目解压的位置,然后点击 “ finish” 即可,eclipse会自动构建项目。
③:因为搭建的是高可用的服务中心,则需要拷贝一份刚才下载的项目,修改artifactId即可(拷贝一份下载的项目后,解压到某个位置,找到pom.xml,修改里面的artifactId标签项内容)。然后再重新执行②导入到eclipse中,至此高可用的服务注册中心壳子已经建好。
④:分别在上面的ha-server1,ha-server2项目中的 com.zj.server 包下的HAServer1Application,HAServer2Application类里面添加注解@EnableEurekaServer。注意!!!是分别添加。
⑤:分别在上面的ha-server1,ha-server2项目中的 /ha-server1/src/main/resources,/ha-server1/src/main/resources 下面的application.properties文件中添加以下配置项,具体配置项含义随后补充。
⑥:分别启动运行两个application,然后访问:http://localhost:8761,http://localhost:8762 即可显示如下面截图:
我的地址栏是peer1,peer2这个是主机名映射的问题,如果需要则修改 C:\Windows\System32\drivers\etc\hosts 文件,添加下面两行即可:
127.0.0.1 peer1
127.0.0.1 peer2
⑦:以上如果显示正常则表示完成服务中心的搭建,接下来创建microservice-python项目,复制①下载的项目,修改pom.xml文件里面的artifactId及添加依赖 groupid org.springframework.cloud
和 artifactid spring-cloud-netflix-sidecar,修改application的名字为sideCarApplication,然后再sideCarApplication类里面添加注解@EnableSidecar,然后配置application.properties文件,配置内容如下。然后在
/ha-server1/src/main/java 目录下新建一个package,名字自己定义,新建一个controller,添加注解:@RestController,其内为提供的python服务接口,和java服务接口,具体调用由Ribbon负载均衡调用,至此服务提供者就搭建完成,具体controller代码见下面标示。
⑧:接下来创建microservice-consumer项目,复制①下载的项目,修改pom.xml文件里面的artifactId及添加依赖 groupid org.springframework.cloud
和 artifactid spring-cloud-starter-netflix-eureka-client和 spring-cloud-starter-netflix-ribbon,注意此处是
groupid一样,artifactid不一样也就是两个
,修改application的名字为RibbonConsumerApplication,然后在RibbonConsumerApplication类里面添加注解:@RestController
@EnableEurekaClient等,具体代码见下面标示。
⑨:至此项目架构搭建完毕,依次运行项目:
ha-server1,ha-server2,microservice-python,microservice-consumer,必须按照这个顺序!为了节约大家时间,提供代码下载链接:项目源码demo
第⑧步里面的RibbonConsumerApplication代码:
@SpringBootApplication
@RestController
@EnableEurekaClient
public class RibbonConsumerApplication {
private static final String REST_URL_PREFIX = "http://EUREKACLIENT";
// private static final String REST_URL_PREFIX = "http://localhost:8081";
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
RestTemplate restTemplate;
@RequestMapping(value= "/hi", method= RequestMethod.GET)
public String hi(@RequestParam(value = "name", defaultValue = "Artaban") String name) {
String greeting = this.restTemplate.getForObject(REST_URL_PREFIX + "/index?name=" + name, String.class);
return String.format("%s, %s!", greeting, name);
}
@RequestMapping(value= "/java-user", method= RequestMethod.GET)
public String getUserInfo() {
return "{'username': 'java', 'password': 'java'}" ;
}
@RequestMapping("/python-user")
public String pythonUser() {
return restTemplate.getForEntity("http://PY-SIDECAR/getUser", String.class).getBody();
}
}
第⑦步里面的controller代码:
@RestController
public class UserInfoController {
private static final String SERVICE_URL = "http://PY-SIDECAR/getUser";
@Autowired
private RestTemplate resTemplate;
@RequestMapping("/java-user")
public String getUserInfo() {
return "{'name': 'java', 'password': '123'}";
}
@RequestMapping("/python-user")
public String pythonUser() {
return resTemplate.getForEntity(SERVICE_URL, String.class).getBody();
}
}
ha-server1的application.properties配置项:
server.port=8761
spring.profiles.active=peer1
#spring.security.user.name=gis
#spring.security.user.password=gis123
eureka.instance.hostname=peer1
eureka.instance.ip-address=127.0.0.1
eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://peer2:8762/eureka/
----------------------分割线------------------------
ha-server2的application.properties配置项:
server.port=8762
spring.profiles.active=peer1
#spring.security.user.name=gis
#spring.security.user.password=gis123
eureka.instance.hostname=peer2
eureka.instance.ip-address=127.0.0.1
eureka.instance.prefer-ip-address=true
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://peer1:8761/eureka/
----------------------分割线------------------------
microservice-python的application.peoperties配置项:
server.port=5678
spring.application.name=py-sidecar
sidecar.port=3000
sidecar.health-uri=http://localhost:${sidecar.port}/health
eureka.client.serviceUrl.defaultZone=http://peer1:8761/eureka/,http://peer2:8762/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')