Polaris 和 dubbogo 全面对接,让微服务更简单

简介: 当前 Polaris 的服务注册发现、动态路由、访问限流三大能力已经和 dubbogo 做了集成,后续 PolarisMesh 社区会继续和 dubbogo 社区进行合作,将 Polaris 的服务熔断、节点熔断、可观测性以及配置中心的能力融入到 dubbogo 中,让用户能够在 dubbogo 中使用 Polaris 一站式的服务治理功能。

作者:邓正威


背景概述


什么是 Polaris


Polaris 是腾讯开源的服务治理平台,致力于解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题,针对不同的技术栈和环境提供服务治理的标准方案和最佳实践。


1.png


什么是 dubbogo


dubbogo 是一款高性能 Go 语言微服务 RPC 框架,在 Dubbo 多语言生态中扮演重要角色,是编写 Go 语言微服务的最佳选择之一。开发者可以使用 dubbogo 框架高效地编写 RPC 服务,并支持与dubbogo  、gRPC 服务跨语言互通;并且 dubbogo 本身提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。


2.jpeg


为什么要对接


分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题,如何去解决、选用什么组件来解决、组件之间是否会存在冲突等等,相信已经让不少开发者难以招架。在 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 的服务治理能力后,业务流量实际处理流程如下:


3.jpeg


从架构分层的维度,北极星 SDK,插件,与 dubbogo 之间通过以下方式进行整合:


  • 基于 Registry/ServiceDiscovery 的 dubbogo 扩展点,引入 Polaris 的服务注册能力


4.jpeg


  • 基于 Registry/ServiceDiscovery 的 dubbogo 扩展点,引入 Polaris 的服务发现能力


5.jpeg


  • 基于 PriorityRouter 的 dubbogo 扩展点,引入 Polaris 的动态路由能力


6.jpeg


  • 基于 TpsLimiter 的 dubbogo 扩展点,引入 Polaris 的访问限流能力


7.jpeg


如何使用


当前 dubbogo 与 Polaris 服务治理能力对接情况(基于 dubbogo v3.0.4-rc1 版本)


8.png


服务注册


当前 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 配置文件后,启动服务,可以在北极星控制台直接观察到服务实例


9.png


服务发现


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 消息的以下内容进行路由调度:


10.png


假定一个场景,希望 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)
  }
}


测试路由规则

11.png


兜底路由规则


12.png


访问限流


访问限流可以实现基于 dubbo 的请求消息内容来对请求进行访问限流,比如对 dubbogo 中的 GetUser 方法,对请求参数 Name 为 Alex 的请求进行限流,速率为 10/s。


当前支持针对 dubbo 消息的以下内容进行路由调度:

13.png


限流规则


14.png


在 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/polarismesh/polaris


dubbogo 项目:

https://github.com/apache/dubbo-go


dubbogo polaris example:

https://github.com/apache/dubbo-go-samples/tree/master/polaris


北极星服务注册文档:

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 社区负责人


微信或钉钉扫描下方对应二维码,立刻进群交流~


15.png

相关文章
|
11月前
|
人工智能 自然语言处理 搜索推荐
企业客户服务效率低、体验差,如何通过大模型技术改善?一文了解面向客户服务全场景的行业大模型的3大应用方向
本文三桥君探讨了大模型技术在客户服务领域的应用与实践。从架构设计出发,详细解析了面向客户、客服和运营三大场景的智能功能模块,包括业务咨询、情感关怀、智能点选、知识采编等12项核心功能。AI产品专家三桥君指出,通过行业大模型定制、多源数据整合等技术手段,企业可实现客户服务的智能化升级,显著提升客户体验和运营效率。
553 0
|
9月前
|
人工智能 物联网 API
ModelScope魔搭25年9月发布月报
ModelScope魔搭25年9月发布月报
809 10
|
11月前
|
运维 Prometheus 安全
服务网格真香,但怎么优化才不翻车?
服务网格真香,但怎么优化才不翻车?
277 3
|
10月前
|
消息中间件 存储 数据采集
Apache InLong:构建10万亿级数据管道的全场景集成框架
Apache InLong(应龙)是一站式、全场景海量数据集成框架,支持数据接入、同步与订阅,具备自动、安全、可靠和高性能的数据传输能力。源自腾讯大数据团队,现为 Apache 顶级项目,广泛应用于广告、支付、社交等多个领域,助力企业构建高效数据分析与应用体系。
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
462 0
|
机器学习/深度学习 人工智能 搜索推荐
人工智能与体育:运动员表现分析
【10月更文挑战第31天】随着科技的发展,人工智能(AI)在体育领域的应用日益广泛,特别是在运动员表现分析方面。本文探讨了AI在数据收集与处理、数据分析与挖掘、实时反馈与调整等方面的应用,以及其在技术动作、战术策略、体能与心理状态评估中的具体作用。尽管面临数据准确性和隐私保护等挑战,AI仍为体育训练和竞技带来了新的机遇和前景。
|
人工智能 程序员 API
为了了解国外AI最新动态,分享我经常逛的6 个 YouTube AI频道
AI 正在迅速发展,每周都会有一篇关于该领域新发展的新论文,一种可以提高您工作效率的 AI 工具,或者一个改变一切的公告。 这就是为什么在本文中,我想与您分享最好的 YouTube 频道,以便及时了解 AI 的最新动态。这些 YouTube 用户精心挑选了最好的 AI 新闻,并创建了有关如何充分利用 ChatGPT 等 AI 工具的详细教程。
2310 0
|
Cloud Native 算法 中间件
如何使用服务网格实现全方位的流量调度场景
阿里云服务网格(ASM)通过流量调度套件扩展了Istio的限流、熔断能力,实现分用户限流、请求排队等复杂流量管理功能,提升分布式系统高可用性与可观测性。
|
JavaScript Java Serverless
理解Serverless技术—FaaS和BaaS
Serverless技术—FaaS和BaaS
3698 1