当前位置: 首页 > news >正文

gRPC + Spring Boot实战:微服务高性能通信从入门到落地

一、gRPC简介

gRPC是Google开源的高性能RPC框架,基于HTTP/2和Protocol Buffers,支持双向流、多语言代码生成。相比REST JSON,gRPC序列化体积小3-5倍,延迟降低30%以上,是微服务间通信的首选方案。

二、项目结构

grpc-demo/
├── grpc-api/          # Proto定义 + 生成代码
│   └── src/main/proto/
│       └── user.proto
├── grpc-server/       # 服务端
└── grpc-client/       # 客户端

三、Proto文件定义

syntax = "proto3";
package com.example.grpc;option java_package = "com.example.grpc.user";
option java_outer_classname = "UserProto";service UserService {rpc GetUser (GetUserRequest) returns (GetUserResponse);rpc ListUsers (ListUsersRequest) returns (stream GetUserResponse);rpc CreateUser (stream CreateUserRequest) returns (CreateUserBatchResponse);rpc Chat (stream ChatMessage) returns (stream ChatMessage);
}message GetUserRequest {int32 id = 1;
}message GetUserResponse {int32 id = 1;string name = 2;string email = 3;int32 age = 4;
}message ListUsersRequest {int32 page = 1;int32 size = 2;
}message CreateUserRequest {string name = 1;string email = 2;int32 age = 3;
}message CreateUserBatchResponse {int32 count = 1;repeated GetUserResponse users = 2;
}message ChatMessage {string from = 1;string message = 2;
}

四、Maven依赖配置

<dependencies><dependency><groupId>net.devh</groupId><artifactId>grpc-spring-boot-starter</artifactId><version>3.1.0.RELEASE</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>1.62.2</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>1.62.2</version></dependency>
</dependencies><build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.7.1</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><protocArtifact>com.google.protobuf:protoc:3.25.3:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.62.2:exe:${os.detected.classifier}</pluginArtifact></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins>
</build>

五、服务端实现

@GrpcService
public class UserGrpcService extends UserServiceGrpc.UserServiceImplBase {@Autowiredprivate UserRepository userRepository;@Overridepublic void getUser(GetUserRequest request, StreamObserver<GetUserResponse> responseObserver) {User user = userRepository.findById(request.getId()).orElseThrow(() -> new StatusRuntimeException(Status.NOT_FOUND.withDescription("User not found")));responseObserver.onNext(toResponse(user));responseObserver.onCompleted();}@Overridepublic void listUsers(ListUsersRequest request,StreamObserver<GetUserResponse> responseObserver) {List<User> users = userRepository.findAll(PageRequest.of(request.getPage(), request.getSize())).getContent();for (User user : users) {responseObserver.onNext(toResponse(user));}responseObserver.onCompleted();}@Overridepublic StreamObserver<CreateUserRequest> createUser(StreamObserver<CreateUserBatchResponse> responseObserver) {return new StreamObserver<CreateUserRequest>() {List<User> created = new ArrayList<>();public void onNext(CreateUserRequest req) {User user = new User(req.getName(), req.getEmail(), req.getAge());created.add(userRepository.save(user));}public void onError(Throwable t) { }public void onCompleted() {CreateUserBatchResponse resp = CreateUserBatchResponse.newBuilder().setCount(created.size()).addAllUsers(created.stream().map(u -> toResponse(u)).collect(Collectors.toList())).build();responseObserver.onNext(resp);responseObserver.onCompleted();}};}private GetUserResponse toResponse(User user) {return GetUserResponse.newBuilder().setId(user.getId()).setName(user.getName()).setEmail(user.getEmail()).setAge(user.getAge()).build();}
}

六、客户端调用

@Service
public class UserGrpcClient {@GrpcClient("user-service")private UserServiceGrpc.UserServiceBlockingStub blockingStub;@GrpcClient("user-service")private UserServiceGrpc.UserServiceStub asyncStub;public GetUserResponse getUser(int id) {return blockingStub.getUser(GetUserRequest.newBuilder().setId(id).build());}public List<GetUserResponse> listUsers(int page, int size) {List<GetUserResponse> result = new ArrayList<>();Iterator<GetUserResponse> it = blockingStub.listUsers(ListUsersRequest.newBuilder().setPage(page).setSize(size).build());while (it.hasNext()) { result.add(it.next()); }return result;}public void createUserBatch(List<CreateUserRequest> requests) {StreamObserver<CreateUserBatchResponse> observer = new StreamObserver<CreateUserBatchResponse>() {public void onNext(CreateUserBatchResponse resp) {System.out.println("Created " + resp.getCount() + " users");}public void onError(Throwable t) { t.printStackTrace(); }public void onCompleted() { System.out.println("Batch done"); }};StreamObserver<CreateUserRequest> requestObserver = asyncStub.createUser(observer);for (CreateUserRequest req : requests) { requestObserver.onNext(req); }requestObserver.onCompleted();}
}

