动态路由

当前支持针对 gRPC 消息的以下内容进行动态路由:

消息类型 gRPC 消息内容 路由规则请求类型
消息头 metadata 请求头(HEADER)
gRPC方法 method 路径(PATH)

引入依赖

<dependency>
    <groupId>com.tencent.polaris</groupId>
    <artifactId>grpc-java-polaris</artifactId>
    <version>${grpc-java-polaris.version}</version>
</dependency>

初始化 polaris.yaml

你需要在项目的根路径下创建一个 polaris.yaml 文件用于 grpc-java-polaris 初始化 polaris sdk。polaris.yaml配置详细

gRPC Client 构建

// 使用 grpc-java-polaris 提供的 PolarisManagedChannelBuilder 即可
ManagedChannel channel = PolarisManagedChannelBuilder.forTarget(target).usePlaintext().build();

如何配置动态路由参数

gRPC-Java 中的 PolarisMesh Balancer 扩展点实现,能够根据用户配置的服务路由规则,自动的从当前 RPC 调用上下文以及请求信息中识别出需要参与服务路由的请求标签信息。

假定一个场景:

  • 希望 uid 为 user-1 的请求,路由到 env 标签为 dev 的实例上
  • 希望 uid 为 user-2 的请求,路由到 env 标签为 pre 的实例上
  • 其他则路由到 env 标签为 prod 的实例上,那可以为 gRPC-Java 服务设置三条路由规则。

  • 请求匹配规则为 请求头(HEADER):
    • 标签来源: RPC 调用的额外标签信息,即 PickSubchannelArgs.getHeaders()

示例代码(gRPC-Java原生使用方式)

Metadata metadata = new Metadata();
headers.forEach((s, val) -> {
    if (StringUtils.equals("uid", s.toLowerCase())) {
        metadata.put(Key.of(s.toLowerCase(), Metadata.ASCII_STRING_MARSHALLER), val.get(0));
    }
})

HelloGrpc.HelloBlockingStub helloBlockingStub = HelloGrpc.newBlockingStub(channel);
helloBlockingStub = helloBlockingStub.withInterceptors(MetadataUtils.newAttachHeadersInterceptor(metadata));
HelloPolaris.request request = HelloPolaris.request.newBuilder().setMsg(value).build();
HelloPolaris.response response = helloBlockingStub.sayHello(request);

验证

可根据 grpc-java-polaris example 开展