美文网首页
Dubbo中的那些坑(三)设计中欠优雅的地方

Dubbo中的那些坑(三)设计中欠优雅的地方

作者: DonneyYoung | 来源:发表于2017-02-10 10:28 被阅读3226次

    Dubbo设计中欠优雅的地方

    在侵入性和配置上都有欠优雅的地方,以下内容来自于Dubbox的文档(文档地址

    RpcContext的侵入性

    Dubbo的很多高级特性都依赖于RpcContext。一方面它是用单例的方式来访问上下文信息,这完全不符合spring应用的一般风格,不利于应用扩展和单元测试。另一方面RpcContext又是Dubbo特有的对象,会依赖于框架本身,造成与Dubbo耦合。

    Protocol配置的局限性

    dubbo支持多种远程调用方式,但所有调用方式都是用<dubbo:protocol/>来配置的,例如:

    <dubbo:protocol name="dubbo" port="9090" server="netty" client="netty" codec="dubbo" serialization="hessian2" 
        charset="UTF-8" threadpool="fixed" threads="100" queues="0" iothreads="9" buffer="8192" accepts="1000" payload="8388608"/>
    

    其实,上面很多属性实际上dubbo RPC远程调用方式特有的,很多dubbo中的其它远程调用方式根本就不支持例如server, client, codec, iothreads, accepts, payload等等(当然,有的是条件所限不支持,有的是根本没有必要支持)。这给用户的使用徒增很多困惑,用户也并不知道有些属性(比如做性能调优)添加了实际上是不起作用的。
      另一方面,各种远程调用方式往往有大量自己独特的配置需要,特别是我们逐步为每种远程调用方式都添加更丰富、更高级的功能,这就不可避免的扩展<protocol/>中的属性(例如目前我们在REST中已经添加了keepalive和extension两个属性),到最后会导致<protocol/>臃肿不堪,用户的使用也更加困惑。
      当然,dubbo中有一种扩展<protocol/>的方式是用<dubbo:parameter/>,但这种方式显然很有局限性,而且用法复杂,缺乏schema校验。
      所以,最好的方式是为每种远程调用方式设置自己的protocol元素,比如<protocol-dubbo/>,<protocol-rest/>等等,每种元素用XML schema规定自己的属性(当然属性在各种远程调用方式之间能通用是最好的)。
      如此一来,例如前面提到过的extension配置也可以用更自由的方式,从而更清楚更可扩展(以下只是举例,当然也许有更好的方式):

    <dubbo:protocol-rest port="8080">
        <dubbo:extension>someInterceptor</dubbo:extension>
        <dubbo:extension>someFilter</dubbo:extension>
        <dubbo:extension>someDynamicFeature</dubbo:extension>
        <dubbo:extension>someEntityProvider</dubbo:extension>
    </dubbo:protocol-rest>
    

    参阅

    在Dubbo中开发REST风格的远程调用(RESTful Remoting)

    转载注明出处,我就不和你计较。
    by Donney Young
    http://www.jianshu.com/p/561b5076dc66

    相关文章

      网友评论

          本文标题:Dubbo中的那些坑(三)设计中欠优雅的地方

          本文链接:https://www.haomeiwen.com/subject/mokgittx.html