看一下“Dubbo 2.7”的三大新特性

来源:https://www.cnblogs.com/sevencutekk/archive/2019/09/10/11503174.html
-Advertisement-
Play Games

Dubbo 2.7.x 作為 Apache 的孵化版本,除了代碼優化之外,還新增了許多重磅的新特性,本文將會介紹其中最典型的三個新特性: 一、非同步化改造 二、三大中心改造 三、服務治理增強 一、非同步支持優化 我們知道dubbo協議本身支持三種發送請求方式: 單向發送:執行方法不需要返回結果 同步發送 ...


Dubbo 2.7.x 作為 Apache 的孵化版本,除了代碼優化之外,還新增了許多重磅的新特性,本文將會介紹其中最典型的三個新特性:

  • 一、非同步化改造
  • 二、三大中心改造
  • 三、服務治理增強
看一下“Dubbo 2.7”的三大新特性

 

一、非同步支持優化

我們知道dubbo協議本身支持三種發送請求方式:

單向發送:執行方法不需要返回結果

同步發送:執行方法後,等待結果返回,否則一直阻塞.

非同步發送:也就是當我發送調用後,我不阻塞等待結果,直接返回,將返回的future保存到上下文,方便後期使用。在非同步發送中有兩種方式分別是

future:當請求有響應後,通過future.get()來獲得響應結果,但是future.get()會導致線程阻塞,future從RpcContext獲取。

callback:設置一個回調線程,當接收到響應時,自動執行,不會對當前線程造成阻塞,自定義ResponseFuture支持callback。

2.6.x版本的非同步方式提供了一些非同步能力,包括Consumer端非同步調用、參數回調、事件通知等。但當前的非同步方式存在以下問題:

Future獲取方式不夠直接,只能在RpcContext中進行獲取;

Future只支持阻塞式的get()介面獲取結果。

Future介面無法實現自動回調,而自定義ResponseFuture雖支持callback回調但支持的非同步場景有限,如不支持Future間的相互協調或組合等;

不支持Provider端非同步

 

那麼在2.7.x版本,由於JDK版本升級到了1.8,引入了JDK1.8 中的CompletableFuture介面,CompletableFuture支持 future 和 callback 兩種調用方式。關於CompletableFuture怎麼被運用到dubbo中我會在後續的文章介紹。引入該介面後,做了以下優化:

支持Provider端非同步

支持直接定義返回CompletableFuture的服務介面。通過這種類型的介面,我們可以更自然的實現Consumer、Provider端的非同步編程。

public interface AsyncService { 
CompletableFuture<String> sayHello(String name);
}

如果你不想將介面的返回值定義為Future類型,或者存在定義好的同步類型介面,則可以額外定義一個非同步介面並提供Future類型的方法。

public interface GreetingsService { 
String sayHi(String name);
}
@AsyncFor(GreetingsService.class)
public interface GrettingServiceAsync extends GreetingsService {
CompletableFuture<String> sayHiAsync(String name);
}

如果你的原始介面定義不是Future類型的返回值,Provider端非同步也提供了類似Servlet3.0里的Async Servlet的編程介面: RpcContext.startAsync()

public interface AsyncService { 
String sayHello(String name);
}
public class AsyncServiceImpl implements AsyncService {
public String sayHello(String name) {
final AsyncContext asyncContext = RpcContext.startAsync();
new Thread(() -> {

asyncContext.write("Hello " + name + ", response from provider.");
}).start();
return null;
}
}

非同步過濾器鏈回調。

看一下“Dubbo 2.7”的三大新特性

 

二、三大中心改造

三大中心指的:註冊中心,元數據中心,配置中心。

在 2.7 之前的版本,Dubbo 只配備了註冊中心,主流使用的註冊中心為 zookeeper。新增加了元數據中心和配置中心,自然是為瞭解決對應的痛點,下麵我們來詳細闡釋三大中心改造的原因。

元數據改造

元數據是什麼?元數據定義為描述數據的數據,在服務治理中,例如服務介面名,重試次數,版本號等等都可以理解為元數據。在 2.7 之前,元數據一股腦丟在了註冊中心之中,這造成了一系列的問題:

