Dubbo框架学习-重要概念理解

ProxyFactory
  1. 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
  1. 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。
  2. 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
  1. 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();

}
  1. 通过export暴露服务的引用exporter,其中exporter负责管理Invoker的声明周期。
  2. 远程服务暴露时,使用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
  1. 信息交换层,封装请求,响应信息。同步转异步。
Transporter
  1. 抽象Mina和Netty通信统一接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值