大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
综合练习
动手搭建 TrackService gRPC lab,与现有 REST /tracks 并存对照。巩固 .proto、代码生成、Spring gRPC、客户端 smoke test;不替换 CodeRoadMap 生产主路径。
学习目标
- 完成从
track.proto到@GrpcService的闭环 - 用 blocking stub 验证与 REST 数据一致
- 撰写 README 说明「为何全站仍 REST」
核心内容
任务 A:契约
src/main/proto/track.proto(见 grpc-proto):
service TrackService {
rpc GetTrack(GetTrackRequest) returns (GetTrackResponse);
rpc ListTracks(ListTracksRequest) returns (ListTracksResponse);
}
mvn compile 生成 Java stub(grpc-codegen)。
任务 B:服务端(lab-grpc profile)
@Profile("lab-grpc")
@GrpcService
public class TrackGrpcService extends TrackServiceGrpc.TrackServiceImplBase {
@Override
public void listTracks(ListTracksRequest req, StreamObserver<ListTracksResponse> resp) {
var tracks = trackService.findAll().stream().map(this::toProto).toList();
resp.onNext(ListTracksResponse.newBuilder().addAllTracks(tracks).build());
resp.onCompleted();
}
}
启动:spring.profiles.active=lab-grpc,gRPC 9090 + REST 8080。
任务 C:客户端 smoke test
@Test
@ActiveProfiles("lab-grpc")
void listTracksMatchesRest() {
var grpcCount = stub.listTracks(ListTracksRequest.getDefaultInstance())
.getTracksCount();
var restCount = restTemplate.getForObject("/tracks", List.class).size();
assertThat(grpcCount).isEqualTo(restCount);
}
任务 D:对照文档(验收)
| 检查项 | REST | gRPC lab |
|---|---|---|
| 列表条数 | GET /tracks | ListTracks |
| 单条查询 | GET /tracks/{slug} | GetTrack |
| 生产 profile | ✅ 启用 | ❌ 关闭 |
| Next.js 主站 | ✅ fetch /tracks | ❌ 不接入 |
可选:与 graphql-essentials lab 一样,页脚注明实验性质。微服务拆分预习 spring-cloud-essentials。
练习
- 完成 A+B+C 并通过测试
- 写 5 行对比:同一
Track的 REST JSON vs Protobuf 字段 - 在
/tracks/grpc-essentials通读本 track 12 课
小结
gRPC 技能 = 读懂 + lab 动手 + 理性选型;CodeRoadMap 权威数据仍经 REST /tracks 与 MySQL 交付。 本 track 完结;Spring 基础见 spring-boot-essentials,API 选型对照 gql-rest。