推送量大 -> 存儲數據量大 -> 網路傳輸量大 -> 延遲嚴重

生產者端註冊 30+ 參數,有接近一半是不需要作為註冊中心進行傳遞;消費者端註冊 25+ 參數,只有個別需要傳遞給註冊中心。有了以上的理論分析,Dubbo 2.7 進行了大刀闊斧的改動,只將真正屬於服務治理的數據發佈到註冊中心之中,大大降低了註冊中心的負荷。

同時,將全量的元數據發佈到另外的組件中:元數據中心。元數據中心目前支持 redis(推薦),zookeeper。這也為 Dubbo 2.7 全新的 Dubbo Admin 做了準備,關於新版的 Dubbo Admin,我將會後續準備一篇獨立的文章進行介紹。

示例:使用 zookeeper 作為元數據中心

<dubbo:metadata-report address="zookeeper://127.0.0.1:2181"/>

Dubbo 2.6 元數據

dubbo://30.5.120.185:20880/com.alibaba.dubbo.demo.DemoService?
anyhost=true&
application=demo-provider&
interface=com.alibaba.dubbo.demo.DemoService&
methods=sayHello&
bean.name=com.alibaba.dubbo.demo.DemoService&
dubbo=2.0.2&
executes=4500&
generic=false&
owner=kirito&
pid=84228&
retries=7&
side=provider&
timestamp=1552965771067

從本地的 zookeeper 中取出一條服務數據,通過解碼之後,可以看出,的確有很多參數是不必要。

Dubbo 2.7 元數據

在 2.7 中,如果不進行額外的配置,zookeeper 中的數據格式仍然會和 Dubbo 2.6 保持一致,這主要是為了保證相容性,讓 Dubbo 2.6 的客戶端可以調用 Dubbo 2.7 的服務端。如果整體遷移到 2.7,則可以為註冊中心開啟簡化配置的參數:

<dubbo:registry address=“zookeeper://127.0.0.1:2181” simplified="true"/>

Dubbo 將會只上傳那些必要的服務治理數據,一個簡化過後的數據如下所示:

dubbo://30.5.120.185:20880/org.apache.dubbo.demo.api.DemoService?
application=demo-provider&
dubbo=2.0.2&
release=2.7.0&
timestamp=1552975501873

元數據中心的數據可以被用於服務測試,服務 MOCK 等功能。目前註冊中心配置中 simplified 的預設值為 false,因為考慮到了遷移的相容問題,在後續迭代中,預設值將會改為 true。

配置中心支持

衡量配置中心的必要性往往從三個角度出發:

  1. 分散式配置統一管理
  2. 動態變更推送
  3. 安全性

Spring Cloud Config, Apollo, Nacos 等分散式配置中心組件都對上述功能有不同程度的支持。在 2.7 之前的版本中,在 zookeeper 中設置了部分節點:configurators,routers,用於管理部分配置和路由信息,它們可以理解為 Dubbo 配置中心的雛形。在 2.7 中,Dubbo 正式支持了配置中心,目前支持的幾種註冊中心 Zookeeper,Apollo,Nacos(2.7.1-release 支持)。

在 Dubbo 中,配置中心主要承擔了兩個作用

  • 外部化配置。啟動配置的集中式存儲
  • 服務治理。服務治理規則的存儲與通知

示例:使用 Zookeeper 作為配置中心

<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>

引入配置中心後,需要註意配置項的覆蓋問題。

看一下“Dubbo 2.7”的三大新特性

 

三、服務治理增強

如果我們把 Dubbo 當做一個服務治理框架,而不僅僅是一個 RPC 框架。在 2.7 中,Dubbo 對其服務治理能力進行了增強,增加了標簽路由的能力,並抽象出了應用路由和服務路由的概念。在最後一個特性介紹中,著重對標簽路由 TagRouter 進行探討。

在服務治理中,路由層和負載均衡層的對比。區別 1,Router:m 選 n,LoadBalance:n 選 1;區別 2,路由往往是疊加使用的,負載均衡只能配置一種。

