综合练习
TrackService gRPC 实验与 REST 对照。
40 分钟
综合练习
动手搭建 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 |