大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
Java 服务端
gRPC Server 监听端口,将 RPC 分派到你继承的 *ImplBase。在 lab 中复用 spring-boot-essentials 的 TrackService,与 REST 共享业务逻辑。
学习目标
- 用
ServerBuilder或 Spring gRPC Starter 注册BindableService - 实现
GetTrack、ListTracksUnary RPC - 理解 gRPC 端口(如
9090)与 REST8080并存
核心内容
手写 Server(概念)
public class TrackGrpcService extends TrackServiceGrpc.TrackServiceImplBase {
private final TrackService trackService;
public TrackGrpcService(TrackService trackService) {
this.trackService = trackService;
}
@Override
public void getTrack(GetTrackRequest req, StreamObserver<GetTrackResponse> resp) {
trackService.findBySlug(req.getSlug())
.ifPresentOrElse(
entity -> resp.onNext(GetTrackResponse.newBuilder()
.setTrack(toProto(entity)).build()),
() -> resp.onError(Status.NOT_FOUND
.withDescription("track: " + req.getSlug()).asRuntimeException())
);
resp.onCompleted();
}
private Track toProto(com.coderoadmap.domain.Track e) {
return Track.newBuilder()
.setSlug(e.getSlug())
.setTitle(e.getTitle())
.build();
}
}
Server server = ServerBuilder.forPort(9090)
.addService(new TrackGrpcService(trackService))
.build()
.start();
生产主站 仍由 @RestController 提供 /tracks;gRPC 仅 lab-grpc profile 启动。
Unary 响应模式
onNext一次(Unary)或多次(streaming)onCompleted结束- 错误用
onError(Status...)(见 grpc-error)
与 REST Controller 对照
| REST | gRPC |
|---|---|
@GetMapping("/tracks/{slug}") | GetTrack(GetTrackRequest) |
ResponseEntity.notFound() | Status.NOT_FOUND |
JSON TrackDto | Track protobuf message |
数据源同一 MySQL + JPA;差异只在 传输层。微服务拆分后可用 spring-cloud-essentials 注册 gRPC 实例。
练习
- 实现
ListTracks,返回与GET /tracks相同条数 - 用
grpcurl或下一课客户端调用localhost:9090 - 确认默认 profile 下 无 gRPC 端口监听
小结
服务端 = ImplBase + 复用 Service 层 + 独立端口。 下一课 ManagedChannel 与 stub 客户端调用。