作者:邓正威
背景概述
什么是 Polaris
Polaris 是腾讯开源的服务治理平台,致力于解决分布式和微服务架构中的服务治理、流量治理、配置管理、故障容错和可观测性问题,针对不同的技术栈和环境提供服务治理的规范计划和最佳实际。
什么是 dubbogo
dubbogo 是一款高性能 Go 语言微服务 RPC 框架,在 Dubbo 多语言生态中表演重要角色,是编写 Go 语言微服务的最佳抉择之一。开发者能够应用 dubbogo 框架高效地编写 RPC 服务,并反对与 dubbogo、gRPC 服务跨语言互通;并且 dubbogo 自身提供的丰盛服务治理个性,能够实现诸如服务发现、负载平衡、流量调度等服务治理诉求。
为什么要对接
分布式和微服务架构中的服务治理、流量治理、配置管理、故障容错和可观测性问题,如何去解决、选用什么组件来解决、组件之间是否会存在抵触等等,置信曾经让不少开发者难以招架。在 dubbogo 用户中,须要解决这些微服务架构中的问题,通常都会部署以下组件
- Nacos(Zookeeper):解决服务治理、配置管理以及元数据管理
- Sentinel:解决流量治理、故障容错
- Prometheus、Skywalking:解决可观测性
能够发现,要解决这些问题不得不部署多个组件,并且每个组件都有各自的管控平台,数据联动性差,难以有一个全局的视角让用户能够很好的治理微服务。
Polaris 是一反对多语言多框架的云原生服务治理平台,具备服务治理、流量治理、故障容错、配置管理和可观测性五大性能,用户不须要在为抉择什么组件而操心,间接在 Polaris 享受一站式服务治理平台所带来的便当。为此,Polaris 社区和 dubbogo 社区单干,将 Polaris 服务治理能力,与 dubbogo 框架相结合,便于 Go 利用开发者疾速低门槛的进行微服务开发。
如何对接 Polaris
Polaris 有对立管制面和规范,数据面提供多语言 sdk 的实现给框架做集成。服务治理、流量治理、故障容错、配置管理和可观测性五大性能可间接通过 Polaris 的数据面间接接入,各个语言框架无需反复实现,对立了各个语言以及框架的服务治理能力。
因而,要实现 dubbo 与 Polaris 的集成,只须要应用 Polaris 提供的数据面 Polaris-Go SDK,通过 dubbogo 的 Extension 机制进行注入,无需额定进行服务治理逻辑的开发。
技术架构
Polaris 通过实现 dubbogo 相干 Extension 插件,实现了性能的注入,用户只须要在配置中进行性能开启即可应用,无需进行代码革新。
从用户数据流的维度,当用户在 dubbogo 中启用 Polaris 的服务治理能力后,业务流量理论解决流程如下:
从架构分层的维度,北极星 SDK,插件,与 dubbogo 之间通过以下形式进行整合:
- 基于 Registry/ServiceDiscovery 的 dubbogo 扩大点,引入 Polaris 的服务注册能力
- 基于 Registry/ServiceDiscovery 的 dubbogo 扩大点,引入 Polaris 的服务发现能力
- 基于 PriorityRouter 的 dubbogo 扩大点,引入 Polaris 的动静路由能力
- 基于 TpsLimiter 的 dubbogo 扩大点,引入 Polaris 的拜访限流能力
如何应用
以后 dubbogo 与 Polaris 服务治理能力对接状况(基于 dubbogo v3.0.4-rc1 版本)
服务注册
以后 Polaris 已实现了 dubbogo 原生的服务注册扩大点,因而本来的 dubbogo 服务注册逻辑不须要进行任何调整,只须要在 dubbogo.yaml 配置文件中新增 protocol 为 polaris 的注册核心配置即可。
业务代码(dubbogo 原生应用形式)
func init() {config.SetProviderService(&UserProvider{})
hessian.RegisterPOJO(&User{})
}
type UserProvider struct {}
func (u *UserProvider) GetUser(ctx context.Context, req *User) (*User, error) {rsp := User{"A001", "Alex Stocks", 18, time.Now()}
return &rsp, nil
}
func main() {if err := config.Load(); err != nil {panic(err)
}
initSignal()}
dubbogo.yaml 配置文件
dubbo:
registries:
polaris-1:
protocol: polaris
address: ${北极星服务端 IP}:8091
调整完 dubbogo.yam 配置文件后,启动服务,能够在北极星控制台间接察看到服务实例
服务发现
dubbogo 在进行服务调用时,会先通过 Polaris Registry 的 Extension 获取到服务的实例列表,而后转换为 dubbogo invoker,最终实现 dubbogo 服务调用。
以后 Polaris 已实现了 dubbogo 原生的服务发现扩大点,因而本来的 dubbogo 服务调用无需调整业务代码,仅须要在 dubbogo.yaml 中新增 protocol 为 polaris 的注册核心配置即可。
业务代码(dubbogo 原生应用形式)
func main() {var userProvider = &UserProvider{}
config.SetConsumerService(userProvider)
hessian.RegisterPOJO(&User{})
if err := config.Load(); err != nil {panic(err)
}
user, err := userProvider.GetUser(context.TODO(), &User{Name: "Alex001"})
if err != nil {panic(err)
}
logger.Infof("response result: %v\n", user)
}
dubbogo.yaml 配置
dubbo:
registries:
polaris-1:
protocol: polaris
address: ${北极星服务端 IP}:8091
动静路由
动静路由能够实现基于 dubbo 的申请音讯内容来对申请调度到不同的实例分组,比方将带了某些 user 标签的申请调度到灰度分组。
以后反对针对 dubbo 音讯的以下内容进行路由调度:
假设一个场景,心愿 uid 为 user-1 的申请,路由到版本为 2.0.0 的实例上,其余则路由到版本为 1.0.0 的实例上,那能够为 dubbogo 服务设置两条路由规定。
留神:在应用 PolarisMesh 的动静路由能力时,须要先启用 PolarisMesh 在 dubbogo 中的注册发现性能
业务代码(dubbogo 原生应用形式)
func (s *Service) GetUser(uid string) {atta := make(map[string]interface{})
atta["uid"] = uid
// 通过这种形式往 attachement 传入路由条件
reqContext := context.WithValue(context.Background(), constant.DubboCtxKey("attachment"), atta)
for i := 0; i < 5; i++ {time.Sleep(200 * time.Millisecond)
user, err := userProvider.GetUser(reqContext, &User{Name: "Alex001"})
if err != nil {logger.Errorf("error: %v\n", err)
}
logger.Infof("response: %v\n", user)
}
}
测试路由规定
兜底路由规定
拜访限流
拜访限流能够实现基于 dubbo 的申请音讯内容来对申请进行拜访限流,比方对 dubbogo 中的 GetUser 办法,对申请参数 Name 为 Alex 的申请进行限流,速率为 10/s。
以后反对针对 dubbo 音讯的以下内容进行路由调度:
限流规定
在 Polaris 配置限流规定后,须要在 dubbogo 中启用 Polaris 的 TpsLimiter,具体开启配置参考如下
留神:在应用 PolarisMesh 的动静路由能力时,须要先启用 PolarisMesh 在 dubbogo 中的注册发现性能
业务代码
func (s *Service) Test() {
var successCount, failCount int64
for i := 0; i < 10; i++ {time.Sleep(50 * time.Millisecond)
// 服务提供者会依据申请参数 User.Name 的值来进行限流
if user, err := userProvider.GetUser(context.TODO(), &User{Name: "Alex03"}); err != nil {
failCount++
logger.Infof("error: %v\n", err)
} else {
successCount++
logger.Infof("response: %v\n", user)
}
}
logger.Infof("successCount=%v, failCount=%v\n", successCount, failCount)
}
dubbogo.yaml 配置文件
dubbo:
...
provider:
services:
UserProvider:
interface: org.apache.dubbo.UserProvider.Test
tps.limiter: polaris-limit # 配置 tps.limiter 为 polaris-limiter 即可
将来布局
以后 Polaris 的服务注册发现、动静路由、拜访限流三大能力曾经和 dubbogo 做了集成,后续 PolarisMesh 社区会持续和 dubbogo 社区进行单干,将 Polaris 的服务熔断、节点熔断、可观测性以及配置核心的能力融入到 dubbogo 中,让用户可能在 dubbogo 中应用 Polaris 一站式的服务治理性能。
除了能在 dubbogo 上应用 Polaris 的一站式服务治理能力外,Polaris 社区还提供了 其余语言框架的接入,因而相干开发者也可能享受到 Polaris 一站式服务治理带来的技术红利。
附录
Polaris 我的项目:
https://github.com/polarismes…
dubbogo 我的项目:
https://github.com/apache/dub…
dubbogo polaris example:
https://github.com/apache/dub…
北极星服务注册文档:
https://polarismesh.cn/docs/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8/%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/%E6%9C%8D%E5%8A%A1%E5%88%97%E8%A1%A8/
北极星拜访限流文档:
https://polarismesh.cn/docs/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8/%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC/%E8%AE%BF%E9%97%AE%E9%99%90%E6%B5%81/
北极星服务路由文档:
https://polarismesh.cn/docs/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%BD%BF%E7%94%A8/%E6%9C%8D%E5%8A%A1%E7%BD%91%E6%A0%BC/%E5%8A%A8%E6%80%81%E8%B7%AF%E7%94%B1/
作者:
邓正威:apache/dubbo-go committer
廖春涛(春少):PolarisMesh 社区 PMC,apache/dubbo-go committer
赵新(花名 于雨):dubbogo 社区负责人
微信或钉钉扫描下方对应二维码,立即进群交换~