导语
PolarisMesh 是腾讯开源的百万级服务发现和治理中心,积累了腾讯从虚拟机到容器时代的分布式服务治理经验。作为分布式和微服务架构中的核心组件,PolarisMesh 提供服务寻址、流量调度、故障容错和访问控制等一系列能力,在K8s 和虚拟机环境中可以无差别使用,支持主流的开发模式,兼容grpc、spring cloud和servicemesh等开源生态,帮助用户快速构建扩展性强、可用性高的业务架构,实现从传统架构到云原生架构的转型。
作者简介
单家骏
腾讯云高级研发工程师
腾讯北极星(PolarisMesh)开源项目、弹性微服务引擎TSE核心研发,10+年从业经验,从事云计算及中间件 7 年有余。热爱开源、崇尚技术,希望能够使用技术使软件的应用变得简单、高效和美好。
全面拥抱 Go 社区
PolarisMesh以服务注册中心为基础,提供了服务注册发现,健康检查等能力;同时扩展了服务治理控制面,支持了流量调度(动态路由、负载均衡)、熔断降级、访问控制(限流)等功能。
在客户端接入上,PolarisMesh提供了多语言Proxyless(Go,Java,C++)以及Sidecar(envoy,Java agent)的接入方式,供不同形态的应用进行接入。同时,PolarisMesh也提供了生态组件,以提升已使用了生态框架的应用的接入效率,下文主要介绍的是Go语言相关的生态组件(gRPC-Go)的使用及实现。
什么是gRPC-Go
在Go语言社区,发展最成熟,使用最广泛的RPC框架就是gRPC-Go(https://github.com/grpc/grpc-go)。
gRPC是一个高性能的二进制RPC框架,通过统一定义的RPC服务描述,配合多语言的SDK,可以轻松实现跨语言的RPC调用。
gRPC-Go是gRPC框架的Go语言的实现,核心层提供在RPC调用过程中的寻址,消息编解码,网络收发、连接管理,故障重试等功能,并且可以通过插件的方式,扩展服务发现、负载均衡、鉴权以及链路跟踪等服务治理的高级能力:
然而,假如将gRPC作为一个服务框架使用的话,以当前的能力,部分服务治理相关的场景还是满足不了。比如:
-
就近路由场景:用户希望应用可以进行就近访问,以降低链路时延,同时在区域故障的时候,可以进行跨区的容灾切换
-
故障熔断场景 : 在节点出现down机时,能对故障节点进行及时剔除以避免雪崩效应
-
优雅下线场景 : 为了保服务调用成功率不受节点裁撤影响,节点在裁撤前,需要先进行流量的剔除,再进行裁撤下线
-
流量限制场景 : 在应用进行营销活动时,为了保障活动的进场流量在预估范围之内,需要将异常流量通过全局方式进行限制。
为解决上述这些服务治理相关的场景诉求,需要将PolarisMesh的能力与gRPC进行整合,是的gRPC能真正成为一个全功能的服务框架。
PolarisMesh对接gRPC-Go
1. 实现方式
PolarisMesh通过插件扩展的方式,将go语言客户端(polaris-go)与gRPC-Go进行整合,整合后的整体架构如下图所示:
-
通过扩展resolver插件,提供基于PolarisMesh进行服务发现的能力
-
通过扩展balancer插件,提供动态路由和故障熔断的能力
-
通过扩展serverInterceptor插件,在被调方提供服务注册、健康检查、优雅下线的能力。
扩展后gRPC-Go服务调用和核心流程如下:
-
主调方,蓝色为gRPC核心流程,绿色为PolarisMesh扩展的流程。
-
被调方,蓝色为gRPC核心流程,绿色为PolarisMesh扩展的流程。
2. 如何使用
(1)主调方使用方式
需要指定"polaris://EchoServerGRPC/"以明确使用PolarisMesh进行服务发现
import (
"google.golang.org/grpc"
polaris "github.com/polarismesh/grpc-go-polaris"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
conn, err := grpc.DialContext(ctx, "polaris://EchoServerGRPC/", grpc.WithInsecure(),
grpc.WithDefaultServiceConfig(polaris.LoadBalanceConfig))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
//使用conn正常进行gRPC客户端方法调用
echoClient := pb.NewEchoServerClient(conn)
echoClient.Echo(ctx, &pb.EchoRequest{Value: value})
(2)被调方使用方式
需要使用polaris.NewServer以明确使用PolarisMesh作为服务注册中心
import (
"google.golang.org/grpc"
polaris "github.com/polarismesh/grpc-go-polaris"
)
srv := grpc.NewServer()
pb.RegisterEchoServerServer(srv, &EchoService{})
address := fmt.Sprintf("0.0.0.0:%d", listenPort)
listen, err := net.Listen("tcp", address)
if err != nil {
log.Fatalf("Failed to addr %s: %v", address, err)
}
// 执行北极星的注册命令
pSrv, err := polaris.Register(srv, listen, polaris.WithServerApplication("EchoServerGRPC"))
if nil != err {
log.Fatal(err)
}
go func() {
c := make(chan os.Signal)
signal.Notify(c)
s := <-c
log.Printf("receive quit signal: %v", s)
// 执行北极星的反注册命令
pSrv.Deregister()
srv.GracefulStop()
}()
err = srv.Serve(listen)
if nil != err {
log.Printf("listen err: %v", err)
}
(3)使用样例
快速入门样例请参考:
https://github.com/polarismesh/grpc-go-polaris/tree/main/examples/quickstart
PolarisMesh对接其他开源框架
除了gRPC-Go以外,PolarisMesh还对接了其他的开源框架,助力这些框架能获取到全功能的服务治理能力,以下为已完成对接的框架以及示例:
-
grpc-go:
https://github.com/polarismesh/grpc-go-polaris -
dubbo-go:
https://github.com/apache/dubbo-go/tree/master/registry/polaris -
go-zero:
https://github.com/zeromicro/zero-contrib/tree/main/zrpc/registry/polaris -
GoFrame:
https://github.com/gogf/polaris -
grpc-java-polaris:
https://github.com/polarismesh/grpc-java-polaris -
spring-cloud-tencent:
https://github.com/Tencent/spring-cloud-tencent
本月社区概况
Feature:
【polaris-php】已支持 PHP-7.x 版本
【grpc-java-polaris】已完成grpc-java集成北极星的服务注册、发现能力
【polaris-lua】支持 lua 接入北极星
【polaris】XSDServer支持下发熔断配置
【polaris】新增服务实例变更事件插件,默认以日志文件形式输出
Bugfix:
【polaris】修复使用boltdb插件时的脏数据问题
【polaris】修复namespace删除无法清理cache导致的内存泄漏问题
【polaris】修复容器环境下,GOMAXPROCS不正确的问题
【polaris-java】修复server链接切换不生效导致实例被下线问题
写在最后
后续PolarisMesh也会在社区建设的过程中,进一步拥抱对接业界主流的开发框架,对接的明细以及计划在该issue上会持续进行更新:
https://github.com/polarismesh/polaris/issues/163
同时也欢迎大家一起参与文档的建设,或者在社区中分享使用北极星的感受以及实践经验,文档建设明细以及计划会在该issue上持续进行更新:
https://github.com/polarismesh/polaris/issues/188
如果大家有兴趣加入共建的话,欢迎在issue上进行回复,感谢大家对PolarisMesh社区的支持。
猜你喜欢: