网站首页 > 技术教程 正文
LB负载均衡是什么
负载均衡是将用户请求均摊到多台服务器上,从而实现系统的高可用
Ribbon和Nginx负载均衡的区别
Nginx是服务器负载均衡,浏览器会把所有请求交给nginx,再由nginx转发请求到各个服务器
Ribbon是本地负载均衡,先从注册中心拿到服务列表缓存到本地,在调微服务接口的时候根据负载均衡策略来决定调用哪台服务器
集成Ribbon
由于nacos已经集成了ribbon的包,所以不需要再引入ribbon的依赖
消费端和服务端都需要注册进注册中心
使用RestTemplate来访问,加个LoadBalanced注解就可以使用ribbon了
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
然后起两个服务A和B,A端作为调用者,B端作为服务者,
A端代码如下,其中需要注意的是url里面没有直接指定B端的ip,而是使用服务名代替了,这样做的目的是为了负载均衡,因为一个服务名可以起好几个服务,可以通过spring.application.name来指定服务名
@GetMapping("order")
public String order() {
String url = "http://payment/pay";
String result = restTemplate.postForObject(url, null, String.class);
log.info(result);
return "下单成功";
}
Ribbon负载均衡算法
ribbon使用起来超级简单,重点是要掌握ribbon的负载均衡算法。
内置负载均衡算法
- RoundRobinRule,轮询
- RandomRule,随机
- RetryRule,重试策略,在轮询的基础上,如果遇到服务失败则在指定时间内重试
- WeightedResponseTimeRule,响应时间加权策略,响应速度越快的实际选择权重越大,越容易被选择
- BestAvailableRule,最佳可用策略,会过滤掉处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- AvailabilityFilteringRule,可用过滤策略,先过滤掉故障实例,再选择并发小的实例
- ZoneAvoidanceRule,区域过滤策略,还是用的轮询,只不过会剔除不可用Zone(云服务区域)的server,默认算法
算法有点多,可以通过分类记忆,
一组是轮询的,RoundRobinRule,轮询,RetryRule,轮询会重试,ZoneAvoidanceRule,去除不可用zone后轮询
一组是最小并发的,BestAvailableRule是剔除跳闸的选一个最小并发的,AvailabilityFilteringRule是剔除故障的选择一个最小并发的,WeightedResponseTimeRule是根据响应时间来选择
在这里纠正一个误区就是新版本的ribbon默认算法不是轮询而是区域权重策略,我们可以看下源码来证实。
当加了LoadBalanced注解后,RestTemplate在发送请求的时候会被ClientHttpRequestInterceptor拦截,LoadBalancerInterceptor是ClientHttpRequestInterceptor的实现类,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer
我们跟进LoadBalancerInterceptor方法,发现选择服务的代码为ZoneAwareLoadBalancer的chooseServer方法
?
再跟进去,发现调用的是BaseLoadBalancer的chooseServer方法,里面调用了IRule接口的choose方法,IRule的实现类是ZoneAvoidanceRule
?
替换默认负载均衡策略
全局替换
@Bean //修改轮询规则为随机
public IRule iRule(){
return new RandomRule();
}
局部替换,比如只想替换某一个服务的负载均衡策略
payment: #这个是微服务的id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #最佳可用策略
?
猜你喜欢
- 2024-10-10 Nginx和Firewall都可以实现四层转发,你喜欢哪一个?
- 2024-10-10 nginx做转发时,带下划线字段的header内容丢失
- 2024-09-14 NGINX 应用性能优化指南(第二部分):反向代理缓冲
- 2024-09-14 10《Nginx 入门教程》Nginx 的反向代理(上)
- 2024-09-14 Kubernetes中如何转发请求到集群外?
- 2024-09-14 Nginx 全面攻略:动静分离、压缩、缓存、黑白名单、跨域、高可用
- 2024-09-14 Portainer实用教程Portainer如何使用 Nginx 容器实现端口转发?
- 2024-09-14 Nginx TCP代理转发和负载均衡(nginx代理tcp转http)
- 2024-09-14 记一次nginx无法转发到后端的问题
- 2024-09-14 Nginx的请求数据处理流程(nginx的请求数据处理流程是什么)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)