seata server啟動原始碼

2021-10-05 10:53:49 字數 4644 閱讀 2333

版本:1.2.0

seata主要包括三大元件: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);

coordinator.init();

建立預設的tc協調器,並將server與其組合,主要看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...