Java 服务端
BindableService、ServerBuilder。
40 分钟
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() |