一、ribbon概述 1、ribbon简介 目前主流的负载方案分为以下两种:
集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。 客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡。 Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
常见的负载均衡算法包括:
轮询算法(Round Robin):按顺序将请求依次分配给后端服务器,循环往复。 加权轮询算法(Weighted Round Robin):在轮询算法的基础上,给每台服务器设置一个权重,按照权重比例分配请求。 最小连接数算法(Least Connections):将请求分配给当前连接数最少的服务器,有助于避免某些服务器压力过大。 加权最小连接数算法(Weighted Least Connections):结合权重和最小连接数,根据服务器权重和当前连接数决定请求分配。 IP哈希算法(IP Hash):根据客户端IP地址的哈希值来确定请求分配的服务器,确保同一客户端的请求始终发送到同一台服务器。 最少响应时间算法(Least Response Time):根据服务器的响应时间来决定请求的分配,将请求发送到响应时间最短的服务器。 随机算法(Random):随机选择一个后端服务器来处理请求,适用于对后端服务器负载均衡要求不那么严格的场景。
每种算法都有其适用的场景,根据实际需求和系统特点选择合适的负载均衡算法可以提高系统性能和稳定性。
3、Ribbon模块
二、Spring Cloud快速整合Ribbon 1、引入依赖
2、添加@LoadBalanced注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
3、 修改controller
@Autowired
private RestTemplate restTemplate;
// version2
@GetMapping("/findOrderByUserId/{userId}")
public R findOrderByUserId(@PathVariable("userId") Integer userId) {
String url = "http://mall-order/order/findOrderByUserId/" + userId;
// import com.baomidou.mybatisplus.extension.api.R;
R result = restTemplate.getForObject(url, R.class);
return result;
}
此时的restTemplate已经具备了自动获取服务列表并根据负载均衡算法确定出要调用服务的能力。我们只需要根据服务名称调用服务即可,不再需要关心服务具体的url以及调用哪个服务。
自定义负载均衡策略 通过实现IRule接口可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。3.1、实现基于权重的负载均衡策略
@Slf4j
public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {
@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
@Override
public Server choose(Object key) {
DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
String serviceName = loadBalancer.getName();
NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
try {
//nacos基于权重的算法
Instance instance = namingService.selectOneHealthyInstance(serviceName);
return new NacosServer(instance);
} catch (NacosException e) {
log.error("获取服务实例异常:{}", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}
配置自定义的策略 1)全局配置
@Bean
public IRule ribbonRule() {
return new NacosRandomWithWeightRule();
}
2)局部配置 修改application.yml:
# 被调用的微服务名
mall-order:
ribbon:
# 自定义的负载均衡策略(基于随机&权重)
NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule
文章链接
发表评论