首先,我们要明白,我们需要的是什么数据?key和value。那具体是什么呢?key是哪个数据?value是哪个服务器节点?
调用的时候,调用的实际上是方法。然后,方法里有参数。最主要的参数当然是数据。但是,除了我们要处理的数据本身之外,还可能有其他参数,什么参数呢?就是用于负载均衡的参数,这是辅助参数。
//代码,接口定义如下:
方法(第一个参数 //用于负载均衡,第二个参数 //业务数据); 复制代码
注意是第一个参数。不是所有的参数,加一起。也就是说,肯定有个地方配置是哪个参数,作为key。还是默认第一个参数是key?因为没看到哪个地方配置了。答案是默认是第一个参数,作为key。
服务器节点
主要配置几个核心
1.负载均衡算法
你用的是一致性hash负载均衡算法,因为dubbo默认不是一致性hash
2.key
哪个参数作为key?也就是说,要配置哪个参数作为key,默认是第一个参数,所以不需要配置。
3.方法
哪个方法,使用一致性hash?也就是说,要配置方法名字。
配置代码
//服务提供者
<暴露服务 类> <哪个方法 负载均衡算法=一致性hash/> </> 复制代码
方法(String orderId //一致性hash,Order order //业务数据) 复制代码
核心有两个
1.找到哪个负载均衡算法?
2.找到哪个服务器节点?
要找到这两个数据,其实就是找到value。而找到value,需要找到key。
第一个key,是方法名字。就是配置文件里,已经指定了方法名字/负载均衡算法。系统启动的时候,加载配置文件,就已经把所有的key/value,加载到了内存的map里去了。即使没加载,如果是第一次用的时候,才加载,也是把key/value放到map里,目的是下次用的时候,直接从map里取。
第二个key,是方法的第一个参数(默认是第一个参数作为key)。
也就是说,这里用到的数据结构都是map。
blog.csdn.net/Revivedsun/… //里面有源码分析,写的非常清楚
官方文档 //原理讲解的非常详细,原理看这个就够了
dubbo.apache.org/zh-cn/blog/…
dubbo.apache.org/zh-cn/docs/…其他
blog.csdn.net/lz710117239…
zhuanlan.zhihu.com/p/50620367
bumind.com/distributed…
weicheng97.cn/2019/090642…总共就只有2个地方,使用了一致性hash。其他全部是默认的随机。
1.支付
生产者——》调用消费者的接口:写数据到队列。
2.Http通知
处理消息中间件的数据
为什么?
为什么其他地方都是随机,而支付这里要使用一致性hash?
首先,让我们回归本质,看一下一致性hash解决什么问题,理解了解决什么问题,就知道这里为什么使用一致性hash。
一致性hash,是因为要更好的解决负载均衡的问题。怎么叫更好?就是更加平均 均衡 公平。总之,就是这个意思。
也就是说,不同的负载均衡算法,公平性是不一样的。
公平性,是负载均衡的一个最重要的指标。
还有一个指标是,容错。就是有一个节点挂了怎么办?挂了之后,结果就是影响这个节点的请求。为了把每个节点挂掉这种情况的影响降到最小,那么就使用一致性hash。因为一致性hash,只影响相邻的两个节点,而不是所有节点的数据都打乱了。