PolarisMesh源码系列--Polaris-Go注册发现流程
导语
北极星是腾讯开源的一款服务治理平台,用来解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题。在分布式和微服务架构的治理领域,目前国内比较流行的还包括 Spring Cloud,Apache Dubbo 等。在 Kubernetes 的技术领域,也有以 Istio 为代表的 ServiceMesh 技术。本篇 Blog 主要分析北极星的优势,及其服务注册发现的技术实现。
我是如何看待这些技术
要做好一个服务治理框架,核心功能和要素至少包括以下几点:
-
服务注册发现
-
路由,熔断,限流
-
配置中心
-
可观测性, 日志、度量、链路追踪
从功能实现方面来看,不管是 SpringCloud,Apache Dubbo,Istio 还是北极星,基本都实现了这些功能,那它们的实现思路有什么不同呢?
SpringCloud
SpringCloud 是完全架构在 SpringBoot 基础上的,是 SpringBoot 开发框架很自然的延伸,因此继承了 SpringBoot 框架所有的优点,可以非常灵活的集成各类服务注册发现、服务治理、可观测组件。例如 SpringCloud 框架自身开发了 Spring-Cloud-Config 和 Spring-Cloud-Sleuth 组件,分别提供了配置和部分可观测性的能力;在其他能力方面,早期版本主要由 Netflix 提供的 Eureka, Ribbon, Hystrix等组件提供了服务注册发现,服务治理的能力; 随着 Netflix 很多组件生命周期结束, SpringCloud 又通过自定义的 Abstract LoadBalance/Route 接口及实现, 以及集成的 Resilience4J/Sentinel 等熔断限流组件,继续为用户提供统一的服务注册发现,服务治理等方面的能力。
SpringCloud 在实际使用过程中, 可能会给人一种没有一个统一的服务治理模型的错觉, 这是因为 SpringCloud 保持了自身的胶水框架的特性和思路, 可以集成和融合各类治理组件,例如熔断限流就提供了 Hystrix、Resilience4J、Sentinel 等方式。这样的框架特性,优势是灵活,可以融合各类框架,劣势是抽象统一的治理模型比较困难,因此 SpringCloud 并没有提供一个统一的服务治理控制面,即使是 Spring-Cloud-Admin 的扩展,也更多是基于 SpringBoot Actuator 提供可观测的管理,并没有提供服务治理的控制面能力。
ServiceMesh-Sidecar 模式
ServiceMesh 解耦了业务逻辑和服务治理逻辑,它将服务治理能力下沉到基础设施,在服务的消费者和提供者两侧以独立进程的方式部署。这种方式提升了整体架构的灵活性,减少对业务的侵入性并很好的解决了多语言支持的复杂性。劣势是一方面服务通过 sidecar 的调用多了一道 iptables/ipvs 的转发,降低了一些性能,Sidecar 也增加了少量的资源使用;另一方面是中小团队很难对框架灵活扩展,虽然 Envoy 提供了 WASM 机制,其自身也能通过 C++ 扩展 Filter,但是不管哪种方式,都需要团队有一定经验的人员来完成,中小团队很难提供这样的人员保障。
另外,Istio 虽然也能提供基于虚拟机/物理机的部署,但是本身还是基于Kubernetes 设计的,也对 Kubernetes 部署最友好,对于未使用 Kubernetes 的团队有一定的挑战。
PolarisMesh
PolarisMesh 从个人的角度看,是融合和兼容了很多技术的解决方案。
一方面,它可以看作是 SpringCloud 服务治理实践的一种自顶向下的正向思考过程,SpringCloud 是自底向上的一种构建思路,它提供了各类服务发现、服务治理、可观测组件的集成和融合,但是并没有提供统一的顶层治理模型(或者仅提供了一部分);而 Polaris 是先基于下一代架构基金会所制定的服务治理标准,制定和扩展了服务治理的模型,然后基于该模型,分别构建了服务治理的控制面和数据面(各类语言的 SDK、开发框架、JavaAgent、Kubernetes Controller)。当然,基于该模型,也能很好的对接到 ServiceMesh 的治理方式, 这样就给未来的发展也留足了空间。
另一方面,PolarisMesh 也通过插件机制,为框架扩展预留了空间,如果当前的开源 Polaris 不满足你的需求,可以较灵活的进行扩展。
polaris-go SDK 服务注册发现技术分析&源码阅读
本篇 Blog 重点对 Polaris-Go SDK 的服务的注册和发现做下技术分析, 以及源码阅读。主要是服务注册和发现是各类服务治理框架最基础和核心的功能,因此先从它开始吧~
公共部分 SDKContext
在客户端 SDK, 不论是服务注册的 API, 还是服务发现的 SDK,其内部都是封装了 SDKContext 的上下文, SDKContext 内部构成如下图所示:
ConfigurationImpl: 主要是客户端 polaris.yaml 配置文件的映射, 分为4个部分,分别是 GlobalConfig, ConsumerConfig, ProviderConfig 和 ConfigFileConfig 。
ConnectionManager: gRPC 连接的连接池管理接口。
plugin.Manager: 插件管理接口,SDK 内部实现的各类功能- 熔断,限流,配置,健康检查,路由,负载均衡等都是按照插件的方式实现, 插件需要实现 Plugin 接口,通过 PluginProxy 包装后交给 plugin.Manager 管理。
Engine:SDK 执行的各类动作,都交由 Engine 处理, 例如服务的注册发现,限流,路由,熔断等,都是调用 Engine 内的 API 实现。也就是 SDK 能执行的功能,都是由 Engine API 统一实现。
服务注册流程
服务注册的粗略流程如下图所示 :
go 客户端 SDK 的整体服务注册流程比较线性, 没有涉及特别复杂的逻辑, 相关 gRPC service 如下:
service PolarisGRPC {// 客户端上报rpc ReportClient(Client) returns (Response) {}// 被调方注册服务实例rpc RegisterInstance(Instance) returns (Response) {}// 被调方反注册服务实例rpc DeregisterInstance(Instance) returns (Response) {}// 统一发现接口rpc Discover(stream DiscoverRequest) returns (stream DiscoverResponse) {}// 被调方上报心跳rpc Heartbeat(Instance) returns (Response) {}// 上报服务契约rpc ReportServiceContract(ServiceContract) returns (Response) {}
}
服务发现流程
服务发现流程相对于服务注册流程要复杂很多, 主要原因是北极星的服务发现会涉及本地 Cache 与 远程 Server 端信息的懒加载同步,同时加载的服务信息也比较复杂,包括实例信息,服务信息,路由信息,限流信息等内容。
服务发现的粗略流程如下图所示 :
可以看到,服务发现中的关键点包括:
-
SDK 内部实现了 LocalCache 缓存机制, 同时 LocalCache 缓存具备以懒加载方式同步远程 Server 中服务信息的能力。
-
SDK 与远程服务信息的同步,是由插件 Serverconnector 实现, SDK客户端通过专门的 Routine 和 Channel 队列,在服务信息第一次远程懒加载完成后, 定时拉取远程 Server 中的服务信息,并更新本地缓存和插件数据。
-
获取到服务信息后,通过路由和负载均衡机制,选取出可用实例,参考官网-流量管理。
-
其他细节包括: 与服务端通信后的异步回调更新机制,超时计算,重试 ,缓存实现,插件加载机制等 。
go SDK 服务发现的 gRPC 接口如下:
// DiscoverClient 服务发现客户端接口
type DiscoverClient interface {// Send 发送服务发现请求Send(*apiservice.DiscoverRequest) error// Recv 接收服务发现应答Recv() (*apiservice.DiscoverResponse, error)// CloseSend 发送EOFCloseSend() error
}
结语
上面的技术分析因为时间有限,难免有错误和遗漏,欢迎大家指正, 也特别感谢社区的帮助。北极星通过对服务治理标准的实现,提供了完善的服务发现和治理方案。同时, SDK客户端与 Server 服务端的数据同步与交互,也有设计良好的服务治理模型和健壮的通信机制提供了可靠的保障。此外,通过插件机制,SDK框架 也提供了灵活扩展的能力 。
相关文章:

