Dubbo 用到哪些設計模式?

2021-10-04 17:54:21 字數 1471 閱讀 5765

dubbo 框架在初始化和通訊過程中使用了多種設計模式,可靈活控制類載入、許可權控制等功能。

工廠模式

provider 在 export 服務時,會呼叫 serviceconfig 的 export 方法。serviceconfig中有個字段:

private static final protocol protocol =

extensionloader.

getextensionloader

(protocol.class)

.getadaptiveextension()

;

dubbo 裡有很多這種**。這也是一種工廠模式,只是實現類的獲取採用了 jdk spi 的機制。這麼實現的優點是可擴充套件性強,想要擴充套件實現,只需要在 classpath下增加個檔案就可以了,**零侵入。另外,像上面的 adaptive 實現,可以做到呼叫時動態決定呼叫哪個實現,但是由於這種實現採用了動態**,會造成**除錯比較麻煩,需要分析出實際呼叫的實現類。

裝飾器模式

echofilter -> classloaderfilter -> genericfilter -> contextfilter ->

executelimitfilter -> tracefilter -> timeoutfilter -> monitorfilter ->

exceptionfilter

更確切地說,這裡是裝飾器和責任鏈模式的混合使用。例如,echofilter 的作用是判斷是否是回聲測試請求,是的話直接返回內容,這是一種責任鏈的體現。而像classloaderfilter 則只是在主功能上新增了功能,更改當前執行緒的 classloader,這是典型的裝飾器模式。

觀察者模式

dubbo 的 provider 啟動時,需要與註冊中心互動,先註冊自己的服務,再訂閱自己的服務,訂閱時,採用了觀察者模式,開啟乙個 listener。註冊中心會每 5 秒定時檢查是否有服務更新,如果有更新,向該服務的提供者傳送乙個 notify 訊息,provider 接受到 notify 訊息後,即執行 notifylistener 的 notify 方法,執行***方法。

動態**模式

dubbo 擴充套件 jdk spi 的類 extensionloader 的 adaptive 實現是典型的動態**實現。dubbo 需要靈活地控制實現類,即在呼叫階段動態地根據引數決定呼叫哪個實現類,所以採用先生成**類的方法,能夠做到靈活的呼叫。生成**類的**是 extensionloader 的 createadaptiveextensionclasscode 方法。**類的主要邏輯是,獲取 url 引數中指定引數的值作為獲取實現類的 key

Spring框架中用到了哪些設計模式

設計模式 spring aop功能的實現。單例設計模式 spring中的bean預設都是單例的。模板方法模式 spring 中 jdbctemplate hibernatetemplate 等以 template結尾的對資料庫操作的類,它們就使用到了模板模式。包裝器設計模式 我們的專案需要連線多個資...

Spring 框架中用到了哪些設計模式?

spring 框架中用到了哪些設計模式?設計模式 spring aop 功能的實現。單例設計模式 spring 中的 bean 預設都是單例的。模板方法模式 spring 中 jdbctemplate hibernatetemplate 等以 template 結尾的對資料庫操作的類,它們就使用到了...

Spring 框架中都用到了哪些設計模式?

spring 框架中都用到了哪些設計模式?設計模式 spring aop 功能的實現。單例設計模式 spring 中的 bean 預設都是單例的。模板方法模式 spring 中jdbctemplate hibernatetemplate等以 template 結尾的對資料庫操作的類,它們就使用到了模...