Dubbo3.3 Triple協議處理東西向流量

前言

Apache Dubbo 3.3 對 Triple 協議做了升級,現在 Dubbo 不僅可以處理東西向流量,也可以處理南北向流量。

**東西向流量(East-West Traffic) **

指數據中心或網絡內部同級設備/服務之間的通信。例如,微服務之間的內部調用。

南北向流量(North-South Traffic)

指網絡外部用戶與內部服務之間的通信。例如,客戶端訪問微服務。

之前的 Dubbo 一般只用來處理服務內部的高性能RPC調用,外部用戶要想訪問 Dubbo 服務,只能再額外部署一個網關層,網關負責把 HTTP 協議轉換成 dubbo 協議。這樣一來,不僅網絡多了一跳增加時延,維護難度也大大增加。

另外,由于需要在 Web 框架和 RPC 框架之間頻繁切換,開發復雜度和性能均有影響,比如:

  • 針對 Web 框架和 RPC 框架的諸如:日志、監控、攔截器、異常處理等,都需要重復開發
  • Web 框架和 RPC 框架都有自己處理任務的線程池,系統需要在二者之間頻繁切換,影響性能

Apache Dubbo 3.3 Triple X 協議的誕生,直接回應了這些痛點。支持東西向流量,只是 Triple X 其中一個特性,完整功能參考:Apache Dubbo 3.3 全新發布:Triple X 領銜,開啟微服務通信新時代

安裝&使用

最新的版本目前是3.3.5,如果只用 dubbo,引入下面一個依賴即可。

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.3.5</version>
</dependency>

RestService 服務開發,因為要處理南北向流量,需要通過@Mapping等注解聲明請求路徑和參數等信息。

@Mapping(path = "/")
public interface RestService {@Mapping(path = "/hello", method = HttpMethods.GET)String hello(@Param("name") String name);
}public class RestServiceImpl implements RestService {@Overridepublic String hello(String name) {return "hello " + name;}
}

接著,啟動服務即可。如下代碼,服務暴露的端口是 50000,協議名是簡寫的tri

public class Provider {public static void main(String[] args) {ServiceConfig<RestService> serviceConfig = new ServiceConfig<>();serviceConfig.setInterface(RestService.class);serviceConfig.setRef(new RestServiceImpl());ApplicationConfig applicationConfig = new ApplicationConfig("provider");applicationConfig.setQosEnable(false);DubboBootstrap.getInstance().application(applicationConfig).protocol(new ProtocolConfig("tri", 50000)).service(serviceConfig).registry(new RegistryConfig("N/A")).start().await();}
}

triple 默認支持 HTTP1和HTTP2,如果要使用HTTP3需要引入額外依賴。現在,通過IP+端口就可以直接以 http 協議訪問服務了。

$ curl 127.0.0.1:50000/hello\?name=triple
"hello triple"

整合Spring Boot

單獨用 Dubbo 開發比較少,一般都是整合 Spring Boot 一起用。要整合 Spring Boot,引入下面依賴:

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.5</version>
</dependency>

application.yml配置 Dubbo 協議部分

dubbo:protocol:name: triport: 50000

Dubbo 默認支持 Spring Web 注解,所以用 Dubbo 寫 Web API 和之前幾乎沒區別,如下所示:

沒有@RestController,但是必須加@DubboService

@DubboService
@RequestMapping
public class MyRestController {@GetMapping("/hello")public String hello(@RequestParam("name") String name) {return "hello " + name;}
}

啟動類上加@EnableDubbo啟用 Dubbo,訪問 50000 端口即可訪問服務。

$ curl 127.0.0.1:50000/hello?name=triple
"hello triple"

分端口混合模式

如果舊項目已經用 Spring MVC 開發了一些 API,但是新的 API 想用 Dubbo 開發,可以用區分端口的混合模式部署。區分端口,也就是 Web 容器占用一個端口,Dubbo 占用一個端口,彼此之間互不干擾。

項目同時依賴spring-boot-starter-web和 Dubbo

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.5</version>
</dependency>

application.yml分別配置 Web 容器端口和 Dubbo 協議端口

server:port: 8080
dubbo:protocol:name: triport: 50000

這樣一來,之前的 API 通過 8080 端口訪問,Dubbo API 通過 50000 端口訪問,互不影響。

