动态路由

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

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

引入依赖

  1. go get github.com/polarismesh/grpc-go-polaris@latest

初始化 polaris.yaml

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

gRPC Client 构建

  1. // 使用 grpc-go-polaris 提供的 DialContext 即可
  2. conn, err := polaris.DialContext(ctx, "polaris://QuickStartEchoServerGRPC",
  3. polaris.WithGRPCDialOptions(grpc.WithTransportCredentials(insecure.NewCredentials())),
  4. polaris.WithEnableRouter(),
  5. )

如何配置动态路由参数

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

假定一个场景:

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

    动态路由 - 图1 动态路由 - 图2 动态路由 - 图3

  • 请求匹配规则为 请求头(HEADER):

    • 标签来源: RPC 调用的额外标签信息,即 metadata.FromOutgoingContext(balancer.PickInfo.Ctx)

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

  1. func (s *Service) GetUser(uid, value string) {
  2. md := metadata.Pairs("uid", uid)
  3. ctx := metadata.NewOutgoingContext(context.Background(), md)
  4. for i := 0; i < 5; i++ {
  5. time.Sleep(200 * time.Millisecond)
  6. resp, err := s.echoClient.Echo(ctx, &pb.EchoRequest{Value: value})
  7. if err != nil {
  8. logger.Errorf("error: %v\n", err)
  9. }
  10. logger.Infof("response: %v\n", user)
  11. }
  12. }

验证

可根据 grpc-polaris-go example 开展