Ribbon负载均衡
一、Ribbon - 负载均衡原理、流程
- 服务消费者(order-service)根据服务名称发起请求,请求地址(url):http://userservice/user/1。
- 请求被负载均衡拦截器:LoadBalancerInterceptor拦截,给到了负载均衡客户端:RibbonLoadBalancerClient。
- 负载均衡客户端:RibbonLoadBalancerClient获取url中的服务名称:userservice并给到动态服务列表负载均衡器:DynamicServiceListLoadBalancer。
- 动态服务列表负载均衡器:DynamicServiceListLoadBalancer从EurekaServer中拉取服务提供者(user-service)的信息列表:localhost:8081、localhost:8082。
- 动态服务列表负载均衡器:DynamicServiceListLoadBalancer将得到的信息列表给到负载均衡规则器:IRule进行负载均衡算法,选择一个服务信息,重新给到负载均衡客户端:RibbonLoadBalancerClient。
- 负载均衡客户端:RibbonLoadBalancerClient修改请求地址(url):http://userservice/user/1,变为:http://localhost:8081/user/1,进而在浏览器成功访问。
二、Ribbon - 负载均衡策略
Ribbon的负载均衡策略是一个叫做IRule
的接口来定义的,每一个子接口都是一种规则。
1.常见的负载均衡规则
2.调整负载均衡规则
①代码方式
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class,defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate并注入Spring容器
*/
@Bean
@LoadBalanced//实现负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
//重新定义IRule,达到调整负载均衡规则的效果
@Bean
public IRule randomRule() {
//默认是轮询规则,这里负载均衡策略调整成——随即规则
return new RandomRule();//随机规则
}
}
- 此方式作用范围是全局的,配置后在此微服务中,无论调用哪一个其他的微服务,使用的都是此处配置的负载均衡规则。
②配置文件方式
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则——随机规则
- 此方式的作用范围仅针对当前微服务,因为配置文件中先指定了服务名称,再指定的负载均衡规则。
三、Ribbon - 饥饿加载
- Ribbon加载策略:
-
- 懒加载:默认采用的加载方式,在第一次访问时才会去创建LoadBalanceClient,请求时间会很长。
- 饥饿加载:在项目启动时就将LoadBalanceClient加载好,降低第一次访问的耗时。
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients:
- userservice # 指定饥饿加载的服务名称,可加载多个