目录
[Ribbon 负载均衡原理](#Ribbon 负载均衡原理)
[Ribbon 负载均衡规则](#Ribbon 负载均衡规则)
[Ribbon 负载均衡自定义化](#Ribbon 负载均衡自定义化)
[Ribbon 设定饥饿加载](#Ribbon 设定饥饿加载)
Ribbon 负载均衡原理
工作流程
- order-service 使用 RestTemplate 发送请求,随后该请求将会被 Ribbon 所拦截
- Ribbon 从 url 中拿取服务名 userservice,并到 eureka-server 拉取属于该服务名的服务列表
- Ribbon 通过负载均衡算法从服务列表中拿取一个 ip + 端口
- Ribbon 将重新修改 url,并将该请求发送出去
- 下图为底层工作流程
Ribbon 负载均衡规则
- Ribbon 的负载均衡规则是由 IRule 接口所定义的
- IRule 的每一个子接口均可视为一种规则
- IRule 接口的默认实现为 ZoneAvoidanceRule
- 根据 zone 选择服务列表,然后轮询
验证 Ribbon 的默认负载均衡规则
- 查看 user-service:8081 的日志信息,查询了用户id 1 和 3
- 查看 user-service:8082 的日志信息,查询了用户id 2 和 4
- 由此可以看出 order-service 发出的请求,以轮询的方式被接收
Ribbon 负载均衡自定义化
- 通过定义 IRule 实现可以修改默认负载均衡规则
代码方式修改规则
- 在 order-service 中的 OrderApplication 类中,定义一个新的 IRule
- 此处我们将负载均衡规则修改为 随机规则
java@Bean public IRule randomRule() { return new RandomRule(); }
配置文件方式修改规则
- 在 order-service 的 application.yml 文件中,添加新的配置也可以修改规则
- 此处我们还是将负载均衡规则修改为 随机规则
userservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
小总结
- 代码方式:配置更加灵活,但修改时需要重新打包发布
- 配置方式:直观、方便,无需重新打包发布,但是无法做全局配置
Ribbon 设定饥饿加载
- Ribbon 默认采取懒加载的方式,也就是只有第一次访问时才会去创建
- 即第一次访问时才会去创建 LoadBalanceClient,请求时间会很长
设定饥饿加载
- Ribbon 可以修改为饥饿加载
- 饥饿加载会在项目启动时创建,降低第一次访问的耗时
- 通过在 application.yml 文件中添加下方配置开启 Ribbon的饥饿加载
XMLribbon: eager-load: enabled: true # 开启饥饿加载 clients: # 指定饥饿加载的服务名称 - userservice # - xxservice 按照该格式指定多个服务名称