1 - 服务注册
引入依赖
go get github.com/polarismesh/grpc-go-polaris-go@latest
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于 grpc-go-polaris 初始化 polaris sdk。polaris.yaml配置详细
服务注册
// 完成 grpc Server 的创建以及注册 grpc service
srv := grpc.NewServer()
listen, err := net.Listen("tcp", "0.0.0.0:8080")
if err != nil {
log.Fatal(err)
}
pb.RegisterEchoServerServer(srv, &EchoQuickStartService{
actualPort: listen.Addr().(*net.TCPAddr).Port,
})
// 将 使用 polaris.Serve 方法启动 grpc server
if err := polaris.Serve(srv, listen,
polaris.WithServiceName("QuickStartEchoServerGRPC"),
); nil != err {
log.Printf("listen err: %v", err)
}
服务端 Options
WithGRPCServerOptions(opts …grpc.ServerOption)
设置 gRPC-Server 的相关 Option。
WithServerNamespace(namespace string)
设置 grpc 服务注册到北极星的命名空间,默认为 default。
WithServiceName(svcName string)
设置 grpc 服务的名称,可选,不过不设置,则会通过 grpc.Server 的 GetServiceInfo() 获取所有 grpc service 信息,进行服务注册。
WithServerMetadata(metadata map[string]string)
设置服务实例的标签信息。
WithServerHost(host string)
设置服务实例注册的 host 信息,可选,默认将通过和北极星服务端建立一次 TCP 连接获取本机对外 IP
WithServerVersion(version string)
设置服务实例的版本信息。
WithTTL(ttl int) ServerOption
设置服务实例心跳上报的周期,默认 5s
WithToken(token string)
当北极星服务端开启客户端鉴权时,需要设置用户/用户组访问凭据,鉴权文档可参考 权限控制。
WithDelayRegisterEnable(strategy DelayStrategy)
设置延迟注册策略
WithGracefulStopEnable(duration time.Duration)
启用服务实例优雅下线能力,默认开启
WithGracefulStopDisable()
禁用服务实例优雅下线能力
如何基于 grpc-go-polaris 完成一个服务注册的程序
2 - 服务发现
引入依赖
go get github.com/polarismesh/grpc-go-polaris-go@latest
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于 grpc-go-polaris 初始化 polaris sdk。polaris.yaml配置详细
服务发现
// 使用 grpc-go-polaris 提供的 DialContext 即可
conn, err := polaris.DialContext(ctx, "polaris://QuickStartEchoServerGRPC",
polaris.WithGRPCDialOptions(grpc.WithTransportCredentials(insecure.NewCredentials())),
polaris.WithDisableRouter(),
)
客户端 Options
WithGRPCDialOptions(opts …grpc.DialOption)
设置 grpc.DialContext 需要的 grpc.DialOption 参数
WithClientNamespace(namespace string)
设置主调服务所在的命名空间,可选
WithSrcService(srcService string)
设置主调服务的服务名称,可选
WithPolarisConfig(polarisCfg config.Configuration)
通过代码设置 polaris-go 的配置信息
WithDisableRouter()
禁用 polaris 的动态路由能力
WithEnableRouter()
启用 polaris 的动态路由能力
如何基于 grpc-go-polaris 完成一个服务发现的程序
3 - 动态路由
当前支持针对 gRPC 消息的以下内容进行动态路由:
消息类型 | gRPC 消息内容 | 路由规则请求类型 |
---|---|---|
消息头 | metadata | 请求头(HEADER) |
gRPC方法 | method | 路径(PATH) |
引入依赖
go get github.com/polarismesh/grpc-go-polaris@latest
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于 grpc-go-polaris 初始化 polaris sdk。polaris.yaml配置详细
gRPC Client 构建
// 使用 grpc-go-polaris 提供的 DialContext 即可
conn, err := polaris.DialContext(ctx, "polaris://QuickStartEchoServerGRPC",
polaris.WithGRPCDialOptions(grpc.WithTransportCredentials(insecure.NewCredentials())),
polaris.WithEnableRouter(),
)
如何配置动态路由参数
gRPC-Go 中的 PolarisMesh Balancer 扩展点实现,能够根据用户配置的服务路由规则,自动的从当前 RPC 调用上下文以及请求信息中识别出需要参与服务路由的请求标签信息。
假定一个场景:
- 希望 uid 为 user-1 的请求,路由到 env 标签为 dev 的实例上
- 希望 uid 为 user-2 的请求,路由到 env 标签为 pre 的实例上
- 其他则路由到 env 标签为 prod 的实例上,那可以为 gRPC-Go 服务设置三条路由规则。
- 请求匹配规则为 请求头(HEADER):
- 标签来源: RPC 调用的额外标签信息,即 metadata.FromOutgoingContext(balancer.PickInfo.Ctx)
示例代码(gRPC-Go原生使用方式)
func (s *Service) GetUser(uid, value string) {
md := metadata.Pairs("uid", uid)
ctx := metadata.NewOutgoingContext(context.Background(), md)
for i := 0; i < 5; i++ {
time.Sleep(200 * time.Millisecond)
resp, err := s.echoClient.Echo(ctx, &pb.EchoRequest{Value: value})
if err != nil {
logger.Errorf("error: %v\n", err)
}
logger.Infof("response: %v\n", user)
}
}
验证
可根据 grpc-polaris-go example 开展
4 - 负载均衡
引入依赖
go get github.com/polarismesh/grpc-go-polaris@latest
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于初始化 polaris-go SDK。polaris.yaml配置详细
设置默认负载均衡策略
修改 polaris.yaml 文件
#描述:主调端配置
consumer:
...
#描述:负载均衡相关配置
loadbalancer:
#描述:负载均衡类型
#范围:已注册的负载均衡插件名
#默认值:权重随机负载均衡
#支持参数:ringHash(一致性hash环)/maglev(maglev算法一致性hash)/hash(普通一致性hash)
type: weightedRandom
plugin:
#描述:虚拟节点的数量
#类型:int
#默认值:500
#ringHash:
# vnodeCount: 500
#maglev:
# # 初始化表向量区间
# tableSize: 65537
设置请求级别负载均衡策略
ctx := metadata.NewIncomingContext(context.Background(), metadata.MD{})
// 请求时设置本次请求的负载均衡算法
ctx = polaris.RequestScopeLbPolicy(ctx, api.LBPolicyRingHash)
ctx = polaris.RequestScopeLbHashKey(ctx, r.Header.Get("uid"))
resp, err := echoClient.Echo(ctx, &pb.EchoRequest{Value: value})
5 - 访问限流
当前支持针对 gRPC 消息的以下内容进行访问限流:
消息类型 | gRPC 消息内容 | 路由规则请求类型 |
---|---|---|
消息头 | metadata | 请求头(HEADER) |
gRPC方法 | method | 路径(PATH) |
引入依赖
go get github.com/polarismesh/grpc-go-polaris@latest
初始化 polaris.yaml
你需要在项目的根路径下创建一个 polaris.yaml 文件用于 grpc-go-polaris 初始化 polaris sdk。polaris.yaml配置详细
gRPC Server 构建
listen, err := net.Listen("tcp", "0.0.0.0:0")
if err != nil {
log.Fatal(err)
}
listenAddr := listen.Addr().String()
interceptor := polaris.NewRateLimitInterceptor().WithServiceName("RateLimitEchoServerGRPC")
// 注册 polaris 服务限流拦截器
srv := grpc.NewServer(grpc.UnaryInterceptor(interceptor.UnaryInterceptor))
pb.RegisterEchoServerServer(srv, &EchoRateLimitService{})
// 启动服务
if err := polaris.Serve(srv, listen,
polaris.WithServiceName("RateLimitEchoServerGRPC"),
); nil != err {
log.Printf("listen err: %v", err)
}
如何配置访问限流参数
gRPC-Go 中的 PolarisMesh RateLimiter 扩展点实现,能够根据用户配置的限流规则,自动的从当前 RPC 调用上下文以及请求信息中识别出需要参与限流的请求标签信息。
比如对 gRPC-Go 中的 Echo(context.Context, &EchoRequest) 方法,对 Metadata 中 uid 为 user-1 的进行限流,速率为10/s。
- 请求匹配规则为 请求头(HEADER):
- 标签来源: RPC 调用的额外标签信息,即 metadata.FromIncomingContext(context.Context)
验证
可根据 grpc-polaris-go example 开展