zoukankan      html  css  js  c++  java
  • springCloud 调用Python web 服务(sideCard)(转)

    原文请参考: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(因为SpringCloudJava语言的一款框架)和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.cloudartifact id spring-cloud-netflix-sidecar的依赖。

    • 注解启动Sidecar

    使用@EnableSidecar创建Spring Boot应用程序。此注释包括@EnableCircuitBreaker@EnableDiscoveryClient@EnableZuulProxy

    • 修改配置

    配置Sidecar,应该将sidecar.portsidecar.health-uri添加到application.ymlsidecar.port属性是非jvm应用程序正在侦听的端口。这样,Sidecar可以使用Eureka正确注册该应用。sidecar.health-uri是可以在非jvm应用程序上访问的,可以模拟Spring Boot健康指标。它应该返回一个json文档,如下所示:

    1. {
    2. "status":"UP"
    3. }

    以下是Sidecar应用程序的application.yml示例:

    1. server:
    2. port: 5678
    3. spring:
    4. application:
    5. name: sidecar
    6.  
    7. sidecar:
    8. port: 8000
    9. 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语言也可以调用配置服务器的配置,比如使用如下的urlhttp:// 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>
    View Code

    定义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访问,测试发现如果不在同一台机器上,会报错:连接诶拒绝

    使用:略

  • 相关阅读:
    Educational Codeforces Round 83 --- F. AND Segments
    Educational Codeforces Round 83 --- G. Autocompletion
    SEERC 2019 A.Max or Min
    2019-2020 ICPC Southwestern European Regional Programming Contest(Gym 102501)
    Educational Codeforces Round 78 --- F. Cards
    今天我学习了一门全新的语言
    codeforces 1323D 题解(数学)
    Educational Codeforces Round 80 (Div. 2) 题解 1288A 1288B 1288C 1288D 1288E
    Educational Codeforces Round 81 (Div. 2) 题解 1295A 1295B 1295C 1295D 1295E 1295F
    Codeforces Round #617 (Div. 3) 题解 1296C 1296D 1296E 1296F
  • 原文地址:https://www.cnblogs.com/lshan/p/13594707.html
Copyright © 2011-2022 走看看