PolarisMesh源码系列--Polaris-Go注册发现流程
导语 北极星是腾讯开源的一款服务治理平台,用来解决分布式和微服务架构中的服务管理、流量管理、配置管理、故障容错和可观测性问题。在分布式和微服务架构的治理领域,目前国内比较流行的还包括 Spring Cloud,Apache Dubbo 等。在 Kubernete…...

vue3 vxe-grid修改currentPage,查询数据的时候,从第一页开始查询
1、当我们设置好VxeGrid.Options进行数据查询的时候,下面是可能的设置: const gridOptions reactive<BasicTableProps>({id: UserTable,showHeaderOverflow: false,showOverflow: true,keepSource: true,columns: userColumns,size: small,pagerConfig: {cur…...

电商数据集成之电商商品信息采集系统架构设计||电商API接口
一、引言 本架构设计文档旨在阐述基于 Selenium 的电商商品信息采集系统的整体架构,包括系统视图、逻辑视图、物理视图、开发视图和进程视图,并提供一个简单的采集电商商品信息的 demo。该系统通过模拟浏览器行为,实现对电商商品信息的自…...
Spring Cloud Stream 实现统一消息通信平台
1. 概述 Spring Cloud Stream:是Spring提供的消息通信框架,旨在构建跨不同消息中间件的统一通信平台。目的:通过消息通信机制降低分布式系统中服务间的耦合度,实现异步服务交互。 2. 消息通信与RPC RPC:远程过程调用…...

uniapp安卓plus原生选择系统文件
uniapp安卓plus原生选择系统文件 效果: 组件代码: <template xlang"wxml" minapp"mpvue"><view></view> </template> <script>export default {name: file-manager,props: {},data() {return {is…...

Go语言 Import导入
本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示,首先创建test文件夹。 加法 在test文件夹中创建add文件夹ÿ…...

一款异次元小清新风格的响应式wordpress个人博客主题
一款异次元小清新风格的响应式个人博客主题。这是一款专注于用户阅读体验的响应式 WordPress 主题,整体布局简洁大方,针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净,简单且响应迅速的博客主题&#x…...

【cocos creator】ts中export的模块管理
在 TypeScript(TS)中,export 和 import 的概念与 Java 中的 public 类、接口以及 import 语句有一些相似之处。可以用以下方式来类比理解: Export 在 TypeScript 中,export 用于将模块中的变量、函数、类等暴露给外部…...
QT JSON使用实例
下面是一个使用Qt框架的示例代码,展示如何获取仪器的状态,将其打包成JSON格式,保存到当前目录下的JSON文件中,然后通过FTP发送该文件。 1. 准备工作 确保你已经安装了Qt,并创建一个新的Qt Console项目或Qt Widgets项目…...

浅聊 Three.js 屏幕空间反射SSR-SSRShader
浅聊 Three.js 屏幕空间反射SSR(2)-SSRShader 前置基础 渲染管线中的相机和屏幕示意图 -Z (相机朝向的方向)||| -------------- <- 屏幕/投影平面| | || | || | (f) | <- 焦距| | ||…...
Windows图形界面(GUI)-DLG-C/C++ - 月历控件(MonthCalendar)
公开视频 -> 链接点击跳转公开课程博客首页 -> e链接点击跳转博客主页 目录 月历控件(MonthCalendar) 使用场景 控件操作 月历控件(MonthCalendar) 使用场景 日程安排:用户可以通过月历控件选择特定的日期来安排会议或活动。事件管理&#x…...

【Langchain大语言模型开发教程】基于文档问答
🔗 LangChain for LLM Application Development - DeepLearning.AI Embedding: https://huggingface.co/BAAI/bge-large-en-v1.5/tree/main 学习目标 1、Embedding and Vector Store 2、RetrievalQA 引包、加载环境变量 import osfrom dotenv import…...

大厂面试-基本功
大厂面试第4季 服务可用性多少个9是什么意思遍历集合add或remove操作bughashcode冲突案例BigdecimalList去重复IDEA Debugger测试框架ThreaLocal父子线程数据同步 InheritableThreadLocal完美解决线程数据同步方案 TransmittableThreadLocal 服务可用性多少个9是什么意思 遍历集…...

RV1103使用rtsp和opencv推流视频到网页端
参考: Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-pinout/CSI-Camera Luckfox-Pico/RKMPI-example Luckfox-Pico/RKMPI-example 下载源码 其中源码位置:https://github.com/luckfox-eng29/luckfox_pico_rtsp_opencv 使用git clone由于项目比较大&am…...

与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙
在软件工程师的世界里,与 Java 小程序中的 Bug 作战是一场永不停歇的战役。每一个隐藏在代码深处的 Bug 都像是一个狡猾的敌人,时刻准备着给我们的项目带来麻烦。 最近,我就陷入了这样一场与 Java 小程序 Bug 的激烈较量中。这个小程序原本应…...

Git --- Branch Diverged
Git --- Branch Diverged Branch Diverged是如何形成的如何解决RebaseMerge Branch Diverged是如何形成的 尝试提交并将更改推送到 master 分支时,是否看到这条烦人的消息 原因是: 直到更改 B 之前,我的分支和“origin/master”完全相同。从…...
go标准库---net/http服务端
1、http简单使用 go的http标准库非常强大,调用了两个函数就能够实现一个简单的http服务: func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) func ListenAndServe(addr string, handler Handler) error handleFunc注册一个路…...

Linux文件和目录常用命令
1.操作命令 查看目录内容 ls 切换目录 cd 创建和删除操作 touch rm mkdir 拷贝和移动文件 cp mv 查看文件内容 cat more grep 其他 echo 重定向 > 和 >> 管道 | 1.1 终端实用技巧 1>自动补全 在敲出 文件/目录/命令 的前几个字母之后,按下…...
【C++刷题】优选算法——链表
链表常用技巧和操作总结 常用技巧 画图 引入虚拟头节点 不要吝啬空间,大胆定义变量 快慢双指针常用操作 创建一个新节点 尾插 头插 两数相加 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {int carry 0;ListNode* newHead new ListNode, *cur newHea…...
Flex和Bison
Flex和Bison是Linux和Unix环境下两个非常强大的工具,分别用于生成词法分析器和语法分析器。它们在编译器设计、文本处理等领域有着广泛的应用。下面我将详细介绍Flex和Bison的基本概念、功能、用法以及它们之间的关系。 一、Flex 1. 基本概念 Flex(其…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...