Dubbo框架学习-重要概念理解
2017-11-23 00:22
441 查看
ProxyFactory
ProxyFactory是代理工厂,在dubbo中主要有两个作用,我们可以通过源码来分析接口作用@SPI("javassist") public interface ProxyFactory { /** * create proxy. * 针对Client端,创建服务端接口的代理对象,例如DemoService的代理对象 * 一个Invoker对象 * @param invoker * @return proxy */ @Adaptive({Constants.PROXY_KEY}) <T> T getProxy(Invoker<T> invoker) throws RpcException; /** * create invoker. * 针对server端,将服务对象的具体实现,例如DemoServiceImpl包装成 * @param <T> * @param proxy:服务的具体实现类型引用 DemoServiceImpl * @param type:接口的Class类型 * @param url:URL对象,如果是远程服务暴露,则为服务接口名,注册中心URL,端口,协议(dubbo)等信息 * @return invoker */ @Adaptive({Constants.PROXY_KEY}) <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException; }
Invoker
Invoker是指可执行的对象,在dubbo中是由代理工厂ProxyFactory的getInvoker生成的。根据上述方法getInvoker(T proxy, Class type, URL url)可以看出,Invoker对象在dubbo框架中主要分为三类(后续详细讲解):1.1. 本地执行Invoker,服务在本地暴露时,则Invoker是指本地执行的。
1.2. 远程通信Invoker,服务进行远程暴露,ProxyFactory生成远程Invoker。
1.3. 多个远程通信的Invoker聚合成集群版的Invoker。
Invoker是指可执行的对象,则调用Invoker的invoke方法则能获得执行结果。该接口的源码如下:
public interface Invoker<T> extends Node { /** * get service interface. * * @return service interface. */ Class<T> getInterface(); /** * invoke. * @param invocation * @return result * @throws RpcException */ Result invoke(Invocation invocation) throws RpcException; }
Protocol
protocol在dubbo中是协议的意思,该接口主要有两个方面的功能。1.1. 服务端通过Protocol的export(Invoker)方法将ProxyFactory生成的Invoker对象暴露成远程服务或本地服务的引用Exporter。
1.2. 客户端consumer通过Protocol的refer(Invoker,Url)方法引用远程服务。
@SPI("dubbo") public interface Protocol { /** * 获取缺省端口,当用户没有配置端口时使用。 * * @return 缺省端口 */ int getDefaultPort(); /** * 暴露远程服务:<br> * 1. 协议在接收请求时,应记录请求来源方地址信息:RpcContext.getContext().setRemoteAddress();<br> * 2. export()必须是幂等的,也就是暴露同一个URL的Invoker两次,和暴露一次没有区别。<br> * 3. export()传入的Invoker由框架实现并传入,协议不需要关心。<br> * * @param <T> 服务的类型 * @param invoker 服务的执行体 * @return exporter 暴露服务的引用,用于取消暴露 * @throws RpcException 当暴露服务出错时抛出,比如端口已占用 */ @Adaptive <T> Exporter<T> export(Invoker<T> invoker) throws RpcException; /** * 引用远程服务:<br> * 1. 当用户调用refer()所返回的Invoker对象的invoke()方法时,协议需相应执行同URL远端export()传入的Invoker对象的invoke()方法。<br> * 2. refer()返回的Invoker由协议实现,协议通常需要在此Invoker中发送远程请求。<br> * 3. 当url中有设置check=false时,连接失败不能抛出异常,并内部自动恢复。<br> * * @param <T> 服务的类型 * @param type 服务的类型 * @param url 远程服务的URL地址 * @return invoker 服务的本地代理 * @throws RpcException 当连接服务提供方失败时抛出 */ @Adaptive <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException; /** * 释放协议:<br> * 1. 取消该协议所有已经暴露和引用的服务。<br> * 2. 释放协议所占用的所有资源,比如连接和端口。<br> * 3. 协议在释放后,依然能暴露和引用新的服务。<br> */ void destroy(); }
通过export暴露服务的引用exporter,其中exporter负责管理Invoker的声明周期。
远程服务暴露时,使用DubboProtocol进行具体服务暴露。调用DubboProtocol的export(Invoker)将Invoker进行暴露成Exporter。这个方法的核心就是将暴露的exporter放入到ConcurrentHashMap中。
4.源码如下:
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException { URL url = invoker.getUrl(); // export service. String key = serviceKey(url); /** key是指com.xxx.DemoService:20880 ***DubboExporter,返回出去。 **/ DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap); // 将exporter放入map中,key是com.xxx.DemoService:20880 exporterMap.put(key, exporter); // 省略部分非核心代码 // 打开服务 openServer(url); return exporter; }
Exchanger
信息交换层,封装请求,响应信息。同步转异步。Transporter
抽象Mina和Netty通信统一接口。相关文章推荐
- SpeedPHP框架学习-1.基础及MVC理解
- ASP.NET中WCF框架应用程序建立以及框架概念理解
- 二、框架学习 (二)Spring框架学习 (1)IOC理解
- 工作流学习——重要概念扫盲篇一步曲
- 【PhoneGAP学习】Android PhoneGap框架(2)--重要知识点的预先学习 (jsonp)
- 单点登录cas常见问题(十三) - 几个重要概念怎么理解?
- 给.NET初学者推荐的一篇文章(图文并茂,理解深刻) - .NET中六个重要的概念:堆栈,堆,值类型,引用类型,装箱和拆箱
- iOS概念入门学习-Foundation框架-NSString
- iOS概念入门学习-Foundation框架-Block
- spring boot框架学习学前掌握之重要注解(1)-java配置方式
- 对spring-boot+shiro的学习(借助别人家的框架来理解)
- 小白学习hadoop——概念理解与环境搭建
- Spark中组件Mllib的学习22之假设检验-卡方检验概念理解
- WPF学习记录3_WPF重要概念
- wcf学习--基本概念理解
- SharpDevelop解析与学习心得之二------重要概念及核心程序的启动
- 淘宝SOA框架dubbo学习(1)--first demo
- Android框架学习之RxJava(一)基本概念
- Eclipse 4 IDE学习笔记(2、必须理解的几个Eclipse概念)
- dubbo框架初步学习