目录
一.负载均衡的两种方式
二.手写随机负载均衡算法
三.使用Ribbon实现负载均衡
四.整合Ribbon
五.重构代码(使用Ribbon实现负载均衡)
六.Ribbin内置的负载均衡规则
七.细粒度配置负载均衡算法(配置文件配置)
1.Ribbon细粒度配置某个微服务使用指定负载均衡算法
2.Ribbon其他配置
3.Ribbon默认是懒加载
八.扩展Ribbon-同集群优先调用
九.扩展Ribbon-基于元数据的版本控制
其他内容:Ribbon介绍 (Java代码配置篇)
# 服务器端负载均衡:Nginx(相关文章链接)
# 客户端负载均衡:Ribbon等...
区别主要在于:服务器端负载均衡在服务器端拦截请求,然后转发给不同的服务器。二客户端测负载均衡则先确定需要访问的服务,在本地已经通过负载均衡算法实现调用目标服务器。客户端侧负载均衡依赖于服务发现和服务注册组件。
参考文章:Nacos学习笔记
文中第三章第5小点的代码14——19行就是一个实现负载均衡的办法。
Ribbon会自动获取Nacos Server的服务列表,在微服务需要访问时,会调用经过Ribbon计算过的地址。
# 加依赖 (继承了Nacos后不需要添加任何依赖,已经内置了:Nacos集成笔记)
# 写注解 (在restTemplate方法上添加@LoadBalanced注解即可)
package com.shixin.contentcenter;
/**
* @MapperScan 扫描Mybatis哪些包里面的接口
*
*/
@MapperScan("com.shixin")
@SpringBootApplication
public class ContentCenterApplication {
public static void main(String[] args) {
SpringApplication.run(ContentCenterApplication.class, args);
}
//在spring容器中创建一个对象 类型为:RestTemplate,对象名是方法名:restTemplate
//此处将RestTemplate注入容器是为了方便使用。
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
# 写配置(无需配置)
@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ShareService {
private final ShareMapper shareMapper;
private final RestTemplate restTemplate;
public ShareDTO findById(Integer id){
Share share = shareMapper.selectByPrimaryKey(id);
Integer userId = share.getUserId();
//在内容中心发起请求时,Ribbon会自动将user-center解析成Nacos服务列表中已注册的服务地址(通过负载均衡算法)
UserDTO userDTO = restTemplate.getForObject(
"http://user-center/users/{userId}",
UserDTO.class,
userId);
ShareDTO shareDTO = new ShareDTO();
BeanUtils.copyProperties(share,shareDTO);
shareDTO.setWxNickName(userDTO.getWxNickname());
return shareDTO;
}
}
(配置文件中使用规则名称进行配置,默认使用轮询算法ZoneAvoidanceRule)
规则名称 | 特点 |
BestAvailableRule | 选择一个最小的并发请求的Server,逐个考察Server,如果Server被 |
RandomRule | 随机选择一个Server |
ResponseTimeWeightedRule | 已废弃,作用同WeightedResponseTimeRule |
RetryRule | 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | 轮询选择,轮询index,选择index对应位置的Server |
WeightedResponseTimeRule | 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低 |
ZoneAvoidanceRule | 复合判断Server所zone的性能和Server的可用性选择Server,在没有Zone的环境下,类似于轮询(RoundRobinRule) |
AvailabilityFilteringRule | 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态 |
(基本都使用这种方式,没有代码配置的坑,也可以实现线上修改和发布,且配置文件的配置优先级比Java代码更高,即配置文件和Java代码同时配置,配置文件优先生效)
为调用微服务user-center时指定负载均衡算法。
user-center:
ribbon:
#Ribbon实现负载均衡算法配置,前面的key是固定写法,后面是负载均衡算法的全路径
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
可配置项:
配置文件配置方式:
配置解读:
当下面代码调用的时候,才会创建名为user-center的Ribbon Client,就会导致首次请求过慢的问题。
UserDTO userDTO = restTemplate.getForObject(
"http://user-center/user/{userId}",
UserDTO.class,
userId)
解决方案:配置文件配置
ribbon:
eager-load:
enabled:true
clients:user-center,xxx,xxx
此种扩展需要代码配置搭配配置文件一起使用,因代码篇幅较长。内容移至Java代码配置篇。
文章第二章:扩展Ribbon-同集群优先调用
链接:扩展Ribbon支持基于元数据的版本管理