远程调用——Protocol
目标:介绍远程调用中协议的设计和实现,介绍dubbo-rpc-api中的各种protocol包的源码,是重点内容。
前言
在远程调用中协议是非常重要的一层,看下面这张图:
该层是在信息交换层之上,分为了并且夹杂在服务暴露和服务引用中间,为了有一个约定的方式进行调用。
dubbo支持不同协议的扩展,比如http、thrift等等,具体的可以参照官方文档。本文讲解的源码大部分是对于公共方法的实现,而具体的服务暴露和服务引用会在各个协议实现中讲到。
下面是该包下面的类图:
源码分析
(一)AbstractProtocol
该类是协议的抽象类,实现了Protocol接口,其中实现了一些公共的方法,抽象方法在它的子类AbstractProxyProtocol中定义。
1.属性
1 | 复制代码/** |
2.serviceKey
1 | 复制代码protected static String serviceKey(URL url) { |
该方法是为了得到服务key group+”/“+serviceName+”:”+serviceVersion+”:”+port
3.destroy
1 | 复制代码@Override |
该方法是对invoker和exporter的销毁。
(二)AbstractProxyProtocol
该类继承了AbstractProtocol类,其中利用了代理工厂对AbstractProtocol中的两个集合进行了填充,并且对异常做了处理。
1.属性
1 | 复制代码/** |
2.export
1 | 复制代码@Override |
其中分为两个步骤,创建一个exporter,放入到集合汇中。在创建exporter时对unexport方法进行了重写。
3.refer
1 | 复制代码@Override |
该方法是服务引用,先从代理工厂中获得Invoker对象target,然后创建了真实的invoker在重写方法中调用代理的方法,最后加入到集合。
1 | 复制代码protected abstract <T> Runnable doExport(T impl, Class<T> type, URL url) throws RpcException; |
可以看到其中抽象了服务引用和暴露的方法,让各类协议各自实现。
(三)AbstractInvoker
该类是invoker的抽象方法,因为协议被夹在服务引用和服务暴露中间,无论什么协议都有一些通用的Invoker和exporter的方法实现,而该类就是实现了Invoker的公共方法,而把doInvoke抽象出来,让子类只关注这个方法。
1.属性
1 | 复制代码/** |
2.convertAttachment
1 | 复制代码private static Map<String, String> convertAttachment(URL url, String[] keys) { |
该方法是转化为附加值,把url中的值转化为服务调用invoker的附加值。
3.invoke
1 | 复制代码@Override |
该方法做了一些公共的操作,比如服务引用销毁的检测,加入附加值,加入调用链实体域到会话域中等。然后执行了doInvoke抽象方法。各协议自己去实现。
(四)AbstractExporter
该类和AbstractInvoker类似,也是在服务暴露中实现了一些公共方法。
1.属性
1 | 复制代码/** |
2.unexport
1 | 复制代码@Override |
(五)InvokerWrapper
该类是Invoker的包装类,其中用到类装饰模式,不过并没有实现实际的功能增强。
1 | 复制代码public class InvokerWrapper<T> implements Invoker<T> { |
(六)ProtocolFilterWrapper
该类实现了Protocol接口,其中也用到了装饰模式,是对Protocol的装饰,是在服务引用和暴露的方法上加上了过滤器功能。
1.buildInvokerChain
1 | 复制代码private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) { |
该方法就是创建带 Filter 链的 Invoker 对象。倒序的把每一个过滤器串连起来,形成一个invoker。
2.export
1 | 复制代码@Override |
该方法是在服务暴露上做了过滤器链的增强,也就是加上了过滤器。
3.refer
1 | 复制代码@Override |
该方法是在服务引用上做了过滤器链的增强,也就是加上了过滤器。
(七)ProtocolListenerWrapper
该类也实现了Protocol,也是装饰了Protocol接口,但是它是在服务引用和暴露过程中加上了监听器的功能。
1.export
1 | 复制代码@Override |
该方法是在服务暴露上做了监听器功能的增强,也就是加上了监听器。
2.refer
1 | 复制代码@Override |
该方法是在服务引用上做了监听器功能的增强,也就是加上了监听器。
后记
该部分相关的源码解析地址:github.com/CrazyHZM/in…
该文章讲解了远程调用中关于协议的部分,其实就是讲了一些公共的方法,并且把关键方法抽象出来让子类实现,具体的方法实现都在各个协议中自己实现。接下来我将开始对rpc模块的代理进行讲解。
本文转载自: 掘金