SpringCloud集成Python-web服务

SpringCloud集成Python-web服务

对于springcloud集成python的web服务刚开始也没头绪,于是就翻官方文档,当然官网文档说的是相当笼统,具体链接奉上:

19.Polyglot support with Sidecar ,看19小节即可,看完后就决定自己摸一下喽,没想到可以实现,哈哈。好了不废话了直接说整体,我们公司需求就是讲python的web服务集成到springcloud中去,方便服务的对接和测试。当然

  • 项目技术架构:SpringBoot-2.0.1 + SpringCloud  Finchley.SR1 + Eureka + Ribbon + Sidecar + Python 3.6.3。
  • 项目整体结构:(EurekaServer1,EurekaServer2)高可用服务中心,分别对应两个application,Ribbon客户端负载均衡microservice-ribbon-consumer,对应一个application(也就是服务消费者的角色,客户端负载均衡可以问度娘),microservice-python-sidecar,对应一个application(也就是服务提供者的角色,包括java服务和python服务的调用接口)。
  • 搭建步骤:

                  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();
    }
}

SpringCloud集成Python-web服务_第1张图片

SpringCloud集成Python-web服务_第2张图片

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')

 

                         

你可能感兴趣的:(SpringCloud)