服务提供者启动时,会将自己的URL地址写入zk上的/dubbo/${}/目录
Dubbo会先调用figs方法检查配置是否合理,如果合理则调用ocol方法通过配置组装URL,然后调用该方法暴露服务
注:报名中心
客户端首先会检查配置是否合理,然后创建实例,生成服务消费者链接向注册中心注册,然后订阅。 由于一项服务可能部署在多台服务器上,因此该节点下的数据会生成多个节点。 ,这时候就需要将多个服务节点合并为一个,生成一个。
:
分布式协调和通知:不同的客户端注册到互联网上的同一个数据节点,并监听数据节点的变化。 如果数据节点发生变化,所有订阅的客户端都可以收到相应的通知并进行相应的处理。
2)集群管理:
A。 如果客户端注册监听该数据节点,那么当数据和列表内容或其子节点列表发生变化时,服务器会向订阅的客户端发送变化通知。 b. 对于 上创建的临时节点,一旦客户端与服务器之间的会话失败,临时节点也会被自动删除。
3)负载均衡:com..dubbo.rpc..类
(默认使用)
随机,按权重设置随机概率。 某个路段发生碰撞的概率较高,但调用量越大,分布越均匀,使用概率后权重也更均匀,有利于动态调整权重。 该方法的具体方法是,首先遍历每个服务提供机器,获取每个服务的权重,然后累加该权重值,以确定每个服务提供者的权重是否相同。 如果每个调用者的权重不同,并且每个权重都大于0,那么会根据权重的总值生成一个随机数,然后用这个随机数每次减去调用者的权重根据呼叫者的数量,直到计算出当前服务提供商的随机数小于0。就选择该提供商! 另外,如果每台机器的权重相同,那么权重就不会参与计算,直接选择随机算法生成的一个选择,完全是随机的。 可以看出,随机调用方法,
轮询,根据约定后的权重设置轮询比例。 有一个缓慢的提供者类是一个请求问题。 例如:第二台机器很慢,但没有挂掉。 当请求传输到第二台机器时,它就卡在那里。 随着时间的推移,所有请求都卡在第二台机器上。 轮询调用,轮询调用的过程主要是维护一个局部变量()来存储调用者和权重值的对应关系,然后遍历每个调用者,比较调用者和当前权重是否大于0。输入值,然后累加重量值。 还有一个全局变量的映射。 找到第一个服务调用者,首先求每个服务的键值之和,可以理解为标识第一个调用者的唯一键,然后给它对应的值,保证原子+1(r是原子的),然后取这个值的模总权重,然后每次将它的权重值-1,知道它的模和总权重值等于0,选择调用者,这可以称为“减少权重和取模数”(只是计算水平,并非真正的减重)。 总结:轮询调用并不是简单的一次次调用,而是根据权重的值进行循环。
最小活跃通话数,同一活跃号码的随机数,活跃数是指通话前后的计数差值。 让慢速提供者收到更少的请求,因为对于慢速提供者来说,调用前后的计数差异会更大。 最不活跃号码呼叫方法:该方法的主要作用是根据服务提供商的运行状况来选择服务器。 主要思想是遍历每个调用者,然后获取每个服务器的运行状态。 如果当前运行的运行状态小于最小状态-1,则保存在 中的第一个位置,并判断所有调用者的权重相同,然后直接返回那个调用者(这里的逻辑是:找到最不活跃的) (代码层的响应为:value))。 如果计算出的权重值与最小权重值相同,则将其保存到数组中,并累加权重值。 如果当前权重值不等于初始值,则确定并非所有呼叫者都具有不同的权重。 然后再次遍历,取权重累加值的随机数生成权重偏移量,累加,小于0时返回给调用者。如果这些都不匹配,就随机选择一个索引返回给调用者!
一致的Hash,具有相同参数的请求总是发送到同一个提供者。 当某个提供者宕机时,原来发送给该提供者的请求会基于虚拟节点传播到其他提供者,不会引起剧烈的变化。
注意调度策略:
所有发送的事件方法和心跳请求都是在IO线程上执行的。
1. all :除了发送的事件回调方法和心跳外,全部在线程池上执行。
2. : 与all类似,唯一的区别是在不指定线程池的情况下all可以使用共享线程池。 这个区别就相当于没有。
3. :只有请求事件在线程池中执行,其他的在IO线程上执行。
4.:请求事件在线程池中执行,连接和断开事件排队执行(一个线程的线程池)
5.:所有事件都在IO线程中执行。