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框架 也提供了灵活扩展的能力 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3250406.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序

英文名字网/英文取名/英语起名网源码/带文章系统带采集PHP网站程序 演示站: https://enname.wengu8.com/ 程序截图: 程序说明: 1、前端模板PC手机端自适应。 2、全部数据带25W名字数据,后台可编辑,包括json格式的…

【Docker】Docker-compose 单机容器集群编排工具

目录 一.Docker-compose 概述 1.容器编排管理与传统的容器管理的区别 2.docker-compose 作用 3.docker-compose 本质 4.docker-compose 的三大概念 二.YML文件格式及编写注意事项 1.yml文件是什么 2.yml问价使用注意事项 3.yml文件的基本数据结构 三.Docker-compose …

零基础入门鸿蒙开发 HarmonyOS NEXT星河版开发学习

今天开始带大家零基础入门鸿蒙开发,也就是你没有任何编程基础的情况下就可以跟着石头哥零基础学习鸿蒙开发。 目录 一,为什么要学习鸿蒙 1-1,鸿蒙介绍 1-2,为什么要学习鸿蒙 1-3,鸿蒙各个版本介绍 1-4&#xff0…

【用栈操作构建数组】python刷题记录

润到栈模块. class Solution:def buildArray(self, target: List[int], n: int) -> List[str]:#每一个缺失的数字填入pushpop,其他数字只需要填入push即可#再简化思路,读取到的数小于当前,pushpop,直到等于当前才pushans[]cur0for i in ta…

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

zabbix“专家坐诊”第246期问答

问题一 Q:有哪位大哥知道这是啥情况,6.4主动检查接口显示未知? A:看看agent配置文件的主采集有没有填写正确IP。 Q:我刚刚客户端重新授权,发现可以预警了,但是还是灰色的,我尝试输…

直播平台优化方案:直播美颜SDK开发详解

本篇文章,笔者将详细介绍直播美颜SDK的开发过程,帮助开发者为其平台增添这一重要功能。 一、美颜SDK的基本概念 通过美颜SDK,用户在进行直播时可以轻松地美化自己的形象,提高观众的观看体验。 二、美颜SDK的核心功能 1.实时美颜…

人工智能算法工程师(高级)课程2-多类目标识别之RCNN系列模型与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程2-多类目标识别之RCNN系列模型与代码详解。本文全面解析了RCNN系列模型,包括R-CNN、Fast R-CNN、Faster R-CNN等,重点阐述了基于PyTorch框架实现多目标检测与识…

成为一位优秀的项目经理,这一点很重要

在管理工作中,我们可能会遇到这样的情况:有的人业务能力很强,堪称行业内的佼佼者,但当领导却仿佛失去了方向,管理起来显得力不从心,甚至一团糟。 业务能力和领导力是两个既相关又独立的概念。 业务能力是…

飞凌嵌入式RK3576开发板的MIPI-CSI调试——通路解析

MIPI-CSI是一种在嵌入式系统或移动设备中常见的摄像头接口,能够实现高速的图像数据传输。飞凌嵌入式最新推出的OK3576-C开发板拥有丰富的资源接口,其中支持5个CSI-2接口,意味着最多可同时支持5路摄像头的输入。 本篇内容就通过OK3576-C开发板…

2024年9月CCF GESP第七次认证开启报名 6547网

CCF GESP第七次认证时间为2024年9月7日,1-4级认证时间为上午9:30-11:30,5-8级认证时间为下午13:30-16:30。7月18日17:00开启9月认证报名通道,考生可登录GESP官网进行报名。GESP认证方式为全国各GESP考点上机考试,认证语言包括&…

Monaco 使用 FoldingRangeProvider

Monaco 中支持代码折叠功能,FolderRangeProvider 是一个通知功能,编辑文档会根据大括号的范围进行折叠,也就是可折叠区域都是以左大括号开始,右大括号结束,当折叠区域发生变更时,内部方法会被调用。 通过 …

数据结构——hash(hashmap源码探究)

hash是什么? hash也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。 举例来说明一下什么是hash: 假设我们要把1~12存入到一个大小是5的hash表中,我们…

数学基础【俗说矩阵】:矩阵相乘

矩阵乘法 矩阵乘法推导过程 一、两个线性方程复合代入 二、X1和X2合并同类项 三、复合后方程组结果 四、线性方程组矩阵表示 五、线性方程组矩阵映射表示 复合映射表示 六、矩阵乘法导出 矩阵乘法法则 1、规则一推导过程 左取行,右取列,对应相乘后…

java题目之拷贝数组

public class MethondDemo10 {public static void main(String[] args) {//定义一个需求copyOfRange(int[]arr,int from,int to)//将数组arr中从索引from(包含from)开始//到索引to结束(不包含to)的元素复制到新数组当中//将新数组返回c0-p//定义原始数组,静态数组int[] arr{1,2…

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…

【Vue】深入了解 v-for 指令:从基础到高级应用的全面指南

文章目录 一、v-for 指令概述二、v-for 指令的基本用法1. 遍历数组2. 遍历对象3. 使用索引 三、v-for 指令的高级用法1. 组件列表渲染2. 使用 key 提升性能3. 嵌套循环 四、结合其他功能的高级用法1. 处理过滤和排序后的结果2. 迭代数值范围3. 结合其他命令使用模板部分 (<t…

【运维资料】智慧项目运维服务方案(2024Word直接套用完整版)

信息化项目运维服务方案&#xff08;投标&#xff0c;实施运维&#xff0c;交付&#xff09; 1.项目整体介绍 2.服务简述 3.资源提供 软件全过程性&#xff0c;标准型&#xff0c;规范性文档&#xff08;全套资料包&#xff09;获取&#xff1a;本文末个人名片直接获取&#xf…

科研绘图系列:R语言微生物堆积图(stacked barplot)

介绍 堆叠条形图是一种数据可视化图表,它通过将每个条形分割成多个部分来展示不同类别的数值。每个条形代表一个总体数据,而条形内的每个部分则代表该总体数据中不同子类别的数值。这种图表特别适合展示整体与部分的关系,以及各部分在整体中的比例。 特点: 多部分条形:每…

《网络安全技术与应用》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《网络安全技术与应用》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《网络安全技术与应用》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;教育部 主办单位&#xff…