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 + DTO
public interface CalculatorService {
    AddResponse add(AddRequest request);
}

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

对比表格

对比项 REST gRPC
数据格式 JSON(文本) Protobuf(二进制)
传输协议 HTTP/1.1 HTTP/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 Server Stub Channel gRPC Client gRPC Server Stub Channel gRPC Client 全程耗时: 0.4-2ms 创建连接 localhost:50051 创建代理对象 stub.Add(request) 发送请求 (Protobuf) HTTP/2 请求 执行计算 返回响应 (Protobuf) 接收响应 返回结果

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架构中的价值。继续保持!

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