【Dubbo】重要概念

重要概念

  1. proxyFactory
    就是为了获取一个接口的代理类,例如获取一个远程接口的代理。
    它有2个方法,代表2个作用
    a. getInvoker:针对server端,将服务对象,如DemoServiceImpl包装成一个Invoker对象。
    b. getProxy :针对client端,创建接口的代理对象,例如DemoService的接口。

  2. Wrapper
    它类似spring的BeanWrapper,它就是包装了一个接口或一个类,可以通过wrapper对实例对象进行赋值 取值以及制定方法的调用。

  3. Invoker
    它是一个可执行的对象,能够根据方法的名称、参数得到相应的执行结果。它里面有一个很重要的方法 Result invoke(Invocation invocation),
    Invocation是包含了需要执行的方法和参数等重要信息,目前它只有2个实现类RpcInvocation MockInvocation。它有3种类型的Invoker

    1. 本地执行类的Invoker
      server端:要执行 demoService.sayHello,就通过InjvmExporter来进行反射执行demoService.sayHello就可以了。
    2. 远程通信类的Invoker
      client端:要执行 demoService.sayHello,它封装了DubboInvoker进行远程通信,发送要执行的接口给server端。
      server端:采用了AbstractProxyInvoker执行了DemoServiceImpl.sayHello,然后将执行结果返回发送给client.
    3. 多个远程通信执行类的Invoker聚合成集群版的Invoker
      client端:要执行 demoService.sayHello,就要通过AbstractClusterInvoker来进行负载均衡,DubboInvoker进行远程通信,发送要执行的接口给server端。
      server端:采用了AbstractProxyInvoker执行了DemoServiceImpl.sayHello,然后将执行结果返回发送给client.
  4. Protocol
    1.export:暴露远程服务(用于服务端),就是将proxyFactory.getInvoker创建的代理类 invoker对象,通过协议暴露给外部。存入exporterMap中
    2.refer:引用远程服务(用于客户端), 通过proxyFactory.getProxy来创建远程的动态代理类,例如DemoService的远程动态接口。

  5. exporter
    维护invoder的生命周期。

  6. exchanger
    信息交换层,封装请求响应模式,同步转异步。

  7. transporter
    网络传输层,用来抽象netty和mina的统一接口。

  8. Directory目录服务
    StaticDirectory:静态目录服务,他的Invoker是固定的。
    RegistryDirectory:注册目录服务,他的Invoker集合数据来源于zk注册中心的,他实现了NotifyListener接口,并且实现回调notify(List<URL> urls),整个过程有一个重要的map变量,methodInvokerMap(它是数据的来源;同时也是notify的重要操作对象,重点是写操作路由规则。)

重要类

  • ExtensionLoader:dubbo自己SPI的类加载机制

  • JavassistProxyFactory:生成远端服务的代理和本地服务的Invoker

  • 集群容错
    MockClusterInvoker:实现服务的降级熔断
    ConditionRouter:directory使用路由过滤器过滤provider不再生成invoker,每次调用的时候也会根据consumer的条件过滤invoker
    LoadBalance:实现负载均衡调用,从directory中拿到invoker列表根据负载算法选取invoker

  • 服务注册
    RegistryProtocol:进行服务暴露和服务引用的起点
    RegistryDirectory:监听zk的conf节点,创建和动态维护invoker列表
    ZookeeperRegistry:封装和zk的操作细节

  • 服务调用
    DubboInvoker:consumer进行远程调用的类

  • 通信
    NettyServer:netty的服务启动
    NettyHandler:netty数据监听,收到数据发送给上层
    HeaderExchangeHandler:交换层,接收到数据进行逻辑处理:调用invoker,唤醒future
    ExchangeCodec:编解码

服务发布-原理
  • 服务发布流程
  1. 暴露本地服务
    将本地的实现类生成一个InjvmInvoker并放入exporterMap
  2. 暴露远程服务
    生成一个远端服务的DubboInvoker放入DubboExporter,最后存入exporterMap中供consumer调用
  3. 启动netty
    根据invoker的地址开启端口的监听
  4. 打开连接zk
    使用registry连接zk
  5. 到zk注册
    zk上注册provider节点
  6. 监听zk
    监听zk的providers节点
  • 暴露本地服务和暴露远程服务的区别是什么?
  1. 暴露本地服务:指暴露在用一个JVM里面,不用通过调用zk来进行远程通信。例如:在同一个服务,自己调用自己的接口,就没必要进行网络IP连接来通信。
  2. 暴露远程服务:指暴露给远程客户端的IP和端口号,通过网络来实现通信。
  • zk持久化节点 和临时节点有什么区别?
    持久化节点:一旦被创建,触发主动删除掉,否则就一直存储在ZK里面。
    临时节点:与客户端会话绑定,一旦客户端会话失效,这个客户端端所创建的所有临时节点都会被删除。服务注册采用临时节点,provider失效则删除配置

