Apache ShenYu(incubating) 2.4.0: 讓API網關更簡單

聲明:本文中的Apache ShenYu 都指的是 Apache ShenYu (incubating) 本人做者:肖宇 Apache ShenYu(incubating) Founder && PPMC 2.4.0 Release Manager : 張永倫 Apache ShenYu(incubating) PPMC && Apache ShardingSphere PMC前端

全部的朋友們:react

Apache ShenYu網關是原 Dromara/soul 網關捐獻給Apache基金會後更名而來, 這次發佈的 2.4.0 版本是 Apache ShenYu 網關進入Apache孵化器後的首個版本。這個版本涉及不少新功能的增長, 項目名稱,包名以及maven依賴座標的變動。git

Apache ShenYu 是什麼?

Apache ShenYu是使用Java reactor編程方式開發的,具備異步高性能跨語言等特性的 API 網關。 在流量控制方面,有精美的Admin控制檯,可以精準動態控制流量,知足複雜的業務場景。 在功能方面,它使用插件化的設計思想,支持許多常見的協議:如 http/httpsDubboSpring CloudGRPCMotan SofaTars 等。 同時內置十分豐富的功能插件,如 熔斷限流鑑權黑白名單防火牆監控參數更改等等插件。其架構圖以下:github

流量控制

對流量的控制是網關的靈魂,針對流量控制,Apache ShenYu 設計了選擇器規則 2個概念,來控制流量。web

選擇器規則Apache ShenYu 網關中最靈魂的東西。掌握好它,你能夠對任何流量進行管理。正則表達式

一個插件有多個選擇器,一個選擇器對應多種規則。選擇器至關因而對流量的一級篩選,規則就是最終的篩選。redis

對一個插件而言,咱們但願根據咱們的配置,達到知足條件的流量,插件纔會被執行。算法

選擇器和規則就是爲了讓流量在知足特定的條件下,纔去執行咱們想要的,這種規則首先要明白。spring

插件、選擇器和規則執行邏輯以下,當流量進入到Apache ShenYu網關以後,會先判斷是否有對應的插件,該插件是否開啓;而後判斷流量是否匹配該插件的選擇器。apache

而後再判斷流量是否匹配該選擇器的規則。若是請求流量能知足匹配條件纔會執行該插件,不然插件不會被執行,處理下一個。

Apache ShenYu網關就是這樣經過層層篩選完成流量控制。其流程圖以下 :

流量篩選

流量篩選,是選擇器規則靈魂,對應爲選擇器與規則裏面的匹配條件(conditions),根據不一樣的流量篩選規則,咱們能夠處理各類複雜的場景。

流量篩選能夠從Header, URI, Query, Cookie 等等Http請求獲取數據,

而後能夠採用 Match=SpELRegexGroovy等匹配方式,匹配出你所預想的數據。

多組匹配添加可使用And/Or的匹配策略。上述都是採用SPI的設計思想,用戶能夠自主進行擴展 :更多的請查看 : shenyu.apache.org/zh/projects…

其過程圖以下 :

數據同步與緩存

爲了提高網關的性能Apache ShenYu 網關會將全部的流量控制規則緩存在JVM 內存裏面。在集羣部署/分佈式場景中,Apache ShenYu 自主研發了一套 將 Admin 控制檯的數據,遠程同步到每個 Apache ShenYu 網關節點 JVM內存 的方案

每一種方案,採用 SPI 設計思想,以供用戶靈活的選擇。目前支持的方案有 HttpLongPull, Websocket, Zookeeper, Nacos, Consul, ETCD。 其總體流程以下 :

Admin控制檯

爲了方便用戶快速便捷的控制流量以及網關的全部功能特性,Apache ShenYu 提供了 一個十分精美的Admin控制檯,用戶能夠中英文切換,在這上面,能夠隨意的控制流量啓停插件配置不一樣的參數與策略,這些操做更改經過上述的數據同步原理,同步到網關的 JVM內存。其後臺示意圖以下:

菜單/數據權限

網關的後臺管理是十分重要的,爲了針對企業級的用戶,跨部門應用代理,Apache ShenYu設計了一整套的權限控制體系,它包含按鈕級別的菜單權限,以及行數據級別的數據權限。而且這些權限控制在 Admin控制檯 自主自動可配。

