SpringCloud——Ribbon实现客户端负载均衡
SpringCloud——Ribbon实现客户端负载均衡
Spring Cloud Ribbon 是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过SpringCloud的封装,可以让我们轻松地将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。
客户端负载均衡
在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端的清单来自于服务注册中心,例如Eureka。
通过Spring Cloud Ribbon的封装, 我们在微服务架构中使用客户端负载均衡调用非常简单, 只需要如下两步:
- 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
- 服务消费者直接通过调用被 @LoadBalanced 注解修饰过的RestTemplate来实现面向服务的接口调用。
这样,我们就可以将服务提供者的高可用以及服务消费者的负载均衡调用一起实现了。
下图为Eureka以及Ribbon配合使用的架构图 每个C实例从Eureka注册中心获取所有A实例的地址后,通过Ribbon负载均衡调用A实例。
服务消费者整合Ribbon
创建一个ArtifactId是 consumer-movie 的Maven工程,并添加如下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
注意,若添加了spring-cloud-starter-eureka,该依赖已经包含了spring-cloud-starter-ribbon,所以无须再次注入
创建application.yml,定义服务名和端口,并注册到Eureka注册中心上
server:
port: 8003
spring:
application:
name: consumer-movie
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
创建 RestTemplate,并添加 @LoadBalance注解 只须添加注解 @LoadBalance,就可为 RestTemplate 整合Ribbon,使其具备负载均衡能力。
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
创建Controller,注入RestTemplate
@Autowired
private RestTemplate restTemplate;
@GetMapping("/user/{id}")
public User findById(@PathVariable Long id){
return this.restTemplate.getForObject("http://provider-user/"+id,User.class);
}
provider-user为服务提供者的服务名,当Ribbon与Eureka配合使用时,会自动将服务名映射成微服务的网络地址。服务消费者consumer-movie调用服务提供者provider-user时,会从Eureka注册中心获取服务提供者provider-user的几个实例的网络地址,并通过Ribbon负载均衡的调用这些实例。
使用属性自定义修改Ribbon负载均衡规则
Ribbon可以直接通过 <clientName.ribbon.key=value的形式进行配置, clientName为服务提供者的服务名,例如下面为配置Ribbon调用provider-user时的负载均衡规则为随机调用provider-user的实例
provider-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
除了负载均衡规则NFLoadBalancerRuleClassName,Ribbon还提供了很多可以动态配置的接口,具体如下所述:
- NFLoadBalancerClassName: 配置工LoadBalancer接口的实现。负载均衡器,默认采用com.netflix.loadbalancer.ZoneAwareLoadBalancer实现,它具备了区域感知的能力。
- NFLoadBalancerPingClassName: 配置IPing接口的实现。Ribbon的实例检查策略,默认采用com.netflix.loadbalancer.NoOpPing 实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true, 默认认为所有服务实例都是可用的 。
- NIWSServerListClassName: 配置ServerList接口的实现。服务实例清单的维护机制,默认采用com.netflix.loadbalancer.ConfigurationBasedServerList实现。
- NIWSServerListFilterClassName: 配置ServerListFilter接口的实现。服务实例清单过滤机制,默认采用org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter实现,该策略能够优先过滤出与请求调用方处于同区域的服务实例。
