Ribbon是负责负载均衡的,我们只知道在注入RestTemplate时在其上面加入了@LoadBalanced注解,就可以实现负载均衡,那么具体是怎么实现的呢?
首先 微服务客户端会通过要访问的服务名称发起访问请求,Ribbon会通过LoadBalancerInterceptor拦截器拦截住这个请求,然后执行其中的intercept方法,在这个方法中执行一个名叫getHost()的方法,得到host也就是我们所写的微服务的名称。然后执行execute()方法,通过servicedId访问Eureka拿到服务列表,返回类是DynamicServerListLoadBalancer,存放着服务名称对应的ip+端口列表。
在下一步就是通过通过调用getServer()方法,选择负载均衡,期间会有一个选择方法 chooseServe(),选择负载均衡的规则,而负载均衡的规则是有IRule接口制定的,他有7个实现类,也就是有7种负载均衡规则,默认使用的是轮询,还有随机、权重、可用服务的最小并发等负载均衡算法。
想要改变Ribbon的负载均衡策略也很简单 一共有两种
第一种 ,全局改变,也就是访问所有的微服务都会被指定使用同一种负载均衡策略。
就是在配置类中加入以下代码
@Bean public IRule randomRule(){ return new RandomRule(); }
这段代码代表访问所有的微服务全都是用随机策略。
第二种是指定访问某个微服务时使用某一种负载均衡策略,而且好处是这种是可以写在配置文件中
在application.yml配置文件中加入
微服务名: # 给某个微服务配置负载均衡规则,这里是userservice服务 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
这种代表访问某个微服务时,使用随机的策略。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)