dubbo服务暴露、引入、调用过程

dubbo服务暴露、引入、调用过程,第1张

dubbo服务暴露、引入调用过程

dubbo基础看这里,本文参考敖丙的dubbo-扬帆起航.pdf

service:业务层,主要是我们开发的业务逻辑;

config:配置信息;

proxy:服务提供者/消费者都会生成一个代理类,由代理进行远程调用和返回结果;

register:注册层,封装了服务注册与发现;

cluster:路由层,负责具体调用的节点以及调用失败的容错;

monitor:监控层,监控调用次数;

protocol:远程调用层,封装rpc调用;

exchange:封装响应模型;

transport:网络传输层;

serialize:序列化与反序列化。

服务注册

dubbo的服务暴露与消费

服务暴露:

服务的暴露起始于 Spring IOC 容器刷新完毕之后,会根据配置参数组装成 URL来进行本地或者远程调用,由proxy组件根据具体的协议protocol将需要暴露的接口封装成invoker,然后再export 封装一次得到exporter 存入一个 Map 中,供之后的远程调用查找,然后会向注册中心注册提供者的信息。

一、Dubbo中Invoker介绍
Invoker是Dubbo的核心模型。Invoker是Dubbo中的实体域,也就是真实存在的。其他模型都向它靠拢或转换成它,它也就代表一个可执行体,可向它发起invoke调用。在服务提供方,Invoker用于调用服务提供类。在服务消费方,Invoker用于执行远程调用。
二、服务提供方的Invoker
在服务提供方中的Invoker是由ProxyFactory创建而来的,Dubbo默认的ProxyFactory实现类为JavassistProxyFactory

服务引入:

服务的引入时机有两种,第一种是饿汉式,第二种是懒汉式。
饿汉式就是加载完毕就会引入,懒汉式是只有当这个服务被注入到其他类中时启动引入流程,默认是懒汉式。
需要先根据配置参数组装成 URL ,构建 RegistryDirectory 向注册中心注册消费者的信息,并且订阅提供者、配置、路由等节点。
得知提供者的信息之后会进入 Dubbo 协议的引入,会创建 Invoker,期间会包含 NettyClient,来进行远程通信,最后通过 Cluster 来包装 Invoker,默认是 FailoverCluster,最终返回代理类。

服务调用的流程:

调用某个接口的方法会调用之前生成的代理类,然后会从 cluster 中经过路由的过滤、负载均衡机制选择一个 invoker 发起远程调用,此时会记录此请求和请求的 ID 等待服务端的响应。
服务端接受请求之后会通过参数找到之前暴露存储的 map,得到相应的 exporter ,然后最终调用真正的实现类,再组装好结果返回,这个响应会带上之前请求的 ID。
消费者收到这个响应之后会通过 ID 去找之前记录的请求,然后找到请求之后将响应塞到对应的 Future 中,唤醒等待的线程,最后消费者得到响应,一个流程完毕。

SPI 是 Service Provider Interface,主要用于框架中,框架定义好接口,不同的使用者有不同的需求,因此需要有不同的实现,而 SPI 就通过定义一个特定的位置。
Java SPI 在查找扩展实现类的时候遍历 SPI 的配置文件并且将实现类全部实例化,假设一个实现类初始化过程比较消耗资源且耗时,但是你的代码里面又用不上它,这就产生了资源的浪费。因此 Dubbo 就自己实现了一个 SPI,给每个实现类配了个名字,通过名字去文件里面找到对应的实现类全限定名然后加载实例化,按需加载。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5688681.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存