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

相关文章
|
数据采集 Cloud Native Java
在 GraalVM 静态编译下无侵入实现可观测探索
在 GraalVM 静态编译下无侵入实现可观测探索
112910 104
|
存储 监控 网络协议
5张图,带你了解微服务架构治理
5张图,带你了解微服务架构治理
1917 0
5张图,带你了解微服务架构治理
|
8月前
|
人工智能 自然语言处理 搜索推荐
企业客户服务效率低、体验差,如何通过大模型技术改善?一文了解面向客户服务全场景的行业大模型的3大应用方向
本文三桥君探讨了大模型技术在客户服务领域的应用与实践。从架构设计出发,详细解析了面向客户、客服和运营三大场景的智能功能模块,包括业务咨询、情感关怀、智能点选、知识采编等12项核心功能。AI产品专家三桥君指出,通过行业大模型定制、多源数据整合等技术手段,企业可实现客户服务的智能化升级,显著提升客户体验和运营效率。
459 0
|
8月前
|
Cloud Native API
微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态
微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态
|
6月前
|
人工智能 物联网 API
ModelScope魔搭25年9月发布月报
ModelScope魔搭25年9月发布月报
593 10
|
11月前
|
数据采集 运维 Serverless
云函数采集架构:Serverless模式下的动态IP与冷启动优化
本文探讨了在Serverless架构中使用云函数进行网页数据采集的挑战与解决方案。针对动态IP、冷启动及目标网站反爬策略等问题,提出了动态代理IP、请求头优化、云函数预热及容错设计等方法。通过网易云音乐歌曲信息采集案例,展示了如何结合Python代码实现高效的数据抓取,包括搜索、歌词与评论的获取。此方案不仅解决了传统采集方式在Serverless环境下的局限,还提升了系统的稳定性和性能。
317 0
|
11月前
|
人工智能 前端开发 Java
十几行代码实现 Manus,Spring AI Alibaba Graph 快速预览
Spring AI Alibaba Graph 的核心开发已完成,即将发布正式版本。开发者可基于此轻松构建工作流、智能体及多智能体系统,功能丰富且灵活。文章通过三个示例展示了其应用:1) 客户评价处理系统,实现两级问题分类与自动处理;2) 基于 ReAct Agent 的天气预报查询系统,循环执行用户指令直至完成;3) 基于 Supervisor 多智能体的 OpenManus 实现,简化了流程控制逻辑并优化了工具覆盖度。此外,还提供了运行示例的方法及未来规划,欢迎开发者参与贡献。
|
12月前
|
Cloud Native 算法 中间件
如何使用服务网格实现全方位的流量调度场景
阿里云服务网格(ASM)通过流量调度套件扩展了Istio的限流、熔断能力,实现分用户限流、请求排队等复杂流量管理功能,提升分布式系统高可用性与可观测性。
|
Kubernetes Cloud Native API
掌握Dapr:构建可移植的微服务应用
【10月更文挑战第8天】Dapr(Distributed Application Runtime)是一个开放、可移植的运行时环境,旨在简化微服务应用的构建。它通过提供一套API处理服务发现、状态管理、发布/订阅等常见问题,帮助开发者专注于业务逻辑。本文介绍Dapr的基本概念、核心组件、优势及实施步骤,适用于希望构建弹性、可扩展微服务应用的开发者。
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
274 0