Version: Next
Ribbon 负载均衡
Ribbon 中定义了一个
IRule
接口package com.netflix.loadbalancer;public interface IRule {Server choose(Object var1);void setLoadBalancer(ILoadBalancer var1);ILoadBalancer getLoadBalancer();}显然,其用来选择具体的负载均衡策略
Ribbon 自带负载均衡策略
IRule
在 Ribbon 中存在的7
个实现类:
实现类 负载均衡策略 com.netfix.loadbalancer.RoundRobinRule
轮询 com.netfix.loadbalancer.RandomRule
随机 com.netfix.loadbalancer.RetryRule
先按照 轮询
获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务WeightedResponseTimeRule
对 轮询
的扩展,响应速度越快的实例选择去那种越大,越容易被选择BestAvailableRule
会先过滤掉由于多次访问故障从而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 AvailabilityFilteringRule
先过滤掉故障实例,再选择并发较小的实例 ZoneAvoidanceRule
复合判断 server
所在区域的性能和server
的可用性选择服务器
更改负载均衡策略
注意
自定义配置类不能放在 @ComponentScan
所扫描的当前包及其子包下,否则自定义配置会被所有 Ribbon 客户端共享,达不到特殊化定制的目的
提示
先恢复环境
- 使用 Eureka 作为服务注册中心,恢复为 Eureka Server 集群,开启保护模式,恢复默认心跳时间,超时时间
- 将
8001
、8002
都注册到注册中心
在SpringBoot中,默认 @ComponentScan
扫的就是 主启动类 所在的包及其子包,因此,要跳到主启动类所在包外面去建一个新包
在
order80
新建com.bsx.myrule
包
新建
MySelfRule
负载均衡规则类,其实一个 Spring 配置类/*** 自定义 Ribbon 负载均衡规则*/@Configurationpublic class MySelfRule {@Beanpublic IRule myRule() {return new RandomRule(); // 随机节点策略}}在主启动类添加
@RibbonClient
注解
name
:CLOUD-PAYMENT-SERVICE
,Eureka Server 中的服务名configuration
:填写自定义负载均衡策略类MySelfRule.class
@SpringBootApplication@EnableEurekaClient@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class, args);}}
此时,多次访问 http://127.0.0.1:80/consumer/payment/get/2
,会发现端口号随机变化