Day 23:Java与Agent集成 - gRPC调用Java服务
·
Day 23:Java与Agent集成 - gRPC调用Java服务
🤖 系列:Java工程师转AI Agent 3个月学习计划
👤 作者:宸丶一 | 28岁Java程序员
🎯 今日目标: Java服务封装成gRPC,Python Agent调用Java服务
💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。
前言
说实话,之前一直没搞懂gRPC和REST到底有啥区别。这次自己写了个计算器服务,跑起来之后才明白:gRPC真的快太多了。
最近一直体验小米的MiMo Code,用AI编程助手写代码,感觉就像有个助手在旁边帮你干活,还挺爽的。
学习目标
- 理解Java服务封装成gRPC
- 掌握gRPC客户端调用Java服务
- 理解gRPC在Agent架构中的价值
一、gRPC核心概念
Proto文件 = Interface + DTO
// Proto文件(像Java的Interface + DTO)
service CalculatorService {
rpc Add (AddRequest) returns (AddResponse);
}
message AddRequest {
double left = 1;
double right = 2;
}
message AddResponse {
double result = 1;
string message = 2;
}
类比Java:
// Java Interface + DTO
public interface CalculatorService {
AddResponse add(AddRequest request);
}
gRPC架构
核心组件:
- Proto文件:定义接口和数据格式(Interface + DTO)
- gRPC Server:提供服务实现(Spring Boot服务)
- gRPC Client:调用服务(RestTemplate/OpenFeign)
- Stub:自动生成的代理对象
- Protobuf:二进制序列化,更快更小
- HTTP/2:多路复用,更高效
public class AddRequest {
private double left;
private double right;
}
public class AddResponse {
private double result;
private String message;
}
二、gRPC vs REST
对比表格
| 对比项 | REST | gRPC |
|---|---|---|
| 数据格式 | JSON(文本) | Protobuf(二进制) |
| 传输协议 | HTTP/1.1 | HTTP/2 |
| 性能 | 50-100ms/次 | 0.4-2ms/次 |
| 类型安全 | 弱 | 强(Proto严格定义) |
| 代码生成 | 手动写HTTP调用 | 自动生成客户端/服务端 |
| 跨语言 | 一般 | 原生支持(任意语言互调) |
gRPC vs REST 对比
核心差异:
- 数据格式:JSON(文本) vs Protobuf(二进制)
- 传输协议:HTTP/1.1 vs HTTP/2
- 性能:50-100ms vs 0.4-2ms
- 类型安全:弱 vs 强
性能实测
REST API (JSON): 50-100ms/次
gRPC (Protobuf): 0.4-2ms/次
gRPC比REST快 100-200 倍(本地)/ 3-10 倍(网络)
三、实战
gRPC调用时序
1. gRPC服务端
class CalculatorServiceServicer(calculator_pb2_grpc.CalculatorServiceServicer):
def Add(self, request, context):
result = request.left + request.right
return calculator_pb2.AddResponse(
result=result,
message=f'{request.left} + {request.right} = {result}'
)
2. gRPC客户端
channel = grpc.insecure_channel('localhost:50051')
stub = calculator_pb2_grpc.CalculatorServiceStub(channel)
request = calculator_pb2.AddRequest(left=10, right=5)
response = stub.Add(request)
print(f'✅ {response.message}')
3. 运行结果
=== gRPC客户端调用Java服务 ===
1. 加法:10 + 5 =
✅ 10.0 + 5.0 = 15.0
2. 减法:10 - 5 =
✅ 10.0 - 5.0 = 5.0
3. 乘法:10 × 5 =
✅ 10.0 × 5.0 = 50.0
4. 除法:10 ÷ 5 =
✅ 10.0 ÷ 5.0 = 2.0
5. 除法(除数为0):10 ÷ 0 =
❌ 除法错误:除数不能为0
🎉 所有调用完成!
四、今日收获
知识层面
- 理解了gRPC的核心概念
- 掌握了gRPC客户端调用
- 理解了gRPC在Agent架构中的价值
技能层面
- 能定义Proto文件
- 能实现gRPC服务端和客户端
- 能理解gRPC和REST的区别
思维层面
- 学会了用Java类比理解gRPC
- 理解了"Proto文件 = Interface + DTO"
- 理解了"Stub = Proxy对象"
五、思考题答案
1. gRPC和REST的核心区别?
答案:
- gRPC用二进制Protobuf,REST用文本JSON
- gRPC用HTTP/2,REST用HTTP/1.1
- gRPC类型安全,REST弱类型
2. 为什么gRPC比REST快?
答案:
- Protobuf二进制更小(小3-5倍)
- HTTP/2多路复用(不用排队)
- 类型安全(不需要反序列化JSON)
3. Proto文件的作用?
答案:
- Proto文件 = Interface + DTO
- 自动生成客户端和服务端代码
- 跨语言支持(任意语言互调)
4. 什么场景用gRPC,什么场景用REST?
答案:
- gRPC:内部服务调用、高性能场景、跨语言
- REST:对外API、前端调用、简单场景
5. Agent调用Java服务为什么推荐gRPC?
答案:
- Python Agent调Java服务
- gRPC更快(0.42ms vs 50ms)
- gRPC类型安全(不会传错参数)
- gRPC跨语言(Python调Java)
六、明日计划
明天继续深入分析Provider目录的具体实现!
📝 小小腾老师的评分
维度 得分 评价 gRPC掌握程度 ⭐⭐⭐⭐ 能独立实现,但HTTP/2原理还需要深入 代码实践 ⭐⭐⭐⭐⭐ 代码清晰,注释详细 思考题 ⭐⭐⭐⭐⭐ 答案准确,理解到位 总分:92.5分(优秀)
老师说:今天表现很棒!理解了gRPC的核心概念,掌握了gRPC客户端调用,理解了gRPC在Agent架构中的价值。继续保持!
更多推荐



所有评论(0)