一種更方便的寫法,在 Controller 上同時加@Controller@DubboService注解,8080 和 50000 端口都可以訪問這個 API。但是要注意,Spring MVC 的所有功能并非 Dubbo 都支持,實測下來發現 Spring 的Web攔截器和全局異常處理,通過Dubbo訪問是不生效的。

同端口混合模式

如果不想 Dubbo 再額外占用端口,也可以采用不區分端口的混合模式部署。

引入下面這個依賴

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-3-autoconfigure</artifactId><version>3.3.5</version>
</dependency>

application.yml把 triple 協議端口和server.port配置相同,Dubbo 將不再占用新端口,可復用 Spring Boot 已有 servlet 監聽端口來接入 HTTP 流量,符合filter-url-patterns路徑的請求會轉交給 Dubbo 處理。

server:port: 8080
dubbo:protocol:name: triport: 8080triple:servlet:enabled: truefilter-url-patterns: /dubbo/*filter-order: -1000000

你可能會感到好奇,不監聽新端口,Dubbo 是怎么處理請求的呢?

實際上,在引入上述依賴后,Spring 啟動會觸發 DubboTripleAutoConfiguration 自動裝配,并向容器注冊一個FilterRegistrationBean,它會向 Servlet 容器注冊一個jakarta.servlet.Filter實現,只要它的優先級比默認的org.springframework.web.filter.OncePerRequestFilter高,就可以提前接管 Web 流量。

Dubbo 注冊的是 TripleFilter,只要請求路徑匹配,它將接管請求,不通過后續 Filter。并且內置了 HTTP1和HTTP2的支持。

異常處理

全局異常處理是基本操作,服務端處理異常需要返回一個友好的信息給到客戶端。

默認發生異常時,Dubbo 會封裝成 ErrorResponse 對象返回

@Data
public class ErrorResponse {private String status;private String message;
}

默認 status = 500,message 是異常信息,例如:

{"message": "name is null","status": "500"
}

但是,一般系統會封裝自己的錯誤碼和錯誤信息,而且會區分是一般的業務異常,還是系統異常。Dubbo 的處理方式顯得過于簡單粗暴,所以我們要定義自己的異常處理器。

Triple 異常處理器實現 org.apache.dubbo.remoting.http12.ExceptionHandler 接口,如下所示:

@Activate
public class CustomExceptionHandler implements ExceptionHandler<Throwable, HttpResult> {@Overridepublic HttpResult handle(Throwable throwable, RequestMetadata metadata, MethodDescriptor descriptor) {if (throwable instanceof BizException exception) {return HttpResult.builder().status(200).body(JSON.toJSONString(R.failed(exception.getCode(), exception.getMessage()))).build();}return HttpResult.builder().status(500).body("system error").build();}
}

Tips:CustomExceptionHandler 需要 Dubbo SPI 激活

如果發生業務異常,會正常返回 HttpStatus=200,body 示例:

{"code": 400,"message": "name is too long"
}

如果是非業務異常,會返回 HttpStatus=500,body:system error

過濾器

之前 dubbo 協議的過濾器是基于 org.apache.dubbo.rpc.Filter 接口實現的,參數只能拿到 Invoker 和 Invocation。

Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException;

這對基于 HTTP 的 triple 協議來說顯然不夠友好,HTTP 協議的攔截我們一般會基于 Query Parameters 或 Headers 去做一些諸如:參數驗簽、認證授權、路由等操作,我們更熟悉的應該是 HttpRequest HttpResponse 對象。

所以,Dubbo 也提供了新的過濾器接口 org.apache.dubbo.rpc.protocol.tri.rest.filter.RestFilter,如下所示,過濾器實現驗簽、鑒權等操作,前提是需要 SPI 激活。

@Activate(group = "provider", order = 100)
public class CustomRestFilter implements RestFilter {@Overridepublic void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) throws Exception {// todo 參數驗簽...String sign = request.header("sign");// todo 認證鑒權...String authorization = request.header("Authorization");chain.doFilter(request, response);}
}

RestFilter 還有一個內部接口 Listener,用于修改響應結果,或者發生異常時返回自定義信息。

interface Listener {default void onResponse(Result result, HttpRequest request, HttpResponse response) throws Exception {}default void onError(Throwable t, HttpRequest request, HttpResponse response) throws Exception {}
}

尾巴

Apache Dubbo 3.3 通過升級 Triple 協議,不僅支持東西向流量(服務間調用),也擴展至南北向流量(外部訪問服務)。這一改進消除了額外部署網關層的需求,減少了時延和維護難度。Triple協議默認支持HTTP1/HTTP2,并可選擇支持HTTP3。

異常處理和過濾器功能也得到了優化,提供了更靈活、友好的處理方式。Triple 協議通過 SPI 激活的ExceptionHandlerRestFilter接口,使開發者可以自定義異常響應和請求攔截。

這些改進使Dubbo在微服務架構中更具靈活性和擴展性,適應多樣化的應用場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95943.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統核心特點詳解:從并發到分布式,一文搞懂考研必備知識

操作系統核心特點詳解&#xff1a;從并發到分布式&#xff0c;一文搞懂考研必備知識 大家好&#xff0c;今天咱們來聊聊操作系統&#xff08;OS&#xff09;這個計算機世界的“大管家”。想象一下&#xff0c;你的電腦就像一個忙碌的廚房&#xff0c;操作系統就是那個廚師長&am…

2025精選5款AI視頻轉文字工具,高效轉錄秒變文字!

視頻轉文本的需求早已滲透到生活的方方面面&#xff1a;網課學習需要提取課件臺詞、會議記錄想快速整理要點、追劇時急需生肉轉字幕…… 手動記錄不僅費時&#xff0c;還容易遺漏關鍵信息。今天就分享5款實用工具&#xff0c;從免費到專業全覆蓋&#xff0c;幾步操作就能讓視頻…

MyBatis Example模式SQL注入風險

在使用MyBatis逆向工程生成的Example查詢模式時&#xff0c;很多開發者看到XML中存在${}占位符就會擔心SQL注入問題。但實際上&#xff0c;存在${}并不等同于存在SQL注入風險。本文將詳細分析何時會存在真正的注入風險。 存在SQL注入的兩個關鍵前提 前提一&#xff1a;Criteria…

寶塔PostgreSQL安裝pgvecto插件contrib包實現向量存儲

1. 寶塔安裝 首先確保你的寶塔已經安裝了 PostgreSQL。 安裝好后是能看到上面這個界面的。 我安裝的是 16.1 版本&#xff0c;下面的教程講的也是 16.1 版本的。 2.開放防火墻的端口號 5432 3.允許外部訪問所有數據庫 4.設置超級管理員用戶密碼 用戶名默認為&#xff1a;po…

麒麟系統 doc轉pdf

# 安裝LibreOffice&#xff08;如果尚未安裝&#xff09; sudo apt update sudo apt install libreoffice# 將DOC轉換為PDF libreoffice --headless --convert-to pdf 你的文檔.doc# 或者指定輸出目錄 libreoffice --headless --convert-to pdf --outdir /輸出目錄 你的文檔.do…

Python實現生成矩形框、三角形框、六邊形框和圓環點云

本節我們分享上節提到的不填充點云。在點云處理、計算機視覺與工業檢測中&#xff0c;幾何輪廓&#xff08;邊框/環&#xff09;點云比實心點云更能反映物體的邊緣特征、結構骨架與形貌突變區域。Python 借助 NumPy 即可快速生成矩形邊框、三角形邊框、六邊形邊框與圓環點云&am…

2025年本體論:公理與規則的挑戰與趨勢

摘要本文章旨在深入探討本體論&#xff08;Ontology&#xff09;中公理&#xff08;Axioms&#xff09;與規則&#xff08;Rules&#xff09;的核心概念、技術實現、驗證方法、性能評估及其在2025年的前沿趨勢與挑戰。公理與規則是構建嚴謹、一致知識模型的邏輯基石&#xff0c…

【51單片機】【protues仿真】基于51單片機PM2.5空氣質量檢測系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示 2、按鍵?設置閾值 3、PM2.5大于閾值時啟動聲光警報 二、使用步驟 基于51單片機的PM2.5空氣質量檢測系統通常采用STC89C51/52作為核心控制器&#xff0c;結合…

【目錄-單選】鴻蒙HarmonyOS開發者基礎

用哪一種裝飾器修飾的組件可作為頁面入口組件&#xff1f;Look at the answer下面是ArkTS中類名、枚舉名推薦的代碼風格是 Look at the answer向服務器提交表單數據&#xff0c;以下哪種請求方式比較合適 Look at the answer使用http發起網絡請求&#xff0c;需要以下哪種權限&…

maven【maven】技術詳解

MavenMaven的本質是項目管理工具&#xff0c;將項目開發和管理過程抽象成一個項目對象模型&#xff08;POM&#xff09;Project Object Model&#xff1a;項目對象管理模型作用&#xff1a; 項目構建&#xff1a;提供標準的、跨平臺的自動化項目構建方式依賴管理&#xff1a;方…

【操作系統-Day 25】死鎖 (Deadlock):揭秘多線程編程的“終極殺手”

Langchain系列文章目錄 01-玩轉LangChain&#xff1a;從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊&#xff1a;四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain&#xff1a;從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

【嵌入式C語言】七

8.4函數的聲明和定義聲明一個函數意味著向編譯器描述函數名、返回值、參數個數和類型&#xff0c;但并不會為函數分配存儲空間定義一個函數意味著在聲明變量的同時還要有具體的實現&#xff0c;并且會為函數分配存儲空間8.5多源文件的函數聲明和定義8.6預處理指令#Include#incl…

hardhat3 源神 -- 啟動!

Hardhat 項目開發環境搭建完整指南 1. 從 GitHub 下載項目 # 使用 SSH 方式克隆&#xff08;需要配置 SSH key&#xff09; git clone gitgithub.com:NomicFoundation/hardhat.git# 或使用 HTTPS 方式 git clone https://github.com/NomicFoundation/hardhat.git# 進入項目目錄…

遇到 Git 提示大文件無法上傳確實讓人頭疼

遇到 Git 提示大文件無法上傳確實讓人頭疼&#xff0c;但別擔心&#xff0c;我們可以一步步來解決。為了讓你更清晰地了解整個流程&#xff0c;我先用一個表格來概括主要步驟&#xff1a;步驟核心操作關鍵命令/工具示例 (用于刪除歷史中的大文件)1. 定位大文件使用 Git 命令或工…

機器人控制器開發(傳感器層——奧比大白相機適配)

編譯OrbbecSDK_ROS2的代碼 執行命令 colcon buildros2 launch orbbec_camera dabai.launch.py問題1&#xff1a; 運行時報錯&#xff1a; [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not load library…

C語言(長期更新)第15講 指針詳解(五):習題實戰

C語言&#xff08;長期更新&#xff09;第15講 指針詳解&#xff08;五&#xff09;&#xff1a;習題實戰 跟著潼心走&#xff0c;輕松拿捏C語言&#xff0c;困惑通通走&#xff0c;一去不回頭~歡迎開始今天的學習內容&#xff0c;你的支持就是博主最大的動力。博主主頁&#…

數據倉庫概要

什么是數據倉庫&#xff1f; 數據倉庫是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合&#xff0c;用于支持管理決策。 核心特征 1. 面向主題 數據倉庫圍繞核心業務主題&#xff08;如客戶、產品、銷售、財務&#xff09;來組織數據&#xff0c;而不是圍繞具體的…

python庫 Py2exe 的詳細使用(將 Python 腳本變為Windows獨立軟件包)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、Py2exe 概述 1.1 Py2exe介紹 1.2 Py2exe安裝 1.3 替代工具推薦 二、基礎使用 2.1 編寫打包腳本 2.2 執行打包命令 2.3 完整案例 2.4 配置選項詳解 2.5 構建和分發 三、高級配置 3.1 包含隱藏導入 3.2 處理特殊包…

CuTe C++ 簡介02,gemm_device cuda kernel 的實現

《CuTe C 簡介01&#xff0c;從示例開始 》 中&#xff0c;最后看到了 計算 gemm 的cuda kernel&#xff0c;使用 NVIDIA CUTLASS 的 CUTe (CUDA Tile) 庫實現的高性能 GEMM (通用矩陣乘法) CUDA kernel。接下來解釋一下這個內核的各個部分。文末再貼一遍代碼&#xff0c;方便查…

萬代《寶可夢》主題新品扭蛋公開!史上最大尺寸

使用jQuery的常用方法與返回值分析 jQuery是一個輕量級的JavaScript庫&#xff0c;旨在簡化HTML文檔遍歷和操作、事件處理以及動畫效果的創建。本文將介紹一些常用的jQuery方法及其返回值&#xff0c;幫助開發者更好地理解和運用這一強大的庫。 1. 選擇器方法 jQuery提供了多種…