Dubbo预热和延迟暴露

dubbo有四种负载均衡的方式:

1)RandomLoadBalance:加权随机算法

2)LeastActiveLoadBalance:最小活跃负载均衡

3)ConsistentHashLoadBalance:一致性hash负载均衡

4)RoundRobinLoadBalance:加权轮询负载均衡

dubbo的负载均衡策略,主体对外暴露的是一个接口:LoadBalance。

在dubbo中所有的负载均衡实现类都继承自AbstractLoadBalance,该类实现了LoadBalance接口,并封装了一些公共的逻辑。

负载均衡的入口方法:

 

还有些共用方法,如服务提供者权重计算逻辑:

 

上面是权重的计算过程,该过程主要用于保证当服务运行时长小于服务预热时间时,对服务进行降权,避免让服务在启动之初就处于高负载状态。服务预热是一个优化手段,与此类似的还有 JVM 预热。主要目的是让服务启动后“低功率”运行一段时间,使其效率慢慢提升至最佳状态。

我对比了一下

我们在使用的dubbo版本中的getweight方法和官方最新的有一点出入

 

 

github fix地址:https://github.com/apache/incubator-dubbo/commit/ed66afd9a38d80f839f0381fbd1dc1d3c068bc1c#diff-c5cb2df641f0a7d0553343c757425d2b

修正了预热时间戳的错误,添加“remote”。用户端url的时间戳键

我们现在使用的dubbo版本,这个bug依然存在

 

我们来研究一下 Dubbo 导出服务的过程。

Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。

整个逻辑大致可分为三个部分,

第一部分是前置工作,主要用于检查参数,组装 URL。

第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。

第三部分是向注册中心注册服务,用于服务发现

接下来我们重点看一下,dubbo的一个优化点——延迟暴露

 

在没有设置延迟暴露或者设置delay = -1的情况下,服务导出的入口方法是 ServiceBean 的 onApplicationEvent()

在设置延迟暴露的情况下,服务导出的入口方法是 ServiceBean 的afterPropertiesSet()

 

注:官方文档里面写的是服务导出的入口方法是 ServiceBean 的 onApplicationEvent。

afterPropertiesSet()是ServiceBean继承自InitializingBean的方法,是在初始化bean的时候被调用,

onApplicationEvent()是ServiceBean继承自ApplicationListener的方法,是bean被初始化完成的时候被调用。

先调用afterPropertiesSet(),在调用onApplicationEvent(),在设置延迟暴露的情况下,会直接走afterPropertiesSet()中的export(),官方文档此处不严谨。

 

afterPropertiesSet()会根据条件是否导出服务。

在完成一些变量的初始化之后,会根据是否设置了delay属性来决定是否暴露

 

 

 

注:现在解释一下 supportedApplicationListener 变量含义,该变量用于表示当前的 Spring 容器是否支持 ApplicationListener,这个值初始为 false。在 Spring 容器将自己设置到 ServiceBean 中时,ServiceBean 的 setApplicationContext 方法会检测 Spring 容器是否支持 ApplicationListener。若支持,则将 supportedApplicationListener 置为 true。

 

如果设置了delay属性,则会在afterPropertiesSet()进入export(),在export()进行服务的导出。

 

如果没有设置delay属性,则会在bean初始化完成之后,在刷新容器的最后一步在刷新容器最后一步发布ContextRefreshEvent事件的时候,通知实现了ApplicationListener的类进行回调onApplicationEvent,dubbo会在这个方法中发布服务。

 

 

此处 我们使用的dubbo版本有一个bug

 

在properties文件中

如果设置了delay ,按照逻辑是要先delay在doexport()

而解析JVM参数的逻辑(appendProperties(this);)是在doExport()方法中调用;

所以导致 if (delay != null && delay > 0)判断时,还没有解析JVM参数delay=5000,从而导致这种配置在properties文件中不起作用;

 

在github上面发现作者有修复这个bug

fix地址:https://github.com/cnn112002/incubator-dubbo/commit/0fe72a6f0390ff3673fb1d94f682629ea9fbc28c

 

转载于:https://www.cnblogs.com/BB-525/p/10863518.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dubbo是一个分布式服务框架,它可以帮助我们快速开发分布式系统。Dubbo服务的暴露和引用过程分为以下几个步骤: 1. 服务提供者暴露服务:服务提供者需要在Dubbo中注册服务,并将服务暴露出来。Dubbo提供了多种方式来注册和暴露服务,比如XML配置方式、注解方式等。服务提供者可以选择合适的方式来注册和暴露服务。 2. 服务消费者引用服务:服务消费者需要在Dubbo中引用服务。Dubbo提供了多种方式来引用服务,比如XML配置方式、注解方式等。服务消费者可以选择合适的方式来引用服务。 3. 服务调用:服务消费者可以通过调用Dubbo提供的API来调用服务。Dubbo支持多种调用方式,比如同步调用、异步调用、单向调用等。服务调用的过程中,Dubbo会自动进行负载均衡、容错处理等操作,从而提高系统的可用性和稳定性。 4. 服务监控和管理:Dubbo提供了丰富的监控和管理功能,可以帮助我们了解系统的运行情况和性能瓶颈。比如可以通过Dubbo的监控中心来查看服务的调用次数、调用时间、响应时间等指标,从而帮助我们优化系统的性能。 总的来说,Dubbo服务的暴露和引用过程包括服务提供者的服务暴露、服务消费者的服务引用、服务的调用和服务的监控和管理等步骤。在实际应用中,需要根据具体的业务需求和场景选择合适的Dubbo配置方式和调用方式,从而实现高效、稳定的分布式服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值