Java 客户端
ManagedChannel、stub 调用。
35 分钟
Java 客户端
gRPC Client 通过 ManagedChannel 连接服务端,用 stub 发起 RPC。Blocking stub 适合 lab 脚本;异步 stub 适合高并发微服务。
学习目标
- 创建
ManagedChannel与TrackServiceBlockingStub - 调用
GetTrack并处理StatusRuntimeException - 对比同一数据的 REST
curl与 gRPC 调用路径
核心内容
Blocking 客户端
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 9090)
.usePlaintext() // lab only;生产见 grpc-security
.build();
TrackServiceGrpc.TrackServiceBlockingStub stub =
TrackServiceGrpc.newBlockingStub(channel);
try {
GetTrackResponse resp = stub.getTrack(
GetTrackRequest.newBuilder().setSlug("grpc-essentials").build());
System.out.println(resp.getTrack().getTitle());
} catch (StatusRuntimeException e) {
System.err.println(e.getStatus().getCode() + ": " + e.getStatus().getDescription());
} finally {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
注意:Next.js 主站 nextjs-essentials 不会直接调 gRPC——浏览器走 REST /tracks 或经 Gateway 转 REST。
Stub 类型
| Stub | 场景 |
|---|---|
BlockingStub | 同步、脚本、单元测试 |
Stub(async) | StreamObserver 回调 |
FutureStub | ListenableFuture 集成 |
Deadline 示例
stub.withDeadlineAfter(2, TimeUnit.SECONDS).getTrack(request);
超时返回 DEADLINE_EXCEEDED(grpc-error)。REST 侧等价 RestTemplate/WebClient timeout 配置(spring-boot-essentials)。
微服务间调用
服务 B 作为 gRPC Client 调服务 A 的 TrackService——典型 spring-cloud-essentials + 负载均衡场景。对外 BFF 仍暴露 REST 或 graphql-essentials 聚合层,不把 gRPC 端口暴露给公网。