SpringCloud之Ribbon(二)

       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

你可能感兴趣的:(spring)