导语
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作为一个服务框架使用的话,以当前的能力,部分服务治理相关的场景还是满足不了。比如:
为解决上述这些服务治理相关的场景诉求,需要将PolarisMesh的能力与gRPC进行整合,是的gRPC能真正成为一个全功能的服务框架。
PolarisMesh对接gRPC-Go
1. 实现方式
PolarisMesh通过插件扩展的方式,将go语言客户端(polaris-go)与gRPC-Go进行整合,整合后的整体架构如下图所示:
扩展后gRPC-Go服务调用和核心流程如下:
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还对接了其他的开源框架,助力这些框架能获取到全功能的服务治理能力,以下为已完成对接的框架以及示例:
本月社区概况
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社区的支持。
★
北极星交流群
添加「中间件小Q妹」微信,并备注“北极星交流群”
福利时间
北极星(PolarisMesh)支持gRPC后,您的哪些业务场景可以使用呢?
欢迎大家评论区留言评论,
留言集满30赞
我们将在精选留言中随机抽送
腾讯公仔
往期
推荐
《ZooKeeper系列文章:ZooKeeper 源码和实践揭秘(二)》
《Kratos技术系列|从Kratos设计看Go微服务工程实践》
扫描下方二维码关注本公众号,
了解更多微服务、消息队列的相关信息!
解锁超多鹅厂周边!
戳原文,查看更多北极星(PolarisMesh)信息!
点个在看你最好看