協議代理

協議代理是網關最核心的功能,目前 Apache ShenYu 支持 http 轉成 http/httpsWebsocket,DubboSpring CloudGRPCMotan SofaTars 等協議的轉換,將來將支持 TCP, MQTT,MQTT 等協議。

Divide插件

Divide插件,是用來專門代理 http/https/websocket 等方式請求 Apache ShenYu 網關的插件。 它具備 負載均衡流量預熱, 節點發現超時重試超時控制 等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 -->Divide插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
   <groupId>org.apache.shenyu</groupId>
   <artifactId>shenyu-spring-boot-starter-plugin-divide</artifactId>
   <version>${project.version}</version>
</dependency>
<dependency>
   <groupId>org.apache.shenyu</groupId>
   <artifactId>shenyu-spring-boot-starter-plugin-httpclient</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Dubbo插件

Dubbo插件,是Apache ShenYu網關將 http/https 請求轉換成 dubbo協議的插件 。 它採用了Dubbo泛化調用的機制,整合了 Dubbo的客戶端,具備服務發現負載均衡 等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> dubbo插件將其設置爲 開啓,而且配置上註冊中心, 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<!-- apache shenyu alibaba dubbo plugin start-->
<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
   <version>${project.version}</version>
</dependency>
<!-- apache shenyu apache dubbo plugin start-->
<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-apache-dubbo</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

SpringCloud插件

SpringCloud插件,是Apache ShenYu網關代理 SpringCloud微服務業務的插件 。 它整合了 SpringCloud的註冊中心,以及負載均衡服務,實現了服務的代理。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> SpringCloud插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-springcloud</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

GRPC插件

GRPC插件,是Apache ShenYu網關將 http/https 請求轉換成 GRPC協議的插件 。 它整合了 GRPC 客戶端,實現了 GRPC服務的代理。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> GRPC插件將其設置爲 開啓。 更詳細的介紹請看 :shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-grpc</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Tars插件

Tars插件,是Apache ShenYu網關將 http/https 請求轉換成 Tars協議的插件 。 Tars是騰訊開源的 RPC框架, 該插件整合了 Tars-JAVA 客戶端,實現了 Tars服務的代理。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> Tars插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-tars</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Sofa插件

Sofa插件,是Apache ShenYu網關將 http/https 請求轉換成 Sofa-RPC協議的插件 。 它採用了Sofa泛化調用的機制,整合了 Sofa-RPC的客戶端,具備服務發現負載均衡 等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> sofa插件將其設置爲 開啓,而且配置上註冊中心。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-sofa</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

熔斷限流

Hystrix插件

Hystrix插件,是Apache ShenYu網關整合Hystrix框架,提供請求熔斷的功能,Hystrix熔斷參數可動態化配置。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> Hystrix插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-hystrix</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Sentinel插件

Sentinel插件,是Apache ShenYu網關整合Sentinel框架,提供請求熔斷限流的功能,Sentinel熔斷限流參數可動態化配置。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> Sentinel插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-sentinel</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Resilience4j插件

Resilience4j插件,是Apache ShenYu網關整合Resilience4j框架,提供請求熔斷限流的功能,Resilience4j熔斷限流參數可動態化配置。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> Resilience4j插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-resilience4j</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

RateLimiter插件

RateLimiter插件,是Apache ShenYu網關使用redis,提供請求集羣限流的功能,限流算法策略有:令牌桶算法,併發限流漏桶算法滑動窗口算法。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> RateLimiter插件將其設置爲 開啓,而且配置上redis。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-ratelimiter</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

安全/權限認證

Waf插件

Waf插件,是Apache ShenYu網關,用來對流量實現防火牆,主要用來攔截非法請求,或者異常請求,而且給與相關的拒絕策略,它提供了黑白名單配置的功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> Waf插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-waf</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Sign插件

Sign插件,是Apache ShenYu網關,用來對請求進行簽名認證。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> Sign插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-sign</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

JWT插件

JWT插件,是Apache ShenYu網關,是針對 http 請求頭的 token 屬性或者是 authorization 屬性攜帶值進行鑑權判斷,兼容 OAuth2.0。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> jwt插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-jwt</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

