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>
- 配置文件
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 启动类
@EnableEurekaServer
@SpringBootApplication
public class Server {
public static void main(String[] args) {
SpringApplication.run(Server.class, args);
}
}
2. java服务端
- 导入依赖
<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>
- 配置文件
spring:
application:
name: python-connect
server:
port: 10000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
fetch-registry: true
-
启动类
加上两个注解@EnableEurekaClient``@EnableFeignClients
开启Eureka 客户端 和 OpenFeign。 -
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();
}
- 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)