当前位置:网站首页>微服务负载均衡器Ribbon实战
微服务负载均衡器Ribbon实战
2022-08-08 10:44:00 【tea-Sir】
1.什么是Ribbon
目前主流的负载均衡方式有两种:
集中式负载均衡,在客户端和服务端中间建立一个独立的代理来做负载均衡,硬件比如F5;软件比如Nginx。
根据客户自己的情况做负载均衡,Ribbon 就属于这一种。
Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,
Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
客户端的负载均衡
例如spring cloud中的ribbon,客户端会有一个服务器地址列表,在发送请求前通过负载均衡算法选择一个服务器,然后进行访问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配。
服务端的负载均衡
例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
常见负载均衡算法
随机,通过随机选择服务进行执行,一般这种方式使用较少;
轮训,负载均衡默认实现方式,请求来之后排队处理;
加权轮训,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;
地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。
最小链接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如请求积压数等参数,将请求分配到当前压力最小的服务器上。
Spring Cloud快速整合Ribbon
1) 引入依赖
<!--添加ribbon的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2) 添加@LoadBalanced注解
@Configuration
public class RestConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3) controller
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
String url = "http://mall-order/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);
return result;
}
4)发送结果
Ribbon内核原理
Ribbon原理
两个不同端口的订单服务实例注册到nacos中,用户服务客户端从nacos中获取已注册的订单服务列表,发送请求时,ribbon通过拦截将mall-order服务名替换成对应的ip/端口,最后调用http接口完成负载均衡。
模拟ribbon实现
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id") Integer id) {
String url = getUri("mall-order")+"/order/findOrderByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);
return result;
}
@RequestMapping(value = "/findAccountByUserId/{id}")
public R findAccountByUserId(@PathVariable("id") Integer id) {
String url = "http://mall-account/account/infoByUserId/"+id;
R result = restTemplate.getForObject(url,R.class);
return result;
}
@Autowired
private DiscoveryClient discoveryClient;
public String getUri(String serviceName) {
List<ServiceInstance> serviceInstances = discoveryClient.getInstances(serviceName);
if (serviceInstances == null || serviceInstances.isEmpty()) {
return null;
}
int serviceSize = serviceInstances.size();
//轮询
int indexServer = incrementAndGetModulo(serviceSize);
return serviceInstances.get(indexServer).getUri().toString();
}
private AtomicInteger nextIndex = new AtomicInteger(0);
private int incrementAndGetModulo(int modulo) {
for (;;) {
int current = nextIndex.get();
int next = (current + 1) % modulo;
if (nextIndex.compareAndSet(current, next) && current < modulo){
return current;
}
}
}
Ribbon负载均衡策略
RandomRule: 随机选择一个Server。
RetryRule: 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server。
RoundRobinRule: 轮询选择, 轮询index,选择index对应位置的Server。
AvailabilityFilteringRule: 过滤掉一直连接失败的被标记为circuit tripped的后端Server,并 过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就是检查status里记录的各个Server的运行状态。
BestAvailableRule: 选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。
WeightedResponseTimeRule: 根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低。
ZoneAvoidanceRule: 默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下,类似于轮询(RandomRule)
NacosRule: 同集群优先调用
修改默认负载均衡策略
全局配置:调用其他微服务,一律使用指定的负载均衡算法
@Configuration
public class RibbonConfig {
/** * 全局配置 * 指定负载均衡策略 * @return */
@Bean
public IRule ribbonRule() {
// 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
// mall-user v1--- mall-order v1
//mall-user v2--- mall-order v2
return new NacosRule();
}
}
局部配置:调用指定微服务提供的服务时,使用对应的负载均衡算法
修改application.yml
# 被调用的微服务名 当需要使用局部配置的时候推荐使用这种方式
mall-order:
ribbon:
#指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
# 自定义的负载均衡策略(基于随机&权重)
NFLoadBalancerRuleClassName: com.tuling.mall.ribbondemo.rule.NacosRandomWithWeightRule
边栏推荐
猜你喜欢
随机推荐
关于那些我们都听过的营销工具—优惠券
MySQL源码解析之执行计划
Optional common method analysis
【C语言】[编程题]倒置字符串
列存储数据库是什么呢?
彻底弄清楚session,cookie,sessionStorage,localStorage的区别及应用场景(面试向)
我用开天平台做了一个城市防疫政策查询系统【开天aPaaS大作战】
轻量级接口自动化框架(jmeter+ant+jenkins)
列存储数据库是通过什么来定位的呢?
Tensorflow基础概念
Loadrunner12.0.2 installation and Chinese language pack installation (Chinese)
Machine learning model too slow?Look at Intel (R) extension to accelerate
为什么说键值数据库有高可扩展性呢?
有哪些典型的列存储数据库呢?
文档数据库中的文档可以有相同的数据结构嘛?
目标检测中的Classificition Loss
文档数据库和列存储数据库有什么不同的嘛?
关于振弦采集模块及采集仪振弦频率值准确率的问题
自学脚手架——《热学》 by 李椿(第一,二,三,四,五章)
新款“廉价”SUV曝光,安全、舒适一个不落