Ribbon客户端如何动态添加路由实例并扩缩容目标实例
Ribbon适配服务实例动态扩缩容的可行方案
原生配置项server.ribbon.listOfServers是Ribbon给无服务发现的静态场景设计的,本身就不支持动态更新,要实现目标服务实例动态创建、水平扩缩容的自动感知,不需要硬改这个静态配置,直接用Ribbon预留的扩展能力即可,常用方案分两类:
方案一:对接服务注册中心(生产最常用)
- Ribbon默认的静态实例列表读取逻辑,本身就可以被服务发现组件自动替换。你只需要引入对应注册中心的Spring Cloud整合依赖(Eureka、Nacos、Consul均可),开启注册中心的Ribbon整合开关,Ribbon就会自动从注册中心拉取目标服务的实例列表,不再读取
listOfServers的静态配置。 - 这种模式下,目标服务扩缩容时,新启动的实例会自动注册到注册中心,异常/下线的实例会被注册中心的健康检查机制自动剔除。Ribbon默认每30秒会从注册中心拉取一次最新实例列表,更新本地的负载均衡实例池,整个过程不需要手动修改配置、不需要重启服务,天然适配弹性扩缩容场景。实例列表的刷新间隔可以通过
ribbon.ServerListRefreshInterval配置项自行调整。
方案二:自定义动态实例列表逻辑(无注册中心场景)
如果你的场景没有对接统一服务注册中心,可以自行实现Ribbon的实例列表扩展点,对接你自己的实例数据源:
- 自己实现
com.netflix.loadbalancer.ServerList<Server>接口,重写getUpdatedListOfServers()方法,在方法内实现你自己的实例查询逻辑:比如从配置中心、数据库、云平台弹性伸缩API查询当前存活的目标服务实例地址列表返回即可。 - 实现完成后,通过
@RibbonClient注解指定目标服务使用你自定义的ServerList实现,示例代码:
@Configuration @RibbonClient(name = "target-service", configuration = CustomRibbonRuleConfig.class) public class TargetServiceRibbonConfig { @Bean public ServerList<Server> dynamicServerList() { return new YourCustomDynamicServerList(); } }
- 配置完成后,Ribbon会按你设置的刷新间隔,定时调用你实现的方法拉取最新实例列表,不管你是手动新增实例、还是触发自动弹性扩缩容,只要你的查询逻辑能返回最新的实例地址,Ribbon就能自动更新路由的目标节点。
注意:不要尝试通过动态刷新配置的方式修改
listOfServers值实现动态更新,这个配置项的加载逻辑绑定在Ribbon上下文初始化阶段,运行时刷新不会被负载均衡器实时感知,很容易出现路由不一致的问题,走官方预留的ServerList扩展点是稳定性最高的实现方式。
内容的提问来源于stack exchange,提问作者jayendra bhatt
相关产品推荐
相关产品推荐

