看一下“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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...