說在前面java
從今天開始系統的進行dubbo源碼解析,本次先介紹下dubbo與spring進行集成相關的內容,更多源碼解析請關注「天河聊架構」公衆號。redis
源碼解析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);}@Overridepublic 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 nameprivate String name;// module versionprivate String version;// application ownerprivate String owner;// application's organization (BU)private String organization;// architecture layerprivate String architecture;// environment, e.g. dev, test or productionprivate String environment;// Java compilerprivate String compiler;// loggerprivate String logger;// registry centersprivate List<RegistryConfig> registries;// monitor centerprivate MonitorConfig monitor;// is default or notprivate Boolean isDefault;// directory for saving thread dump 線程堆棧保存文件夾private String dumpDirectory;// whether to enable qos or notprivate Boolean qosEnable;// the qos port to listenprivate Integer qosPort;// should we accept foreign ip or not?private Boolean qosAcceptForeignIp;// customized parametersprivate Map<String, String> parameters;
這個配置主要是針對整個dubbo應用的全局配置,配置的優先級、加載順序服務註冊這一章解析完成後會單獨介紹下,這裏先不展開了。session
name應用名,provider和consumer不能一致,用於註冊中心計算應用間依賴關係架構
environment 環境,在開發、測試中有用app
compiler java字節碼編譯器,用於動態類生成,可選 jdk、javassist,默認值javassistide
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 addressprivate String address;// username to login register centerprivate String username;// password to login register centerprivate String password;// default port for register centerprivate Integer port;// protocol for register centerprivate String protocol;// client implprivate 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 parametersprivate Map<String, String> parameters;// if it's defaultprivate 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 portprivate Integer port;// context pathprivate 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;// charsetprivate String charset;// payload max length 網絡傳送最大字節數private Integer payload;// buffer sizeprivate Integer buffer;// transporterprivate String transporter;// how information gets exchanged 信息交換方式private String exchanger;// thread dispatching mode 線程轉發模式private String dispatcher;// networkerprivate String networker;// server implprivate String server;// client implprivate String client;// supported telnet commands, separated with comma.private String telnet;// command line promptprivate String prompt;// status checkprivate 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 notprivate 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線程池隊列大小
說在最後
本次解析僅表明我的觀點,僅供參考。