eureka实现java远程调用python服务

记录一次 java 远程调用 python 服务的demo
java端使用 openFeign 实现远程调用, python 端使用 fastApi 框架

1. java端

1. eureka服务端

1. 导入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  1. 配置文件
server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  1. 启动类
@EnableEurekaServer
@SpringBootApplication
public class Server {
    public static void main(String[] args) {
        SpringApplication.run(Server.class, args);
    }
}

2. java服务端

  1. 导入依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
  1. 配置文件
spring:
  application:
    name: python-connect
server:
  port: 10000
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    fetch-registry: true
  1. 启动类
    加上两个注解 @EnableEurekaClient``@EnableFeignClients 开启Eureka 客户端 和 OpenFeign。

  2. openfeign接口

@FeignClient(name = "python-app") //python服务名称
public interface FeignServer {

    @GetMapping(value = "/")
    public String getPython();

    @GetMapping("/hello/{name}")
    public String getName(@PathVariable("name") String name);
	//获取图片接口
    @PostMapping("/picture")
    public Response getPicture();
}
  1. controller层
@RestController
public class PythonController {
    @Autowired
    FeignServer feignServer;
	//返回图片的 base64 字符串
    @GetMapping("/base64")
    public String getBase64() {
        byte[] data = null;
        String dataStr = null;
        final Response picture = feignServer.getBase64();
        Response.Body body = picture.body();
        try(InputStream is = body.asInputStream()){       
            data = is.readAllBytes();
        } catch (IOException e) {
            e.printStackTrace();
        }
        dataStr = Base64.encodeBase64String(data);
        return dataStr;
    }
	
    @RequestMapping("/python/{name}")
    public String getName(@PathVariable("name") String name) {
        return feignServer.getName(name);
    }
    //返回图片的输出流
    @GetMapping("/picture")
    public String getPicture(HttpServletResponse response) {
        byte[] bytes = new byte[1024];
        final Response picture = feignServer.getPicture();
        Response.Body body = picture.body();
        try (OutputStream os = response.getOutputStream();
            InputStream is = body.asInputStream()){
            while ((is.read(bytes)) != -1) {
                os.write(bytes);
                os.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }
}

2. python端

import uvicorn
from fastapi import FastAPI
from fastapi.responses import FileResponse
from datetime import datetime
from typing import Optional
from pydantic import BaseModel
import py_eureka_client.eureka_client as eureka_client

server_port = 9090
#配置eureka
eureka_client.init(eureka_server="http://127.0.0.1:8761",
                   app_name="python-app",
                   instance_port=server_port,
                   instance_host="python-host-ip")

app = FastAPI()
@app.get("/hello/{name}")
def say_hello(name: str):
    return {"message": f"Hello {name}"}
    
@app.post("/picture")
def get_picture():
    return FileResponse('/home/wenfengz/Pictures/test.png')
    
#返回base64
@app.get("/base64")
def get_picture():
    with open('/home/wenfengz/Pictures/test.png', mode='rb') as file:
        read = file.read()
        image_base64 = base64.standard_b64encode(read)
    return { "data" : {
        "image": str(image_base64),
        "name": "zs",
        "age": "18"
        }
    }

if __name__ == '__main__':
    eureka_client.get_client()
    uvicorn.run(app, host="0.0.0.0", port=9090)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值