侵入式服务治理方案,读这一篇就够(2)

简介: 侵入式服务治理方案,读这一篇就够(2)


核心流程


简单来说,Dubbo中必有的核心概念只有服务提供者、服务消费者和注册中心这三个,治理中心以及监控中心并非必需品。


服务提供者和服务消费者启动时,都会初始化一个Dubbo的运行时容器,多为Spring容器。服务提供者完成初始化后,将向注册中心注册服务;服务消费者完成初始化后,将向注册中心订阅服务。


注册中心在服务提供者列表发生变化时会将变化的内容主动通知给服务消费者。服务提供者和服务消费者在初次连通后,即持有长连接,它们之间将通过透明化的远程调用进行通信。每次调用的信息将传递至监控中心用于统计。Dubbo启动的核心流程如图6-3所示。



微信图片_20220123181539.jpg


图6-3 Dubbo启动的核心流程



注册中心


Dubbo通过注册中心来实现服务发现,它支持Multicast、ZooKeeper、Redis和Simple这四种类型的注册中心。虽然看似选择不少,但Multicast注册中心受网络结构限制,只适合小规模使用,而Simple注册中心不支持集群,因此,实际上生产级别可用的只有ZooKeeper注册中心和Redis注册中心。


无论是使用ZooKeeper还是使用Redis作为注册中心,都不是阿里巴巴内部的实现方案,而是开源的桥接实现方案,因此没有经历阿里巴巴内部的长时间考验。通过服务发现一章中的介绍可知,虽然ZooKeeper并不是首选的用于服务发现的注册中心,但相较于Redis,它的可靠性更强。除了Dubbo,其他很多第三方组件也采用ZooKeeper作为注册中心或元数据管理系统,如Kafka、Hadoop、Mesos,而Redis更加适合于存储应用数据的缓存体系。因此,大部分情况下,Dubbo都是配合ZooKeeper注册中心来使用的。


无论使用ZooKeeper还是Redis作为注册中心,服务注册和服务发现的流程都是相同的,只是存储数据结构以及监听等功能的具体实现不同而已,因此,下文仅选用ZooKeeper作为注册中心来举例说明。图6-4展示了Dubbo注册服务后在ZooKeeper注册中心的Znode中的存储结构。


微信图片_20220123181552.jpg


图6-4 Dubbo的存储结构


Dubbo所有的运行时状态信息都会集中存入一个统一的根节点,根节点的名称就是dubbo。每个服务会以类全称独立创建一个节点,服务节点下会分别创建名为providers和consumers的子节点,用于存储服务提供者和服务消费者信息,每个服务提供者和服务消费者的副本都会在相应的节点位置创建一个临时节点,该临时节点以URL的形式存储当前服务提供者或服务消费者的信息,包括IP地址、端口、调用方法等元数据,以及传输协议、最大连接承载数、路由策略等配置信息。另外还有configurators和routers节点用于存储全局配置和全局路由信息。


服务提供者启动时会在相应服务节点的providers节点下写入包含自身信息的URL作为临时节点;服务消费者启动时会在相应服务节点的consumers节点下写入包含自身信息的URL作为临时节点,并且监听providers节点的变化。当新的服务提供者加入,或当前服务提供者下线时,所有的服务消费者将通过ZooKeeper的监听机制自动感知变化。声明一个最简化的注册中心很容易,以Dubbo最常用的Spring命名空间的配置方式为例,代码如下。

<dubbo:registryaddress="zookeeper://zk_host:2181" />


Dubbo支持多注册中心同时提供服务,以分组的方式隔离不同的注册中心。只有设置为同一组别的服务才会注册到同一个注册中心下。提供多注册中心需要以ID进行区分,声明多注册中心的示例代码如下。

<dubbo:registryid="global" address="zookeeper://zk_host:2181"group="global" />
<dubbo:registry id="custom"address="zookeeper://zk_host:3181" group="custom" />


前面介绍ZooKeeper时提到过,除了原生客户端,还有两个较为常用的第三方客户端,它们是ZkClient和Curator。Dubbo支持这两种客户端对ZooKeeper进行操作,只需在配置注册中心时指明ZooKeeper的实现客户端即可,代码如下。

<dubbo:registryaddress="zookeeper://zk_host:2181" client="curator" />                        



负载均衡


Dubbo采用客户端负载均衡方式,即由服务消费者一方决定将当前通信发送至哪个服务提供者的副本。服务消费者实例启动时会从注册中心同步一份当前有效的服务提供者实例列表,并在服务提供者列表发生变化时更新本地数据副本。每次远程调用发生时,服务消费者都会读取内存中的服务提供者实例列表,并根据合适的负载均衡策略选择一个最合适的服务提供者实例进行访问。


微信图片_20220123181609.jpg



Dubbo的服务发现和负载均衡机制,使得基于它开发的分布式系统具有弹性好、高可用、性能优的特征。


相关文章
|
C语言
error: expected expression C语言 X形图案打印
进行代码实现遇到的问题
265 6
|
安全 Java 数据库连接
Spring框架:IoC容器、AOP、事务管理等知识讲解梳理
Spring框架:IoC容器、AOP、事务管理等知识讲解梳理
236 1
|
1天前
|
数据采集 人工智能 安全
|
10天前
|
云安全 监控 安全
|
2天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
905 150
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1642 8
|
6天前
|
人工智能 前端开发 文件存储
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择
星哥带你玩转飞牛NAS,部署开源笔记TriliumNext!支持树状知识库、多端同步、AI摘要与代码高亮,数据自主可控,打造个人“第二大脑”。高效玩家的新选择,轻松搭建专属知识管理体系。
364 152
|
7天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
601 152
|
9天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
562 13