一、负载均衡
1、为什么RPC远程调用框架(Dubbo、SpringCloud)都采用本地负载均衡,而不是Nginx?
Nginx:所有请求都需要先交给Nginx,再由Nginx进行转发实现负载均衡
本地负载均衡:本地负载均衡从注册中心上获取服务信息列表(缓存在jvm),然后在本地使用rpc远程调用技术,比如HttpClient或者Netty,本地负载均衡更容易实时刷新最新的数据
总结:本地负载均衡效率比Nginx高
2、几种负载均衡策略
(1)random(随机调用,常用) :可以对provider(生产者)不同实例设置不同的权重,会按照权重来负载均衡,。权重越大分配流量越高
(2)roundrobin:均匀地将流量打到各个机器上去,但是如果各个机器的性能不一样,容易导致性能差的机器负载过高。所以此时需要调整权重,让性能差的机器承载权重小一些,流量少一些
(3)leastactive:自动感知,如果某机器性能越差,那么接收的请求越少越不活跃,此时就会给越不活跃的性能差的及其更少请求
(4)consistanthash(一致性Hash算法):相同参数的请求一定分发到一个provider(生产者)上去,provider挂掉的时候,会基于虚拟节点均匀分配剩余的流量,抖动不会太大。如果需要的不是随机负载均衡,是要一类请求都到一个节点,那就走这个一致性Hash策略
3、软负载和硬负载的区别
软负载:通过服务器上安装负载均衡软件或者使用本地负载均衡算法实现负载均衡的,例如:LVS、Nginx、Haproxy、Ribbon
硬负载:F5负载均衡是硬件负载均衡的一种。硬件负载均衡,救世主哎服务器节点之间安装专门的硬件进行负载均衡的工作
4、基于Zookeeper实现Dubbo动态负载均衡
服务端:
启动服务时注册到Zookeeper注册中心,创建一个持久节点为service,在service持久节点下面创建多个不同的临时节点存放服务列表项信息,临时节点内容存放服务调用地址
客户端:
从Zookeeper节点上获取最新service持久节点下面服务节点信息,然后在本地使用负载均衡算法,随机分配调用远程服务
如何实现动态负载均衡?
客户端采用事件监听service持久节点下面节点是否发生变化,如果发生变化Zookeeper服务端会及时的将最新数据推送给Zookeeper客户端
如图:
二、集群容错
1.Dubbo集群容错策略
(1)failover cluster模式(默认策略):失败自动切换,自动重试其他机器,常用于读操作
(2)failfast cluster模式(快速失败):一次调用失败就立即失败,常用于非幂等的写操作,比如新增一条记录(调用失败就立即失败)
(3)failsafe cluster模式(异常忽略):出现异常时忽略掉,常用于不重要的接口调用,比如日志记录
(4)failback cluster模式:失败后自动记录请求,然后定时重发,比较适合于写消息队列
(5)forking cluster模式:并行调用多个provider,只要一个成功就立即返回。常用于实时性要求比较高的读操作,但是会浪费更多的服务资源,可通过forks="2"来设置最大的并行数
(6)broadcacst cluster模式:逐个调用所有的provider。任何一个provider出错则报错。常用于通知所有提供者更新缓存或日志等本地资源信息。
三、动态代理
1.Dubbo动态代理策略
默认使用javassist动态字节码生成,创建代理类。但是可以通过SPI扩展机制配置自己的动态代理策略