在很長的一段時間內,Dubbo 社區經常有人提的一個問題是:Dubbo 如何實現流量隔離和灰度發佈,直到 2.7 提供了標簽路由,用戶可以使用這個功能,來實現上述的需求。

看一下“Dubbo 2.7”的三大新特性

 

標簽路由提供了這樣一個能力,當調用鏈路為 A -> B -> C -> D 時,用戶給請求打標,最典型的打標方式可以藉助 attachment(他可以在分散式調用中傳遞下去),調用會優先請求那些匹配的服務端,如 A -> B,C -> D,由於集群中未部署 C 節點,則會降級到普通節點。

打標方式會收到集成系統差異的影響,從而導致很大的差異,所以 Dubbo 只提供了 RpcContext.getContext().setAttachment() 這樣的基礎介面,用戶可以使用 SPI 擴展,或者 server filter 的擴展,對測試流量進行打標,引導進入隔離環境/灰度環境。新版的 Dubbo Admin 提供了標簽路由的配置項,Dubbo 用戶可以在自己系統的基礎上對標簽路由進行二次擴展,或者借鑒標簽路由的設計,實現自己系統的流量隔離,灰度發佈。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 安裝方法: 註:python環境一定要配置好。 1.第一步:下載 官方網站:http://www.pyinstaller.org/downloads.html 此處下載版本為穩定版。 2.第二步:下載完成後解壓,打開cmd。 例如:我的在F盤根目錄下。可更換目錄,建議不要有目錄不要帶有中文。 上圖: ...
  • 1. 為什麼用HashMap? 1. 簡述一下Map類繼承關係? 1. 解決哈希衝突的方法? 1. 為什麼HashMap線程不安全? 1. resize機制? 1. HashMap的工作原理是什麼? 1. 有什麼方法可以減少碰撞? 1. HashMap中hash函數怎麼是是實現的? 1. 拉鏈法導致 ...
  • Intellij IDEA在maven項目中添加外部Jar包運行,我們知道Intellij IDEA是非常好用的Java語言開發的集成環境。提供了非常多實用的功能,包括了智能代碼助手、代碼自動提示、代碼重構、各種插件等,當然也集成了maven,正常情況下,我們創建maven項目時,相關的jar包會自... ...
  • 前言 上網瀏覽網頁的時候,看見好的內容免不了要使用複製粘貼,但是我們看到的內容、心裡想要的內容和實際粘貼後的內容往往不一致。數據的獲取始於複製,終於粘貼,那麼問題來了,在這中間系統做了哪些操作,我們怎麼能控制它呢? 人生苦短,我用python,查閱相關資料之後發現有很多不一樣的實現方式,如利用內置c ...
  • range函數可創建一個整數列表。 如果需要知道當前元素在列表中的索引,推薦用enumerate代替range。 zip函數用於同時遍歷多個迭代器。 ...
  • 最近在研究SpringAOP,當然要學習AOP就要知道這麼健碩、強大的功能的背後究竟隱藏著怎樣不可告人的“秘密”?? 接下來就是查閱了許多資料詳細的研究了一下Java的代理模式,感覺還是非常非常重要的, 我們作為一個有“內涵的”程式員就更應該掌握啦!(本文需要細心、帶有審視的目光來甄別其中的內容) ...
  • 首先我們在名為MSG的服務中定義一個簡單的方法 我們需要在另一個服務中調用這個服務的方法,除了使用httpclient之外,我們還能用RestTemplate(RestTemplate是Spring提供的用於訪問Rest服務的客戶端) 第一種方式,這種方式只要指定url和返回類型即可調用,但是url ...
  • 摘要: 關於這個話題可能最多的是 和`@Transactional`一起混用,我先解釋一下什麼是代理對象內嵌調用,指的是一個代理方法調用了同類的另一個代理方法。首先在這兒我要聲明事務直接的嵌套調用除外,至於為什麼,是它已經將信息保存線上程級別了,是不是又點兒抽象,感覺吃力,可以看看我前面關於事務的介 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...