Dubbo学习笔记之零 协议

前言

该模块封装了RPC调用,使服务consumer透明使用,以Invocation,Result为中心,扩展接口为 Protocol, Invoker, Exporter,Protocol封装了使用Proxy来初始化Invoker,然后再增加一些Filter实现相关监控。Exporter封装了服务暴露以及数据传输。主要接口/类包括Protocol,Exporter,ProxyFactory,Invoker,Result,Filter,RpcContext。

核心类分析

下面就分析下几个主要接口/类的代码逻辑。

Protocol

<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
void destroy();
int getDefaultPort();

export方法

  • 暴露服务接口,用于服务消费者调用。
  • 该接口必须是幂等的,一次调用和多次调用结果是一致的。
  • invoker参数是由框架传入,protocol本身并不关心该对象。

refer方法

  • 用于服务消费端调用,生成invoker,然后通过proxy生成远程调用对象
  • 参数url用来 标识服务提供者调用相关信息(ip/port/)

Invoker

用于RPC中接口透明调用,实现了服务消费者接口请求逻辑,以及服务提供者接口处理逻辑

Exporter

用于返回服务Invoker对象,以及当前所有暴露接口的访问信息,以DubboExporter为例

    private final String key;
    private final Map<String, Exporter<?>> exporterMap;
    public DubboExporter(Invoker<T> invoker, String key, Map<String, Exporter<?>> exporterMap) {
        super(invoker);
        this.key = key;
        this.exporterMap = exporterMap;
    }

代码中的key就是暴露接口的访问信息。

服务发布流程

  1. 调用export接口(传入invoker对象,具体生成逻辑在服务代理中细说)
  2. 生成exporter实例;
  3. 生成信息交换层Exchanger(数据的发送与接收)
  4. 使用网络传输层绑定host/port(Transport)
  5. 使用Netty/Mina/Grizzly封装底层数据通信逻辑。

具体使用代码

protocol.export(proxy.getInvoker(echoService, EchoService.class,
            URL.valueOf("dubbo://127.0.0.1:9020/" + EchoService.class.getName() + "?codec=exchange")));

服务引用流程

逻辑和服务暴露类似,传入需要消费的服务以及联系信息,由具体协议实现返回服务提供者的Invoker对象即可。中间通过Exchanger调用Transport 生成Client,从而进行与服务提供者数据通信。

 echoService = proxy.getProxy(protocol.refer(EchoService.class,
            URL.valueOf("dubbo://127.0.0.1:9020/" + EchoService.class.getName() + "?codec=exchange")));
        echoService.sayHello("Hello World");

Protocol类型

dubbo

Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。


image.png
  • Transporter: mina, netty, grizzy
  • Serialization: dubbo, hessian2, java, json
  • Dispatcher: all, direct, message, execution, connection
  • ThreadPool: fixed, cached

特性

缺省协议,使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。

  • 连接个数:单连接
  • 连接方式:长连接
  • 传输协议:TCP
  • 传输方式:NIO 异步传输
  • 序列化:Hessian 二进制序列化
  • 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
  • 适用场景:常规远程服务方法调用

协议配置

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

rmi

RMI 协议采用 JDK 标准的 java.rmi.* 实现,采用阻塞式短连接和 JDK 标准序列化方式。

hession

Hessian协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。
Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即:

  • 提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用
  • 或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。

特性

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:HTTP
  • 传输方式:同步传输
  • 序列化:Hessian二进制序列化
  • 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
  • 适用场景:页面传输,文件传输,或与原生hessian服务互操作

协议配置

<dubbo:protocol name="hessian" port="8080" server="jetty" />

http

基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现

特性

  • 连接个数:多连接
  • 连接方式:短连接
  • 传输协议:HTTP
  • 传输方式:同步传输
  • 序列化:表单序列化
  • 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
  • 适用场景:需同时给应用程序和浏览器 JS 使用的服务。
    协议配置
<dubbo:protocol name="http" port="8080" />

redis

基于 Redis 实现的 RPC 协议 ,提供客户端访问redis服务。

协议配置

<dubbo:reference id="store" interface="java.util.Map" group="member" />

除了上述几种,还有thrift,webservice,memcached,可以去官方文档细看。

参考

dubbo官方用户手册

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

推荐阅读更多精彩内容

  • Dubbo入门-协议&注册中心 一、配置dubbo多协议模式 1、默认协议 Dubbo缺省协议采用单一长连接和NI...
    Java帮帮阅读 1,183评论 1 4
  • 曾经,看到一篇游记中写道: 我把相机放到淡黄色的巨大地砖上,镜头将前方远远近近的几条腿摄了进去,它们被裹在黑皮鞋和...
    极致探索阅读 981评论 2 16
  • 过去 厌烦你严格的管教 和你四季的唠叨 习惯对你无理取闹 和向你无尽的索要 从未注意你脸上的皱纹 和白了的头发 如...
    五谷丰登张阅读 266评论 0 5
  • 1.豆豆是一个很善良的人,因为她到临死之时依然希望想再看一次憨头,然而,还让憨头不要伤心。 2.也许我们现在的生活...
    熊诗言阅读 317评论 0 0
  • 那个当过兵男人发誓不会让他的孩子们再去当兵,虽然他从来没有讲述过他的当兵故事,虽然他会见到战友热泪盈眶。 他十七岁...
    药一味阅读 297评论 0 0