Ribbon负载均衡
通过上图可以看到,orderService向userService发起请求经过了一下流程:
1、orderService向userService发起请求;
2、LoadBalancerInterceptor会拦截该请求,等到请求中的服务名称userService,并将服务名称交给RibbonLoadBalancerClient;
3、RibbonLoadBalancerClient再将服务名称交给DynamicServerListLoadBalancer;
4、DynamicServerListLoadBalancer向Eureka服务中心请求服务列表(服务发现)
5、DynamicServerListLoadBalancer再通过IRule采用负载均衡策略,选择合适的服务地址,将挑选出来的服务地址返回给RibbonLoadBalancerClient;(负载均衡)
6、RibbonLoadBalancerClient获取到服务地址后,修改原有的url,将地址信息(ip:port)替换服务名称(userService)
,发起请求进行服务调用。
定义负载均衡策略
对于负载均衡策略的定义有两种方式:
- 全局模式
- 指定服务模式
全局模式
首先我们来介绍全局模式:全局模式的含义,就是指对任何服务的调用均采用该策略,我们只需要在启动类注册一个IRule类型的Bean即可。例如我们采用随机策略:
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
/**
* 创建RestTemplate并注入Spring容器
*/
@Bean
@LoadBalanced //采用负载均衡策略
public RestTemplate restTemplate() {
return new RestTemplate();
}
/**
* 定义负载均衡随机策略
* @return
*/
@Bean
public IRule randomRule(){
return new RandomRule();
}
}
这样,对于OrderApplication下的任何服务的调用,都会采用随机策略。
指定服务模式
在 调用方的application.yml
文件中,对具体的服务进行负载均衡的配置即可:
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
如上所示,我们完成了对userService的负载均衡策略的配置。