Day 23:Java与Agent集成 - gRPC调用Java服务

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编程助手写代码,感觉就像有个助手在旁边帮你干活,还挺爽的。


学习目标

  1. 理解Java服务封装成gRPC
  2. 掌握gRPC客户端调用Java服务
  3. 理解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 + DTOpublicinterfaceCalculatorService{AddResponseadd(AddRequestrequest);}

gRPC架构

Java Service

Python Agent

Protobuf/HTTP2

Protobuf/HTTP2

gRPC Client

Stub

Stub

gRPC Server

核心组件

  • 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

对比表格

对比项RESTgRPC
数据格式JSON(文本)Protobuf(二进制)
传输协议HTTP/1.1HTTP/2
性能50-100ms/次0.4-2ms/次
类型安全强(Proto严格定义)
代码生成手动写HTTP调用自动生成客户端/服务端
跨语言一般原生支持(任意语言互调)

gRPC vs REST 对比

gRPC

REST

慢100倍

HTTP/1.1

JSON文本

手动序列化/反序列化

短连接

性能: 50-100ms/次

HTTP/2

Protobuf二进制

自动序列化/反序列化

长连接+多路复用

性能: 0.4-2ms/次

核心差异

  • 数据格式: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调用时序

gRPC ServerStubChannelgRPC ClientgRPC ServerStubChannelgRPC Client全程耗时: 0.4-2ms创建连接 localhost:50051创建代理对象stub.Add(request)发送请求 (Protobuf)HTTP/2 请求执行计算返回响应 (Protobuf)接收响应返回结果

1. gRPC服务端

classCalculatorServiceServicer(calculator_pb2_grpc.CalculatorServiceServicer):defAdd(self,request,context):result=request.left+request.rightreturncalculator_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架构中的价值。继续保持!