SpringCloud之Ribbon(二)

本文介绍如何自定义Ribbon中的智能路由规则(IRule)及SpringClientFactory中的Bean,适用于微服务架构下本地调试需求。同时探讨了两种自定义方式,并提供了基于IP的优先级路由策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       SpringClientFactory是Feign和Ribbon关联的纽带,具体可参见FeignRibbonClientAutoConfiguration。SpringClientFactory实例化IRule、IPing、ServerList、ILoadBalancer时默认是以PropertiesFactory中的Bean定义优先,PropertiesFactory和SpringClientFactory一样都是在RibbonAutoConfiguration中定义。和Feign不一样的是,项目中必须要使用@FeignClient来定义接口,所以直接使用它的configuration属性就可以自定义FeignContext容器中的Bean了。但Ribbon不一样,一般情况下项目中无论是@RibbonClients还是@RibbonClient都不会显示使用,全交由SpringCloud中处理,如果我们要自定义SpringClientFactory容器中的Bean,就可以从PropertiesFactory这里来想办法。

       项目中Ribbon容器一般只需一个即可,不像Feign一样会有多个,所以一般情况下也没有像Feign那样可以为不同子容器定义不同实现的需求。要自定义PropertiesFactory中的Bean有两种方式,一种是继承自己实现一个PropertiesFactory,第二种是在配置文件中配置,PropertiesFactory默认会从Environment中读取对应Bean有没有在应用中配置。两种方式最后的效果都是一致的,如果准备把代码打包成一个xxx-start包引入的话,我个人还是喜欢自定继承实现一个PropertiesFactory,这样就不用每个项目中都去配置了。当然如果项目中使用了远程配置中心,可以定义一个公共的配置文件也是一样的。

       智能路由的中心思想就是自定义路由规则(IRule),在项目开发时经常遇到到本地联调,大型系统中往往由很多微服务系统组成,少的有七八个,十几个,多的几十上百。全在本机启动调试也不现实,在开发服务器或测试服务器中又不方便,虽然可以开远程单步断点,但会影响到项目中其它人的正常工作。以前使用Dubbo时本地最多时启动十几个服务,项目发到测试环境后定位问题也比较麻烦,要么多打点日志,要么是使用如BTrace之类的动态字节码注入框架在线注入日志打印。有了智能路由就方便了,本地机器、开发环境、测试环境都可以使用同一个注册中心,正常情况下各环境调用都互相隔离,当要本地调试时可以定义优先调用指定IP(如本机IP)的服务。这个指定的IP当然是需要向整个调用链传递的,然后在IRule.choose中判断,如果存在该IP就优先选择该IP的Server,否则按原有规则执行。默认IRule为ZoneAvoidanceRule,通过CompositePredicate来筛选可用Server,可以向CompositePredicate中添加自己的筛选规则过滤Server。IRule.choose方法有个loadBalancerKey的Object参数,默认是字符串default,目前来说没什么用处,源码中传递default的调用后面还加了个注释: // TODO: better handlingof key

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值