版本:1.2.0seata主要包括三大元件:tc、tm和rm。tc(transaction coordinator)主要負責全域性事務的提交和回滾,是seata的關鍵元件。對可用性及效能都有著較高的要求。
seata tc實現原始碼server的各個包:
server啟動的入口是server.main
方法
/**
** @param args the input arguments
* @throws ioexception the io exception
*/public
static
void
main
(string[
] args)
throws ioexception
else
xid.
setport
(rpcserver.
getlistenport()
);trycatch
(throwable e)
", e.
getmessage()
, e)
; system.
exit(-
1);}
system.
exit(0
);}
主要流程:
引數解析
parameterparser parameterparser = new parameterparser(args);
public
parameterparser
(string[
] args)
private
void
init
(string[
] args)
//多配置環境
this
.seataenv = stringutils.
trimtonull
(system.
getenv
(env_system_key));
//host位址
this
.host = stringutils.
trimtonull
(system.
getenv
(env_seata_ip_key));
//server節點id
this
.servernode = numberutils.
toint
(system.
getenv
(env_server_node_key)
, server_default_node)
;//埠號
this
.port = numberutils.
toint
(system.
getenv
(env_seata_port_key)
, server_default_port)
;//儲存模式
this
.storemode = stringutils.
trimtonull
(system.
getenv
(env_store_mode_key));
}else}if
(stringutils.
isnotblank
(seataenv))if
(stringutils.
isblank
(storemode))}
catch
(parameterexception e)
}
主要解析引數中的儲存模式、環境配置,ip埠。
初始化server
rpcserver rpcserver = new rpcserver(working_threads);構造器初始化父類構造器
public
abstractrpcremotingserver
(final threadpoolexecutor messageexecutor, nettyserverconfig nettyserverconfig)
根據配置判斷初始化eventloopgroup
public
rpcserverbootstrap
(nettyserverconfig nettyserverconfig)
else
// 構造設定埠,防止埠為空
setlistenport
(nettyserverconfig.
getdefaultlistenport()
);}
sessionholder初始化sessionholder.init(parameterparser.getstoremode());根據持久化配置file/db,去初始化sessionmanager 進行session管理和持久化,主要包括下面四種
public
static
void
init
(string mode)
throws ioexception
storemode storemode = storemode.
get(mode)
;//db 方式
if(storemode.db.
equals
(storemode)
)else
if(storemode.file.
equals
(storemode)
)else
//reload是否需要進行回滾或提交
//處理未完成的事務
reload()
;}
tc協調器初始化defaultcoordinator coordinator = new defaultcoordinator(rpcserver);建立預設的tc協調器,並將server與其組合,主要看coordinator.init();
init
方法
public
void
init()
catch
(exception e)},
0, rollbacking_retry_period, timeunit.milliseconds)
; retrycommitting.
scheduleatfixedrate((
)->
catch
(exception e)},
0, committing_retry_period, timeunit.milliseconds)
; asynccommitting.
scheduleatfixedrate((
)->
catch
(exception e)},
0, async_committing_retry_period, timeunit.milliseconds)
; timeoutcheck.
scheduleatfixedrate((
)->
catch
(exception e)},
0, timeout_retry_period, timeunit.milliseconds)
; undologdelete.
scheduleatfixedrate((
)->
catch
(exception e)
}, undo_log_delay_delete_period, undo_log_delete_period, timeunit.milliseconds)
;}
init
方法主要是新增定時任務,處理提交回滾刪除日誌等操作
啟動server
rpcserver.init();
public
void
init()
進入init
方法,abstractrpcremotingserver.init()
public
void
init()
跟入serverbootstrap.start();
,這裡就是服務的初始化
public
void
start()
}});
trycatch
(exception exx)
}
主要是netty引數的配置並啟動,到這裡也就完成了seataserver的初始化及啟動。通過seata-server的原始碼看出,其內部使用netty作為伺服器,並且用到大量執行緒池和定時任務去提高效能。 一 seata server的main啟動方法
main方法作為server的的啟動 的開始部分,所以我們將從main方法開始。public static void main string args throws ioexception else 設定全域性埠 xid.setport rpcserver.getlistenport try cat...
AbstractCollection原始碼分析
abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...
ThreadPoolExecutor原始碼閱讀
執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...