CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
gRPC 入门/课时/Java 服务端
RawBlame
课时目录12 节

gRPC 入门

  1. 01gRPC 是什么
  2. 02Protocol Buffers
  3. 03代码生成
  4. 04Java 服务端
  5. 05Java 客户端
  6. 06流式 RPC
  7. 07Spring gRPC 集成
  8. 08状态与错误
  9. 09gRPC-Gateway
  10. 10gRPC vs REST
  11. 11TLS 与安全
  12. 12综合练习

Java 服务端

BindableService、ServerBuilder。

40 分钟

Java 服务端

gRPC Server 监听端口,将 RPC 分派到你继承的 *ImplBase。在 lab 中复用 spring-boot-essentials 的 TrackService,与 REST 共享业务逻辑。

学习目标

  • 用 ServerBuilder 或 Spring gRPC Starter 注册 BindableService
  • 实现 GetTrack、ListTracks Unary RPC
  • 理解 gRPC 端口(如 9090)与 REST 8080 并存

核心内容

手写 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 响应模式

  1. onNext 一次(Unary)或多次(streaming)
  2. onCompleted 结束
  3. 错误用 onError(Status...)(见 grpc-error)

与 REST Controller 对照

RESTgRPC
@GetMapping("/tracks/{slug}")GetTrack(GetTrackRequest)
ResponseEntity.notFound()
Status.NOT_FOUND
JSON TrackDtoTrack protobuf message

数据源同一 MySQL + JPA;差异只在 传输层。微服务拆分后可用 spring-cloud-essentials 注册 gRPC 实例。

练习

  • 实现 ListTracks,返回与 GET /tracks 相同条数
  • 用 grpcurl 或下一课客户端调用 localhost:9090
  • 确认默认 profile 下 无 gRPC 端口监听

小结

服务端 = ImplBase + 复用 Service 层 + 独立端口。 下一课 ManagedChannel 与 stub 客户端调用。

加载本节练习…
← 上一课代码生成下一课 →Java 客户端