前言

Dubbo框架支持的通信协议有很多种,本节着重介绍dubbo协议,也是Dubbo框架默认的协议。

正文

描述

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

dubbo 协议 配置 java dubbo默认的协议_dubbo 协议 配置 java

Proxy:客户端代理;
Client:客户端;
Header:协议消息头;
Codec:协议编码方式;
Body:协议消息体;
Serialization:消息序列化方式,dubbo、hessian2、java、json;
Transporter:网络传输层,可选框架mina、netty、grizzly;
Server:服务端;
Dispatcher:处理调度器,all、direct、message、execution、connection;
ThreadPool:处理线程池,fixed、cached;
Implement:服务端实现;

特性

连接:单个长连接,即每消费者每提供者每服务使用单一长连接;
传输:TCP协议,并采用NIO异步传输方式;
序列化:hessian2二进制序列化;

约束

参数及返回值需实现Serialization接口;
参数及返回值不能自定义实现List、Map、Number、Date、Calendar等接口,只能用JDK自带的实现,因为Hessian序列化,只传成员属性值和值的类型,不传方法或静态变量;

配置

协议

示例:

<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"/>

配置类:

com.alibaba.dubbo.config.ProtocolConfig

解析:

name:协议名;
port:暴露端口,缺省端口为20880;
server:协议的服务器端实现类型,比如:dubbo协议的mina,netty等,http协议的jetty,servlet等;
client:协议的客户端实现类型,比如:dubbo协议的mina,netty等;
codec:协议编码方式;
serialization:序列化方式;
charset:序列化编码;
threadpool:线程池类型;
	fixed:固定大小线程池,启动时建立线程,不关闭,一直持有;
	cached:缓存线程池,空闲一分钟自动删除,需要时重建;
	limited:可伸缩线程池,但池中的线程数只会增长不会收缩;(为避免收缩时突然来了大流量引起的性能问题)
threads:线程池大小;
queues:线程池队列大小,当线程池满时,排队等待执行的队列大小;
iothreads:io线程池大小,默认cpu个数+1;
buffer:网络读写缓冲区大小;
accepts:允许最大连接数,即每消费者每提供者每服务个数;
payload:请求及响应数据包大小限制,单位:字节;
host:服务主机名,多网卡选择或指定VIP及域名时使用,为空则自动查找本机IP,建议不要配置,让Dubbo自动获取本机IP;
accesslog:设为true,将向logger中输出访问日志,也可填写访问日志文件路径,直接把访问日志输出到指定文件;
path:提供者上下文路径,为服务path的前缀;
transporter:协议的服务端和客户端实现类型,比如:dubbo协议的mina,netty等,可以分拆为server和client配置,dubbo协议缺省为netty;
dispatcher:协议的消息派发方式,用于指定线程模型,比如:dubbo协议的all, direct, message, execution, connection等;
	all:所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等;
	direct:所有消息都不派发到线程池,全部在IO线程上直接执行;
	message:只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行;
	execution:只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行;
	connection:在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池;
heartbeat:心跳间隔,对于长连接,当物理层断开时,比如拔网线,TCP的FIN消息来不及发送,对方收不到断开事件,此时需要心跳来帮助检查连接是否已断开;
telnet:所支持的telnet命令,多个命令用逗号分隔;
register:该协议的服务是否注册到注册中心,默认为true;
contextpath:未知;