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

    使用:略

  • 相关阅读:
    Android悬浮窗拖动
    git提交错误问题如何解决?
    STM32单片机使用注意事项
    C指针说明
    cygwin注意事项
    关于百度地图的使用问题
    Android GIS osmdroid地图使用
    三个能力构建人生护城河
    浪潮之醒
    MingGW Posix VS Win32
  • 原文地址:https://www.cnblogs.com/lshan/p/13594707.html
Copyright © 2011-2022 走看看