zoukankan      html  css  js  c++  java
  • dubbo学习

    最近看了一遍dubbo的源码,也正好阿里的中间件比赛初赛是dubbo的 loadbalance 方法,所以先整理下dubbo的知识。

    服务治理并不是最近才提出的概念,从java服务的前后端分离开始到现在的微服务模式,远程服务调用能力就是必须的了,webservice等的方式效率性能开发难度都远远跟不上要求。简单的远程调用可以有rmi等方式,但是数量巨大的服务,跨部门的服务调用,服务错误处理等等要求下,服务治理框架也就是必须的了,初期,不少公司应该也是自己开发过服务治理的中间件,我也看过几个服务治理中间件的源码,其中dubbo是阿里开源出来的,功能比较强大,可扩展性比较强,对于我个人来说,是学到了一些新的设计模式和思路,故而整理一下。据说阿里内部已经不用dubbo,后续有机会再学习下hsf。

    基本用法和说明参考dubbo官方说明文档:    http://dubbo.apache.org/zh-cn/docs/user/preface/architecture.html

     看一遍代码的主流程:

    1. pre

      代码入口:

          配置方式:    <dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" /> //注册中心

                             <dubbo:reference id="asyncService" interface="org.apache.dubbo.samples.governance.api.AsyncService"> <dubbo:method name="sayHello" async="true" /> </dubbo:reference>

           <dubbo:service interface="org.apache.dubbo.samples.governance.api.AsyncService" ref="asyncService"/> 等等等

          以xml配置方式为例子,代码在dubbo-config 包的dubbo-config-spring 包里 class DubboNamespaceHandler extends NamespaceHandlerSupport(spring提供可以查资料)  定义dubbo的namespace,

           这个类里注册不同的标签的解析类,不同的解析类将xm配置实例化成了spring的bean。例如 RegistryConfig ReferenceBean ServiceBean  等

       可配置化实现:  SPI接口  ExtensionLoader 等

    2 .Provider: ServiceBean

    服务暴露:

     Service Config-> doExportUrls();

             interfaceClass,url->invoker

    List<protocols>  -> export(invoker)-> 以dubbo协议为例 openServer()->ServerMap.get() or createServer ->(headerExchange)   exchanger.bind(url,hander) ->

      Transporter(AbstractServer.bind()  )->nettyServer->open

         exports.add (exports), urls.add(url)

    <dubbo:protocol name="dubbo" port="20880" />

    <dubbo:protocol name="rmi" port="1099" />

    被调用:

     ExchangeHandlerAdapter(abstract,具体实现dubbo协议的是写在DubboProtocol.java里) -》exprort-> invoker->invoker.invoke

    再来看看这个invoker 怎么实现的:以javaassistProxyFactory 为例子 invoker 用反射方式实现,配置的文件指定 bean和 interface  Wrapper包装类,doInvoker 调用wrapper的doInvokeMethod

    Wrapper的makeWrapper方法,创造了Wrapper类。

    ExchangeHandler(提供reply方法,计算出调用的结果)   ChannelHandler(netty的,同步调用时channel写数据返回给cliet)

    3.consumer:

    调用服务:

     继承spring的FactoryBean -》getObject-》init()-》createProxy-》invoker(类似) -》publishconsumer 到注册地址

    invoker : REF_PROTOCOL.refer->AsyncToSyncInvoker->getInvoker(protocolBindingRefer-》new DubboInvoker)-》 invoke->doInvoke->getClients():getSharedClient

    ->ExchangeClient(inv: Path,url,version...) -》AsyncRpcResult

    4 服务注册

    provider写信息到注册中心,启动,停服务

    client写信息,并监听数据变化

    netty使用方式:

    对外Transports 可以获取 Server (bind)和 Client (connect)  HeaderExchanger继承 (Exchagers)里使用 bind和connetct获取 client和server

    对外Exchagers -》获取实现ExchangeClient接口 对象 也可以获取实现ExchangeServer 接口对象  provider 的 createServer里使用bind方法创建服务类,initClient使用connect创建客户端

     Server 接口 基础 EndPoint接口,ExchangeServer 接口继承Server ,NettyServer实现Server

  • 相关阅读:
    hudson搭建经验总结(二)
    CodePen最佳实例分享
    hudson搭建经验总结
    资料文件夹管理系统
    ueditor+word图片上传
    asp.net上传大文件
    UEditor粘贴word
    大文件上传组件
    文件资源管理系统
    ueditor+复制word图片粘贴上传
  • 原文地址:https://www.cnblogs.com/thinkqin/p/11099419.html
Copyright © 2011-2022 走看看