资料参考:《Spring Cloud 微服务实战》
目录
由于Ribbon中定义的每一个接口都有多种不同的策略,同时接口直接又有依赖关系,使得我们在用的时候不知道如何选择具体的实现策略已经组织他们的依赖关系。Spring Cloud Ribbon的自动化配置恰好能解决这样的痛点,在引入Spring Cloud Ribbon的依赖之后,就能够自动化构建下面这些接口的实现。
- IClientConfig:Ribbon的客户端配置,默认采用com. netflix.client.config. DefaultCl ientConfigImpl实现。
- IRule: Ribbon 的负载均衡策略,默认采用com. netflix. loadbalancer.ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。
- IPing: Ribbon的实例检查策略,默认采用com. netflix. loadbalancer .NoOpPing实现,该检查策略是-一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。
- ServerList<Server>:服务实例清单的维护机制,默认采用com. netflix.loadbalancer.ConfigurationBasedServerList实现。
- ServerListFilter<Server>:服务实例清单过滤机制,默认采用org.springframework. cloud.netflix. ribbon. ZonePre ferenceServerListFilter实现,该策略能够优先过滤出与请求调用方处于同区域的服务实例。
- ILoadBalancer : 负载均衡器,默认采用com. netflix. loadbalancer.ZoneAwareLoadBalancer实现,它具备了区域感知的能力。
通过自动化配置的实现,我们可以轻松地实现客户端负载均衡。同时,针对一些个性化需求,我们也可以方便地替换上面的这些默认实现。只需在Spring Boot应用中创建对应的实现实例就能覆盖这些默认的配置实现。比如下面的配置内容,由于创建了PingUrl实例,所以默认的NoOpPing就不会被创建。
另外,也可以通过使用@RibbonClient注解来实现更细粒度的客户端配置,比如下面的代码实现了为hello-service服务使用HelloServiceConfigurstion中的配置。
Ribbon负载均衡策略自定义实现
配置
- 对调用的某个服务启用某种负载策略,有两个方法进行配置
1)通过配置文件配置
hello:
ribbon:
NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
2)通过java注解配置
@Configuration
public class RibbonConfiguration{
@Bean
public IRule ribbonRule(){
//随机负载
return new RandomRule();
}
}
通过注解@RibbonClient为特定的服务配置负载均衡策略
@Configuration
@RibbonClient(name="hello", configuration=RibbonConfiguration.class)
public class TestRibbonConfiguration{
}
以上配置都是在服务消费者中配置。
单独使用Ribbon
因为往往Ribbon配合Eureka使用的,往往也有第三方服务没有注册到Eureka Server,但也部署了多个实例,也需要进行负载均衡,这时可以在服务消费者的配置文件中进行如下方式配置,实现负载均衡
hello:
ribbon:
listOfServers:localhost:8010,localhost:8011
注意:如果需要使服务单独配置,那么配置类不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,@SpringBootApplication 注解中就包含了 @ComponentScan 注解,因此必须使配置类处于不同的包以及子包。
上面这些自动化配置内容仅在没有引入SpringCloudEureka等服务治理框架时如此,在同时引入Eurcka和Ribbon依赖时,自动化配置会有一些不同。