本文共 2217 字,大约阅读时间需要 7 分钟。
Dubbo 是一个灵活高效的服务治理平台,能够帮助开发者管理和优化分布式服务。在本文中,我们将深入探讨 Dubbo 服务治理平台的核心实现原理,包括服务搜索、路由规则、动态配置、权重管理和负载均衡等关键功能。
Dubbo 早期版本的服务治理平台已经被逐步淘汰,取而代之的是一个全新的服务治理平台,这个新平台与 Dubbo 源码无关,而是作为一个独立的项目(可在 GitHub 上找到 dubbo-ops 仓库)。新平台分为前端和后台两大部分,采用前后端分离的架构设计。前端使用 Vue + Vuetify 的组合方式,后台则基于 Spring Boot 实现。
目前新平台仍在开发中,部分功能尚未上线。因此,本文将基于新平台的现有功能进行讲解,对于尚未实现的功能,则将基于旧平台进行说明。
服务治理平台的前端通过 REST 接口与后端服务进行通信,后端 Controller 接收请求后,通过 Service 处理具体逻辑。平台提供了多个 Controller,分别负责不同的服务治理功能:
服务搜索是通过不同的过滤条件,在本地的注册数据缓存里,查找出合适的结果集。主要是通过一个工具类 RegistryServerSync 实现的,它继承了两个 Spring 接口和一个 Dubbo 注册中心接口。
RegistryServerSync 实现了 InitializingBean 和 DisposableBean 接口,分别在 Bean 的初始化和销毁时订阅和取消订阅注册中心的数据。同时,它还继承了 NotifyListener 接口,监听到注册中心的变化时,会调用 notify(List<URL> urls) 方法更新本地缓存数据。
具体实现逻辑如下:
afterPropertiesSet() 方法订阅注册中心。destroy() 方法取消订阅。通过这种方式,服务提供者和消费者的查找就变得非常简单了,只需要在本地缓存中遍历数据,过滤出符合条件的结果即可。
路由规则可以为不同的服务指定特定的路由规则,路由协议在注册中心的 URL 以 route:// 开头。前端可以配置的参数如表 12-3 所示。
路由规则的实现基于 Dubbo 的服务路由功能,具体包括以下内容:
conditions 是用来匹配服务方法的,例如 find、list、get 等开头的方法。override 功能相似,均使用“注册”和“取消注册”方法来实现。override 特性主要用于动态参数的更新。各个节点监听到注册中心的参数变化后,会更新本地的参数信息。override 类型的 URL 是以 override:// 开头的,允许部分属性的动态更新。
具体操作逻辑如下:
override 对象转换为 URL,通过 registryService.register(url) 将 URL 注册到注册中心。框架中不同的负载均衡策略还会受到权重的影响。当用户对服务设置了权重后,对权重高的节点会提高调用频率,对权重低的节点会降低调用频率。权重的实现与其他配置功能的实现相似,首先把前端传入的参数转换为 Weight 对象,然后把 Weight 对象转换为 URL,最后使用 overrideService 将 URL发布到注册中心。
如果用户不做任何配置,则默认使用 RandomLoadBalance,即加权随机负载算法。用户可以在服务治理平台中修改某个服务的负载均衡策略,其配置参数较少。负载均衡对象会被转换成一个 override 对象,并使用 override 协议实现新增、更新、删除等操作。
转载地址:http://tlhfk.baihongyu.com/