说在前面
从今天开始系统的进行dubbo源码解析,本次先介绍下dubbo与spring进行集成相关的内容,更多源码解析请关注“天河聊架构”公众号。
源码解析
dubbo的namespace解析是这个类,com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler,前面spring源码解析的时候介绍过与spring整合的xml方式的,都是先解析NamespaceHandler,先看下dubboNamespaceHandler类的内容。
public class DubboNamespaceHandler extends NamespaceHandlerSupport {
static {
// 检查包冲突
Version.checkDuplicate(DubboNamespaceHandler.class);
}
@Override
public void init() {
// xml配置解析=》
registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
// annotation解析<dubbo:annotation package="" />xml配置=》
registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
}
}
静态块用来检查有没有权限定名一样的DubboNamespaceHandler.class文件,init方法会解析ApplicationConfig、ModuleConfig、RegistryConfig、MonitorConfig、providerConfig、ConsumerConfig、protocolConfig、ServiceBean、RefrenceBean 相关配置以及引用类型的配置注册到dubbo在spring beanFactory中的bean定义中。这些配置是由DubboBeanDefinitionParser这个bean定义解析器来完成解析。基于annotation的方式是用AnnotationBeanDefinitionParser这个bean定义解析器来解析,dubbo的provider、consumer也支持annotation的方式,详细可以查阅com.alibaba.dubbo.config.annotation.Service、com.alibaba.dubbo.config.annotation.Reference 其中的配置和<dubbo:service、<dubbo:reference xml标签中的配置是一样的,通过bean定义parser解析完都会解析成spring beanFactory的bean定义。
先整理看下applicationConfig中配置属性都有些什么。对应的是<dubbo:application xml标签
// application name
private String name;
// module version
private String version;
// application owner
private String owner;
// application's organization (BU)
private String organization;
// architecture layer
private String architecture;
// environment, e.g. dev, test or production
private String environment;
// Java compiler
private String compiler;
// logger
private String logger;
// registry centers
private List<RegistryConfig> registries;
// monitor center
private MonitorConfig monitor;
// is default or not
private Boolean isDefault;
// directory for saving thread dump 线程堆栈保存文件夹
private String dumpDirectory;
// whether to enable qos or not
private Boolean qosEnable;
// the qos port to listen
private Integer qosPort;
// should we accept foreign ip or not?
private Boolean qosAcceptForeignIp;
// customized parameters
private Map<String, String> parameters;
这个配置主要是针对整个dubbo应用的全局配置,配置的优先级、加载顺序服务注册这一章解析完成后会单独介绍下,这里先不展开了。
name应用名,provider和consumer不能一致,用于注册中心计算应用间依赖关系
environment 环境,在开发、测试中有用
compiler java字节码编译器,用于动态类生成,可选 jdk、javassist,默认值javassist
logger 日志输出方式,可选:slf4j,jcl,log4j,log4j2,jdk,默认值slf4j
owner 应用负责人,用于服务治理
private List<RegistryConfig> registries; 这是dubbo注册中心相关的配置
dumpDirectory 属性,保存线程堆栈文件,对应xml标签参数dump.directory
注册中心配置,<dubbo:registry xml标签
public class RegistryConfig extends AbstractConfig {
public static final String NO_AVAILABLE = "N/A";
private static final long serialVersionUID = 5508512956753757169L;
// register center address
private String address;
// username to login register center
private String username;
// password to login register center
private String password;
// default port for register center
private Integer port;
// protocol for register center
private String protocol;
// client impl
private String transporter;
private String server;
private String client;
// 容错
private String cluster;
private String group;
private String version;
// request timeout in milliseconds for register center 注册中心超时时间
private Integer timeout;
// session timeout in milliseconds for register center 注册中心session超时时间
private Integer session;
// file for saving register center dynamic list 注册中心动态列表保存文件
private String file;
// wait time before stop 停止等待时间
private Integer wait;
// whether to check if register center is available when boot up 检查注册中心是否可用
private Boolean check;
// whether to allow dynamic service to register on the register center 服务是否允许动态注册到注册中心
private Boolean dynamic;
// whether to export service on the register center 是否允许注册服务在注册中心
private Boolean register;
// whether allow to subscribe service on the register center 是否允许订阅注册中心的服务
private Boolean subscribe;
// customized parameters
private Map<String, String> parameters;
// if it's default
private Boolean isDefault;
address 注册中心地址,对应xml标签 address属性
username属性对应xml标签 username属性
password属性对应xml标签password属性
port属性对应xml属性
zookeeper单机,address也可以这样用 zookeeper://127.0.0.1:2181
protocol属性,支持dubbo、multicast、redis、zookeeper等
transporter属性,网络传输方式,可选netty、mina、grizzly、http等
server 对应<dubbo:protocol server属性,默认dubbo协议是netty、http协议是servlet
client 对应<dubbo:protocol client属性,默认dubbo协议是netty
cluster 容错支持,默认值failover,失败自动重试,对应<dubbo:service 、<dubbo:reference、<dubbo:provider、<dubbo:consumer 标签cluster属性,容错机制一共有以下几种
available 使用可用的
failback 失败自动恢复,后台记录失败请求,定时重发
failfast 只发起一次调用,失败立即报警,一般用于非幂等操作
failover 失败自动切换,重试其他服务器,一般用于读操作,重试会带来更大的延迟
failsafe 失败安全,出现异常直接忽略,一般用于记录日志
forking 并行调用对个服务器,只要一个成功就返回,一般用于实时性比较高的读操作,需要浪费更多服务资源
group 默认值 dubbo,服务注册分组,跨组服务不会相互影响,且不能相互调用,适合于环境隔离
timeout 注册中心超时时间
file 用来存储注册中心服务提供者的文件,服务重启会从这个文件加载注册中心
wait 服务关闭等待时间
check 检查注册的服务提供者是否可用,对应<dubbo:registry、<dubbo:refrence、<dubbo:consumer 标签check属性,默认值true
dynamic 服务是否动态注册。如果为false,服务将显示为disable,您需要手动启用它。您还需要在provider关闭时禁用它。默认值true
register 是否注册到注册中心。如果是false,只订阅,不注册。
subscribe 是否从注册中心订阅。如果是false,只注册,不订阅。
parameters 自定义参数
provider配置 对应<dubbo:provider标签
public class ProviderConfig extends AbstractServiceConfig {
private static final long serialVersionUID = 6913423882496634749L;
// ======== protocol default values, it'll take effect when protocol's attributes are not set 协议默认值,不设置协议属性时生效 ========
// service IP addresses (used when there are multiple network cards available)
private String host;
// service port
private Integer port;
// context path
private String contextpath;
// thread pool 线程池类型
private String threadpool;
// thread pool size (fixed size) 线程数
private Integer threads;
// IO thread pool size (fixed size) io线程数
private Integer iothreads;
// thread pool queue length 队列长度
private Integer queues;
// max acceptable connections provider最大连接数
private Integer accepts;
// protocol codec 编解码器
private String codec;
// charset
private String charset;
// payload max length 网络传送最大字节数
private Integer payload;
// buffer size
private Integer buffer;
// transporter
private String transporter;
// how information gets exchanged 信息交换方式
private String exchanger;
// thread dispatching mode 线程转发模式
private String dispatcher;
// networker
private String networker;
// server impl
private String server;
// client impl
private String client;
// supported telnet commands, separated with comma.
private String telnet;
// command line prompt
private String prompt;
// status check
private String status;
// wait time when stop 停止等待时间
private Integer wait;
host 指定服务ip,当多网卡时使用
threadpool 线程池类型指定,默认fixed,可选 fixed、cached
threads 指定的线程池线程数,默认值200
iothreads io线程数,默认cpu线程数+1
queues 默认值0,dubbo建议任务直接处理不要加入队列
accepts 默认值9,服务提供者的最大连接数
codec 协议编解码支持,默认值dubbo
payload 请求和响应的长度限制,单位为字节,默认8m
buffer 网络IO的缓冲区大小,默认8192
transporter属性,网络传输方式,可选netty、mina、grizzly、http等,客户端和服务端可以单独设置
exchanger 协议转换器,默认值header,HeaderExchanger,对应<dubbo:protocol、<dubbo:provider 标签 exchanger属性
dispatcher 线程转发模型,all、connection、direct、execution、message,默认值all
all 所有消息都派发到线程池,包括请求、响应、连接事件、断开事件、心跳监测等
connection 在io线程上,将连接断开事件放入队列,有序逐个执行,其他消息派发到线程池
direct 所有消息都不派发到线程池,全部在io线程上直接执行
execution 只请求消息派发到线程池,不含响应,响应和其他连接断开事件,心跳检测等消息,直接在io线程上执行
message 只有请求响应消息派发到线程池,其他连接断开事件,心跳检测等消息,直接在io线程上执行
对应<dubbo:provider、<dubbo:protocol标签 dispatcher属性
networker 网络连接器,multicast 广播方式,file从文件中读取host,对应<dubbo:provider、<dubbo:protocol network属性
server server端协议,dubbo协议默认值是netty,http协议默认值是servlet
client client端协议,dubbo协议默认值netty,对应<dubbo:provider、<dubbo:ptotocol 标签 server、client属性
telnet 支持的telnet命令
clear、exit、help、status、log
status 状态检查,默认支持
memory 内存状态检查
load 加载状态检查
dubbo还是先了其他的状态检查,spi没加进来,需要自己扩展
RegistryStatusChecker 服务注册状态检查
ServerStatusChecker server状态检查
SpringStatusChecker spring容器状态检查
ThreadPoolStatusChecker 线程池状态检查
wait 服务停止等待时间
cosumer配置,对应<dubbo:consumer>、<dubbo:refrence>标签
public class ConsumerConfig extends AbstractReferenceConfig {
private static final long serialVersionUID = 2827274711143680600L;
// is default or not
private Boolean isDefault;
// networking framework client uses: netty, mina, etc. 网络通讯中间件类型
private String client;
// consumer thread pool type: cached, fixed, limit, eager 线程池类型
private String threadpool;
// consumer threadpool core thread size 消费者线程池核心线程数
private Integer corethreads;
// consumer threadpool thread size 消费者线程池线程数
private Integer threads;
// consumer threadpool queue size 消费者线程池队列长度
private Integer queues;
client 客户端网络通讯组件,netty、mina等
threadpool 线程池类型
fixed java自带线程池
cached java自带线程池
limited 线程数只增大不会减少
eager java的线程池增加线程策略是核心线程数占满了往队列中放,队列也放满了没超过线程池的最大线程数才会创建线程,这个线程池增加线程的策略是currentPoolSize<submittedTaskCount<maxPoolSize满足这个条件时会增加线程,submittedTaskCount是dubbo扩展的一个计数器,在执行线程的时候增加计数,线程执行完减少计数。
corethreads 核心线程数,此参数对fixed线程池无效,fiexed类型的线程数核心线程数和最大线程数一致
threads 线程池的最大线程数
queues线程池队列大小