赞
踩
dubbo的负载均衡,在集群负载均衡时,Dubbo 提供了多种均衡策略,默认为 random 随机调用。
负载均衡(Load Balance),是指将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。
最常见的负载均衡
这一种古老的方式,通过入口提供不同线路、不同服务器链接的方式,来实现负载均衡,一般在提供下载业务的网站比较常见。
负载均衡分类:
即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如 F5, 也可以是软件,如 nginx),
由该设施负责把访问请求通过某种策略转发至服务端。 常见的集中式的方式
- DNS轮训 大多域名注册商都支持 DNS 轮询,DNS 服务器将解析请求按照配置顺序,逐一分配到不同的 IP 上,这样就完成了简单的负载均衡。
- 反向代理负载均衡 使用代理服务器,可以将请求转发给内部的服务器。Nginx 是比较常见的服务反向代理技术。在 Nginx 中是支持对代理的服务的负载均衡处理的。
- 基于硬件的负载均衡 硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备我们通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。
常见的主流产品: F5 BIG-IP 负载均衡器(LTM) 思科 IOS 路由器 Radware 的 AppDirector 系列
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
通过weight属性指定服务的权重,默认的每个服务都是权重都是100.
但是经过测试服务端配置的负载均衡不起作用
<dubbo:reference id="demoService" interface="com.hww.api.IDemoService" loadbalance="random">
<dubbo:method name="sayHello"/>
<dubbo:method name="sayHi"/>
</dubbo:reference>
<dubbo:reference id="demoService" interface="com.hww.api.IDemoService" >
<dubbo:method name="sayHello" loadbalance="random"/>
<dubbo:method name="sayHi" loadbalance="roundrobin"/>
</dubbo:reference>
<dubbo:service interface="com.hww.api.IDemoService"
ref="demoService" registry="myRegistry"
protocol="dubbo" provider="myProvider" loadbalance="random">
<dubbo:method name="sayHello" timeout="3000"/>
<dubbo:method name="sayHi" timeout="3000"/>
</dubbo:service>
<dubbo:service interface="com.hww.api.IDemoService"
ref="demoService" registry="myRegistry"
protocol="dubbo" provider="myProvider" >
<dubbo:method name="sayHello" timeout="3000" loadbalance="random"/>
<dubbo:method name="sayHi" timeout="3000" loadbalance="random"/>
</dubbo:service>
服务端接口
@Service(interfaceClass = IDemoService.class,loadbalance = “random”,weight = 100)
package com.hww.service; import com.hww.api.IDemoService; import org.apache.dubbo.config.annotation.Method; import org.apache.dubbo.config.annotation.Service; @Service(interfaceClass = IDemoService.class,weight = 100) public class HelloService implements IDemoService { public String sayHello(String s) { System.out.println("负载-------"); return "boot实现Dubbo"; } @Override public String sayHi(String s) { return "boot实现Dubbo"; } }
客户端接口
@Reference(loadbalance = “roundrobin”)
package com.example.dubboconsumerboot; import com.hww.api.IDemoService; import org.apache.dubbo.config.annotation.Reference; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DubboConsumerBootApplicationTests { @Reference(loadbalance = "roundrobin") private IDemoService demoService; @Test void contextLoads() { for (int i = 0; i < 10; i++) { System.out.println(demoService.sayHello("aaaa")); } } }
客户端属性配置
dubbo.consumer.loadbalance=random
服务端属性配置
dubbo.provider.loadbalance=random
方法级优先,接口级次之,全局配置再次之。
如果级别一样,则消费方优先,提供方次之。
3. 负载均衡
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。