1. 程式人生 > >dubbo原始碼解析spring整合DubboNamespaceHandler配置引數①

dubbo原始碼解析spring整合DubboNamespaceHandler配置引數①

說在前面

從今天開始系統的進行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執行緒池佇列大小

 

說在最後

本次解析僅代表個人觀