SPI

  • 为什么要设计adaptive?注解在类上和注解在方法上的区别?
    adaptive设计的目的是为了识别固定已知类和扩展未知类。
  1. 注解在类上:代表人工实现,实现一个装饰类(设计模式中的装饰模式),它主要作用于固定已知类,
    目前整个系统只有2个,AdaptiveCompiler、AdaptiveExtensionFactory。
    a.为什么AdaptiveCompiler这个类是固定已知的?因为整个框架仅支持Javassist和JdkCompiler。
    b.为什么AdaptiveExtensionFactory这个类是固定已知的?因为整个框架仅支持2个objFactory,一个是spi,另一个是spring
  2. 注解在方法上:代表自动生成和编译一个动态的Adpative类,它主要是用于SPI,因为spi的类是不固定、未知的扩展类,所以设计了动态Adaptive类. 例如 Protocol的spi类有 injvm dubbo registry filter listener等等 很多扩展未知类, 它设计了ProtocolAdaptive的类,通过ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(spi类);来提取对象
  • 为什么dubbo要自己设计一套SPI?
    这是原始JDK spi的代码
    ServiceLoader<Command> serviceLoader=ServiceLoader.load(Command.class); 
  for(Command command:serviceLoader){  
      command.execute();  
  }  

dubbo在原来的基础上设计了以下功能

  1. 原始JDK spi不支持缓存;dubbo设计了缓存对象:spi的key与value 缓存在 cachedInstances对象里面,它是一个ConcurrentMap
  2. 原始JDK spi不支持默认值,dubbo设计默认值:@SPI("dubbo") 代表默认的spi对象,例如Protocol的@SPI("dubbo")就是 DubboProtocol,
    通过 ExtensionLoader.getExtensionLoader(Protocol.class).getDefaultExtension()那默认对象
  3. jdk要用for循环判断对象,dubbo设计getExtension灵活方便,动态获取spi对象,
    例如 ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(spi的key)来提取对象
  4. 原始JDK spi不支持 AOP功能,dubbo设计增加了AOP功能,在cachedWrapperClasses,在原始spi类,包装了XxxxFilterWrapper XxxxListenerWrapper
  5. 原始JDK spi不支持 IOC功能,dubbo设计增加了IOC,通过构造函数注入,代码为:wrapperClass.getConstructor(type).newInstance(instance),

dubbo spi 的目的:获取一个指定实现类的对象。
途径:ExtensionLoader.getExtension(String name)
实现路径:getExtensionLoader(Class<T> type) 就是为该接口new 一个ExtensionLoader,然后缓存起来。getAdaptiveExtension() 获取一个扩展类,如果@Adaptive注解在类上就是一个装饰类;如果注解在方法上就是一个动态代理类,例如Protocol$Adaptive对象。getExtension(String name) 获取一个指定对象。

通信

dubbo 是基于netty NIO的非阻塞 并行调用通信。 (阻塞 非阻塞 异步 同步 区别 )
dubbo 的通信方式 有3类类型:

  1. 异步,有返回值
    <dubbo:method name="sayHello" async="true"></dubbo:method>
    Future<String> temp= RpcContext.getContext().getFuture();
    hello=temp.get();

  2. 异步,无返回值
    <dubbo:method name="sayHello" return="false"></dubbo:method>

  3. 异步,变同步(默认的通信方式)
    A.当前线程怎么让它 “暂停,等结果回来后,再执行”?
    B.socket是一个全双工的通信方式,那么在多线程的情况下,如何知道那个返回结果对应原先那条线程的调用?
    通过一个全局唯一的ID来做consumer 和 provider 来回传输。

tcp 为什么会出现粘包 拆包的问题?
1.消息的定长,例如定1000个字节
2.就是在包尾增加回车或空格等特殊字符作为切割,典型的FTP协议
3.将消息分为消息头消息体。例如 dubbo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容