中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Seata 中怎么動態配置訂閱與降級

發布時間:2021-08-10 13:54:38 來源:億速云 閱讀:164 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關Seata 中怎么動態配置訂閱與降級,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

動態配置訂閱

Seata 配置中心有一個監聽器基準接口,它主要有一個抽象方法和 default 方法,如下:

io.seata.config.ConfigurationChangeListener

Seata 中怎么動態配置訂閱與降級

該監聽器基準接口主要有兩個實現類型:

  1. 實現注冊配置訂閱事件監聽器:用于實現各種功能的動態配置訂閱,比如 GlobalTransactionalInterceptor 實現了 ConfigurationChangeListener,根據動態配置訂閱實現的動態降級功能;

  2. 實現配置中心動態訂閱功能與適配:對于目前還沒有動態訂閱功能的 file 類型默認配置中心,可以實現該基準接口來實現動態配置訂閱功能;對于阻塞訂閱需要另起一個線程去執行,這時候可以實現該基準接口進行適配,還可以復用該基準接口的線程池;以及還有異步訂閱,有訂閱單個 key,有訂閱多個 key 等等,我們都可以實現該基準接口以適配各個配置中心。

這里就用默認的 file 配置中心,以它的實現類 FileListener 舉例子,它的實現邏輯如下:

Seata 中怎么動態配置訂閱與降級

如上,

  • dataId:為訂閱的配置屬性;

  • listener:配置訂閱事件監聽器,用于將外部傳入的 listener 作為一個 wrapper,執行真正的變更邏輯,這里特別需要注意的是,該監聽器與 FileListener 同樣實現了 ConfigurationChangeListener 接口,只不過 FileListener 是用于給 file 提供動態配置訂閱功能,而 listener 用于執行配置訂閱事件

  • executor:用于處理配置變更邏輯的線程池,在 ConfigurationChangeListener#onProcessEvent 方法中用到。

FileListener#onChangeEvent 方法的實現讓 file 具備了動態配置訂閱的功能,它的邏輯如下:

無限循環獲取訂閱的配置屬性當前的值,從緩存中獲取舊的值,判斷是否有變更,如果有變更就執行外部傳入 listener 的邏輯。

ConfigurationChangeEvent 用于保存配置變更的事件類,它的成員屬性如下:

Seata 中怎么動態配置訂閱與降級

這里的 getConfig 方法是如何感知 file 配置的變更呢?我們點進去,發現它最終的邏輯如下:

Seata 中怎么動態配置訂閱與降級

發現它是創建一個 future 類,然后包裝成一個 Runnable 放入線程池中異步執行,最后調用 get 方法阻塞獲取值,那么我們繼續往下看:

Seata 中怎么動態配置訂閱與降級

allowDynamicRefresh:動態刷新配置開關;

targetFileLastModified:file 最后更改的時間緩存。

以上邏輯:

獲取 file 最后更新的時間值 tempLastModified,然后對比對比緩存值 targetFileLastModified,如果 tempLastModified > targetFileLastModified,說明期間配置有更改過,這時就重新加載 file 實例,替換掉舊的 fileConfig,使得后面的操作能夠獲取到最新的配置值。

添加一個配置屬性監聽器的邏輯如下:

Seata 中怎么動態配置訂閱與降級

configListenersMap 為 FileConfiguration 的配置監聽器緩存,它的數據結構如下:

ConcurrentMap<String/*dataId*/, Set<ConfigurationChangeListener>> configListenersMap

從數據結構上可看出,每個配置屬性可關聯多個事件監聽器。

最終執行 onProcessEvent 方法,這個是監聽器基準接口里面的 default 方法,它會調用 onChangeEvent 方法,即最終會調用 FileListener 中的實現。

動態降級

有了以上的動態配置訂閱功能,我們只需要實現 ConfigurationChangeListener 監聽器,就可以做各種各種的功能,目前 Seata 只有動態降級有用到動態配置訂閱的功能。

在「Seata AT 模式啟動源碼分析」這篇文章中講到,Spring 集成 Seata 的項目中,在 AT 模式啟動時,會用 用GlobalTransactionalInterceptor 代替了被 GlobalTransactional 和 GlobalLock 注解的方法,GlobalTransactionalInterceptor 實現了 MethodInterceptor,最終會執行 invoker 方法,那么想要實現動態降級,就可以在這里做手腳。

  • 在 GlobalTransactionalInterceptor 中加入一個成員變量:

private volatile boolean disable;

在構造函數中進行初始化賦值:

Seata 中怎么動態配置訂閱與降級

ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION(service.disableGlobalTransaction)這個參數目前有兩個功能:

  1. 在啟動時決定是否開啟全局事務;

  2. 在開啟全局事務后,決定是否降級。

  • 實現 ConfigurationChangeListener:

Seata 中怎么動態配置訂閱與降級

這里的邏輯簡單,就是判斷監聽事件是否屬于 ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION 配置屬性,如果是,直接更新 disable 值。

  • 接下來在 GlobalTransactionalInterceptor#invoke 中做點手腳

Seata 中怎么動態配置訂閱與降級

如上,disable = true 時,不執行全局事務與全局鎖。

  • 配置中心訂閱降級監聽器

io.seata.spring.annotation.GlobalTransactionScanner#wrapIfNecessary

Seata 中怎么動態配置訂閱與降級

關于Seata 中怎么動態配置訂閱與降級就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安仁县| 图木舒克市| 房产| 分宜县| 通榆县| 彭泽县| 灵台县| 石城县| 延庆县| 临邑县| 奇台县| 绥芬河市| 渝中区| 桦川县| 沙坪坝区| 丰原市| 忻州市| 库车县| 北宁市| 夏河县| 贵南县| 漾濞| 庄河市| 泗阳县| 木兰县| 饶河县| 图片| 株洲市| 高邮市| 文登市| 芮城县| 隆德县| 上林县| 平遥县| 新兴县| 阿拉善右旗| 都兰县| 垣曲县| 鄢陵县| 比如县| 邢台县|