七、客户端配置

# application.yml
grpc:client:user-service:address: static://localhost:9090negotiationType: plaintextenableKeepAlive: truekeepAliveTime: 30skeepAliveTimeout: 10sserver:port: 8081

八、REST网关集成

@RestController
@RequestMapping("/api/users")
public class UserRestController {@Autowiredprivate UserGrpcClient grpcClient;@GetMapping("/{id}")public Map<String, Object> getUser(@PathVariable int id) {GetUserResponse resp = grpcClient.getUser(id);return Map.of("id", resp.getId(), "name", resp.getName(),"email", resp.getEmail(), "age", resp.getAge());}@GetMappingpublic List<Map<String, Object>> listUsers(@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "10") int size) {return grpcClient.listUsers(page, size).stream().map(r -> Map.of("id", r.getId(), "name", r.getName(),"email", r.getEmail(), "age", r.getAge())).collect(Collectors.toList());}
}

九、性能对比

指标              REST/JSON      gRPC/Protobuf
-----------------------------------------------
序列化体积        ~2.1KB         ~0.4KB
平均延迟          45ms           12ms
QPS (单连接)      ~3,200         ~9,500
CPU占用           高             低
代码生成          无             自动
流式支持          SSE(单向)      双向流

十、最佳实践

  1. Proto版本管理:使用buf工具管理Proto文件和Breaking Change检测
  2. 错误处理:用gRPC Status Code替代业务异常,保持语义一致
  3. 超时设置:Deadline传播,避免级联超时
  4. 负载均衡:结合Nacos/Consul实现服务发现+客户端负载均衡
  5. 拦截器:用gRPC Interceptor实现认证、日志、链路追踪

十一、总结

gRPC + Spring Boot是微服务高性能通信的最佳实践。通过grpc-spring-boot-starter,Spring Boot开发者可以像写普通Service一样实现gRPC服务。四种通信模式(Unary、Server Stream、Client Stream、Bidirectional Stream)覆盖了几乎所有微服务交互场景。

http://www.jsqmd.com/news/626371/

相关文章:

  • LVGL_CYD:CYD开发板的LVGL开箱即用图形驱动库
  • 【2026奇点大会AI游戏开发核心洞察】:5大原生架构范式、3个已落地商业案例与2027技术演进路线图
  • 分布式锁实现方案
  • 通俗易懂深入浅出OSPF-LSA类型讲解烙
  • 【GUI-Agent】阶跃星辰 GUI-MCP 解读---()---HITL(Human In The Loop)啦
  • 2026年EDI许可证申请服务商梯队盘点与选型指南:一站式信息网络安全等级保护等保测评复测/互联网信息服务业务在线数据处理与交易处理业务ICP/选择指南 - 优质品牌商家
  • Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语劣
  • 不满意Oh My Zsh启动卡顿,来试试Starship吧坊
  • 【笔面试算法学习专栏】正则表达式匹配:10.正则表达式匹配
  • Dreamweaver实战:从零构建响应式登录界面
  • 告别“降智”模型:手把手教你用ZenMux的HLE测试和智能路由,为Cursor和Claude Code配置原版大脑
  • 体态调整选购指南:避坑科学调,适配全人群
  • 【生成模型】【ComfyUI(四)】WebSocket实时监控与进度条优化ComfyUI批量处理
  • Golang Web 前后端分离企业级后台开发项目计划书V2.0模型代码
  • KWP2000协议库:摩托车ECU诊断的嵌入式通信实现
  • ADS1220_WE驱动库:工业级高精度ADC嵌入式实践指南
  • 龙芯k - 走马观碑组MPU驱动移植笔
  • 2026南京实木板材全屋定制:南京全屋定制哪家好/南京全屋定制展厅地址/南京全屋定制工厂排名/南京全屋定制工厂直营/选择指南 - 优质品牌商家
  • GPT-4o实战指南:如何用它解决内容创作与代码开发的真实痛点
  • 亲测!先进SOP防错漏实践分享
  • Kinetis MCU上的轻量级RGB LED控制库设计
  • Java面试一定会遇到的200个面试题(程序员必备)
  • 2026年合肥市蜀山区废铜回收:合肥市蜀山区废铝回收/合肥市蜀山区电缆回收/合肥市蜀山区铝合金回收/合肥市蜀山区不锈钢回收/选择指南 - 优质品牌商家
  • 1970~2024年各省市区县、乡镇CO2排放量面板数据栅格数据(EDGAR v2025)
  • EmDash挑战WordPress,变革将至?
  • 高光谱成像基础(完)光谱融合(Spectral Fusion)乩
  • B站视频下载神器:一键解锁4K大会员画质的Python解决方案
  • Mysql 11: 存储过程全解——从创建到使用
  • Langchain .. 学习 --- LCEL和Runnable挪
  • Linux I/O 演进史:从管道到零拷贝,一篇串起个服务端核心原语百