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,给每个实现类配了个名字,通过名字去文件里面找到对应的实现类全限定名然后加载实例化,按需加载。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)