很多场景下,可能根据需要自定义Ribbon的配置,例如修改Ribbon的负载均衡规则等。Spring Cloud Edgware允许使用Java代码或属性自定义Ribbon的配置,两种方式是等价的。
本小节来讨论如何使用Java代码自定义Ribbon的配置。
在Spring Cloud中,Ribbon的默认配置如下(格式是BeanType beanName:ClassName):
●IClientConfig ribbonClientConfig:DefaultClientConfigImpl
●IRule ribbonRule:ZoneAvoidanceRule
●IPing ribbonPing:DummyPing
●ServerList<Server>ribbonServerList:ConfigurationBasedServerList
●ServerListFil ter<Server>ribbonServerListFilter:ZonePreferenceServerListFilter
●ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer
●ServerListUpdater ribbonServerListUpdater:PollingServerListUpdater
简单说明一下,例如以下代码:
BeanType是IRule,beanName是ribbonRule,ClassName是ZoneAvoidanceRule,这是一种根据服务提供者所在Zone的性能以及服务提供者可用性综合计算,选择提供者节点的负载均衡规则。
在Spring Cloud中,Ribbon默认的配置类是RibbonCl ientConfiguration。也可使用一个POJO自定义Ribbon的配置(自定义配置会覆盖默认配置)。这种配置是细粒度的,不同名称的Ribbon客户端可使用不同配置。
下面来为名为microservice-provider-user的Ribbon客户端自定义配置。
1.复制项目microservice-consumer-movie-ribbon,将ArtifactId修改为microservice-consumer-movie-ribbon-customizing。
2.创建Ribbon的配置类。
3.创建一个空类,并在其上添加@Configuration注解和@RibbonCl ient注解。
由代码可知,使用@RibbonClient注解的configuration属性,即可自定义指定名称Ribbon客户端的配置。
测试
1.启动microservice-discovery-eureka。
2.启动2个或更多microservice-provider-user实例。
3.启动microservice-consumer-movie-ribbon-custom izing。
4.多次访问 http://localhost:8010/log-user-instance ,可获得类似如下的日志:
此时请求会随机分布到两个用户微服务节点上,说明已经实现了Ribbon的自定义配置。
必须注意的是,本例中的RibbonConfiguration类不能存放在主应用程序上下文的@ComponentScan所扫描的包中,否则该类中的配置信息将被所有的@RibbonCl ient共享。
因此,如果只想自定义某一个Ribbon客户端的配置,必须防止@Configuration注解的类所在的包与@ComponentScan扫描的包重叠,或应显式指定@ComponentScan不扫描@Configuration类所在的包。
可使用@RibbonCl ients注解为所有Ribbon Client提供默认配置,示例:
从Spring Cloud Netflix 1.2.0开始(即从Spring Cloud Cam den RELEASE开始,读者可前往第2.3.2节查看Spring Cloud各版本所使用的子项目版本),Ribbon支持使用属性自定义。这种方式比使用Java代码配置的方式更加方便。
支持的属性如下,配置的前缀是<clientName>.ribbon.。其中,<clientName>是Ribbon Client的名称, 如果省略,则表示全局配置 。
●NFLoadBalancerClassName:配置ILoadBalancer的实现类。
●NFLoadBalancerRuleClassName:配置IRule的实现类。
●NFLoadBalancerPingClassName:配置IPing的实现类。
●NIWSServer ListClassName:配置Server List的实现类。
●NIWSServer ListFilterClassName:配置Server ListFilter的实现类。
下面,我们来用属性来修改名为microservice-provider-user的Ribbon Client的负载均衡规则。
复制项目microservice-consumer-movie-ribbon,将ArtifactId修改为microservice-consumer-movie-ribbon-customizing-proper ties。在项目的application.yml中添加以下内容即可:
这样,就可将名为microservice-provider-user的Ribbon Client的负载均衡规则设为随机。
若配置成如下形式,则表示对所有Ribbon Client都使用RandomRule:
由代码不难看出,使用属性自定义的方式比用Java代码配置方便很多。
测试
1.启动microservice-discovery-eureka。
2.启动两个或更多microservice-provider-user实例。
3.启动microservice-consumer-movie-ribbon-custom izing-properties。
4.多次访问 http://localhost:8010/log-user-instance ,查看日志,会发现此时请求依然会随机分布到两个用户微服务节点上。
属性配置的方式比Java代码配置的方式 优先级更高 。