OAuth2插件

OAuth2插件,是Apache ShenYu網關,使用 Webflux OAuth2客戶端實現,用於支持 OAuth2 協議。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> oauth2插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-oauth2</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

個性化處理

Rewrite插件

Rewrite插件,是Apache ShenYu網關,支持使用正則表達式來重寫URI的插件。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> rewrite插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-rewrite</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Redirect插件

Redirect插件,是Apache ShenYu網關,將請求進行重定向的插件,支持網關內部接口與外部地址。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> redirect插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-redirect</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Request插件

Request插件,是Apache ShenYu網關允許用戶對請求參數請求頭 以及 Cookie 進行添加修改刪除等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> request插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-request</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Context-Path插件

Context-Path插件,是Apache ShenYu網關,允許用戶對請求路徑上的 Context-Path,進行 添加修改刪除等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> context_path插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-context-path</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Param-Mapping插件

Param-Mapping插件,是Apache ShenYu網關,允許用戶對請求體中的 Body,進行 添加修改刪除字段等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> param_mapping插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-param-mapping</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

ModifyResponse插件

ModifyResponse插件,是Apache ShenYu網關,用來對請求響應體中的 響應頭,狀態碼響應內容,進行 添加修改刪除等功能。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> modifyResponse插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-modify-response</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

可觀測性

Monitor插件

Monitor插件,是Apache ShenYu網關,使用 prometheus來完成對請求量QPS, JVM等相關metrics進行監控的插件。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> monitor插件將其設置爲 開啓, 而且配置 prometheus相關參數。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-monitor</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

Logging插件

Monitor插件,是Apache ShenYu網關,允許用戶日誌中打印本次請求信息,包含 請求路徑請求方法請求參數響應頭響應體等信息。用戶想要使用它,請在網關添加以下依賴, 而後在 Admin控制檯 --> 插件管理 --> logging插件將其設置爲 開啓。 更詳細的介紹請看 : shenyu.apache.org/zh/projects…

<dependency>
  <groupId>org.apache.shenyu</groupId>
  <artifactId>shenyu-spring-boot-starter-plugin-logging</artifactId>
   <version>${project.version}</version>
</dependency>
複製代碼

下一個版本規劃

  • RPC框架灰度發佈加強,包含 SpringCloudGRPCDubboSofa-RPCTars等。

  • 新增ShenYu-Agent模塊,打造網關metrics, tracing, logging 等可觀測性體系。

  • 自定義插件動態加載,方便用戶快速,不停機擴展與更新。

  • 集成測試 + 單元測試 全面覆蓋。

社區

Apache ShenYu 是徹底由國人主導的自主性社區開源項目,目前處在高速發展時期,功能開發文檔完善BUG修復 等大量的事情須要完成。Apache ShenYu 社區遵循 Apache Way的社區理念,打造一個徹底開放治理的社區。每半個月,會進行一次全體社區會議,社區的committers,contributors, users都會參與其中,在會議上你們能夠暢所欲言,提出本身的觀點和見解,好比對不一樣的功能,不一樣的代碼進行討論,最好達成一致性的觀點。在Apache ShenYu 社區中,咱們推崇郵件列表 > Github Issue > 微信羣的溝通優先級的原則。 主要的目的是讓每個問題,沒一個觀點,都有記錄存檔,更好的幫助他人,以推動社區的可持續發展。

郵件訂閱

  • 發送訂閱郵件。

用本身的郵箱向dev-subscribe@shenyu.apache.org發送一封郵件,主題和內容任意。

  • 接收確認郵件並回復。

完成步驟1後,您將收到一封來自dev-help@shenyu.apache.org的確認郵件(如未收到,請確認該郵件是否已被攔截,或已經被自動納入訂閱郵件、垃圾郵件、推廣郵件等文件夾)。直接回復該郵件,或點擊郵件裏的連接快捷回覆便可,主題和內容任意。

  • 接收歡迎郵件。

完成以上步驟後,您會收到一封主題爲WELCOME to dev@shenyu.apache.org的歡迎郵件,至此您已成功訂閱Apache ShenYu的郵件列表。

GitHub

Gitee

社區微信羣

相關文章
相關標籤/搜索