(1)介绍dubbo原理,暴露服务过程。
下图是暴露服务流程:
image.png
首先dubbo暴露服务有两种情况:
(1)延时暴露
(2)非延时暴露
下面说说非延时暴露:
dubbo在实例化完bean之后,在刷新容器最后一步发布ContextRefreshEvent事件的时候,通知实现了ApplicationListener的类执行回调onApplicationEvent,该事件会调用ServiceConfig的export方法,此export就是服务暴露。总体来说dubbo的服务就在onApplicationEvent事件中发布
那么dubbo是如何在onApplicationEvent中发布服务的呢?
暴露流程
(1)首先将服务封装成invoker,换句话说invoker中封装了服务的实现类。
(2)将invoker封装成exporter并缓存起来,缓存中使用invoker的url作为key。
(3)服务端Server启动并监听窗口(当请求过来时,根据请求信息生成key,并去缓存中寻找相应的invoker,如果找到了invoker就完成了调用)。
export的步骤简单介绍
(1)首先会检查各种配置信息,填充属性。
(2)加载注册中心
(3)根据配置的所有协议和注册中心url分别进行服务暴露(本地服务/远程服务)
(3.1)首先要获取invoker
(3.2)生成Exporter,并进行缓存
此处所有协议和注册中心的意思,我的理解是:需要一个应用层程序进行进程间通信,注册中心是将生成好的Exporter推送到注册中心,即将服务提交至注册中心
export方法中加载注册中心的工作细节
(1)export方法会判断是否是延迟暴露,如不是则立即执行doExport方法。
(2)doExport方法中会执行一系列的检查方法,然后调用doExportUrls方法。
(3)doExportUrls方法会首先调用loadRegistries获取所有注册中心url。
export方法中根据配置的协议进行服务暴露的工作细节
(1)获取所有注册中心之后,会遍历调用doExportUrldFor1Protocol方法,此方法根据不同的协议将服务转换成url形式,一些参数配置参数会附在url后面。
(2)根据scope的值进行服务暴露(即暴露/远程暴露/本地暴露)。
export方法中将服务暴露为远程服务的工作细节
(1)利用动态代理技术,将服务接口生成代理。
(2)调用Protocol生成的适配类的export方法,将服务接口代理交给export处理。
(3)export方法按照上述的工作流程,完成对服务的暴露。
个人理解:invoker的存在是生成代理类,这样消费者调用服务时候不会直接调用本地实例。而export的过程是标准化的一个过程,通过配置的协议将服务调用,服务信息标准化。
sentinel进行熔断,限流的原理以及流程
首先搞清楚熔断与限流的区别:
A->B->C 表示调用关系。
当B->C的时候发生突发流量的访问,
网友评论