动态

详情 返回 返回

網關係統就該這麼設計(萬能通用),穩的一批! - 动态 详情

提到網關係統,大家第一個想到的肯定是Gateway或Zuul這些Spring Cloud給我們提供的組件,不過這些網關使用時都需要寫代碼。今天給大家分享一款可視化的網關係統Apache ShenYu,無需寫代碼即可使用,設計優秀,功能強大!

ShenYu簡介

Apache ShenYu是一款異步的、高性能的、跨語言的、響應式的API網關,目前在Github上已有8.5k+Star

它具有如下特性:

  • 支持多種代理協議:HTTP、Dubbo,Spring Cloud,gRPC,WebSocket,MQTT等
  • 支持多種認證方式:Sign、OAuth2、JWT、BasicAuth、WAF等
  • API治理:支持請求、響應、參數映射、負載均衡、熔斷限流等功能
  • 可視化管理:支持動態流量控制,權限管理、插件管理等功能
  • 插件生態豐富:插件支持熱插拔,動態加載
  • 客户端:支持Java、Go、Python等客户端註冊

下面是ShenYu可視化管理的功能的效果圖,大家可以看下:

安裝

在Docker環境下使用ShenYu需要同時運行ShenYu Admin和ShenYu Bootstrap兩個容器。
  • 首先下載shenyu-admin鏡像,shenyu-admin相當於是一個API網關的可視化管理功能;
docker pull apache/shenyu-admin:latest
  • 接下來運行shenyu-admin容器;
docker run -p 9095:9095 --name shenyu-admin \
-d apache/shenyu-admin:latest
  • 然後下載shenyu-bootstrap鏡像;
docker pull apache/shenyu-bootstrap
  • 接下來運行shenyu-bootstrap容器;
docker run -p 9195:9195 --name shenyu-bootstrap \
-e "shenyu.local.enabled=true" \
--env SHENYU_SYNC_WEBSOCKET_URLS=ws://192.168.3.101:9095/websocket \
-d apache/shenyu-bootstrap
  • 兩個容器都運行成功後,就可以訪問shenyu-admin的可視化管理頁面了,默認賬號密碼(admin:123456),訪問地址:http://192.168.3.101:9095

使用

接下來就以我的mall電商實戰項目為例,來講解下ShenYu的http代理和限流功能。

mall

這裏簡單介紹下mall項目,mall項目是一套基於SpringBoot3 + Vue 的電商系統(Github標星60K),後端支持多模塊和2024最新微服務架構 ,採用Docker和K8S部署。包括前台商城項目和後台管理系統,能支持完整的訂單流程!涵蓋商品、訂單、購物車、權限、優惠券、會員、支付等功能!

  • Boot項目:https://github.com/macrozheng/mall
  • Cloud項目:https://github.com/macrozheng/mall-swarm
  • 教程網站:https://www.macrozheng.com

項目演示:

準備

目前我們有兩個基於SpringBoot的API服務和一個靜態服務運行在服務器上,我們要把它們改成通過ShenYu網關統一訪問。

服務名稱 説明 原地址 網關訪問地址
mall-admin mall項目後台管理系統API服務 http://192.168.3.101:8080 http://192.168.3.101:9195/mall-admin/
mall-portal mall項目前台商城系統API服務 http://192.168.3.101:8085 http://192.168.3.101:9195/mall-portal/
mall-web mall後台管理系統前端項目 http://192.168.3.101/admin/ http://192.168.3.101:9195/mall-web/admin/

http代理

  • 實現http代理,我們需要用到Divide插件,在插件列表->Proxy->Divide功能中先添加選擇器,這裏以mall-admin為例,首先是基本配置;

  • 然後添加服務發現配置,類型選擇local,下游服務url為192.168.3.101:8080,如果你有多個服務添加的話可以實現負載均衡;

  • 然後需要進行規則的添加,由於我們在選擇器裏已經添加了/mall-admin/**前綴,這裏的匹配模式添加/**即可;

  • 由於網關會原封不動地把路徑轉發給下游服務,所以我們還需要配置下地址重寫,去除url裏面的/mall-admin部分;
# 通過網關訪問地址
http://192.168.3.101:9195/mall-admin/swagger-ui/
# 網關轉發地址(實際無法訪問)
http://192.168.3.101:8080/mall-admin/swagger-ui/
# 正確轉發地址
http://192.168.3.101:8080/swagger-ui/
  • 地址重寫我們需要用到Rewrite插件,我們需要先在基礎配置->插件管理中啓用該插件;

  • 然後在插件列表->HttpProcess->Rewrite中添加選擇器;

  • 然後再添加規則,將uri中的^/mall-portal/部分替換為/

  • 之後我們就可以通過網關正常訪問mall-admin服務的API文檔了,訪問地址:http://192.168.3.101:9195/mall-admin/swagger-ui/

  • 對於mall-portalmall-web的http代理也按照上面的配置即可;

  • 配置完成後可以正常訪問mall-portal服務的API文檔,訪問地址:http://192.168.3.101:9195/mall-portal/swagger-ui/

  • 然後是mall後台管理系統的前端項目,訪問地址:http://192.168.3.101:9195/mall-web/admin/

限流功能

有時候如果我們想要對某個接口進行限流,可以通過RateLimiter插件來實現。
  • 我們需要在基礎管理->插件管理中啓用該功能,RateLimiter的使用需要依賴Redis,請先運行好Redis服務;

  • 然後在插件列表->FaultTolerance->RateLimiter中添加好選擇器,這裏我們對mall-portal中的所有API都進行了限流;

  • 之後添加限流規則,這裏我們採用了Redis令牌桶算法進行限流;

  • 具體參數説明可以參考下圖;

  • 然後我們快速訪問mall-portal中的某個接口,會提示你已經被限流了,接口地址:http://192.168.3.101:9195/mall-portal/home/content

插件

Apache ShenYu的插件生態非常豐富,通過插件我們可以實現http請求處理、流量治理、熔斷限流、安全性、監控、緩存等功能,下表列舉了一些常用的插件,大家可以參考下。

插件 名稱 適用場景
Context Path 上下文路徑插件 不同的服務可以通過設置不同的上下文路徑來做服務的流量治理
ModifyResponse 響應修改插件 需要對接口的響應頭部參數、響應HTTP狀態碼或響應體進行修改的場景
ParamMapping 請求參數修改插件 添加/刪除/替換請求體中固定的參數
Rewrite 請求路徑重寫插件 通過重寫請求路徑, 可以使用與目標服務不同的uri。
流量治理插件 包括:Divide、Dubbo、gRPC、SpringCloud、Mqtt、Tcp、Websocket 處理不同協議的請求,支持流量治理,服務負載均衡,設置接口的超時時間。
熔斷限流 包括:Hystrix、RateLimiter、Resilience4j、Sentinel 服務不穩定,使用熔斷限流插件來熔斷保護服務
安全性插件 包括:Sign、JWT、OAuth2、WAF 需要在網關統一鑑權
Logging 請求日誌記錄插件 開發時調試或者線上排查問題等情況下,需要在網關側查看本次請求在轉發過程中的相關信息,如請求頭、請求參數或響應頭、響應體等。
Cache 緩存插件 數據不會頻繁更新,而且需要大量調用的場景。

總結

今天給大家分享了下ShenYu這套網關係統的使用,依賴於豐富的插件生態,它的功能非常強大,設計也很優秀,之前使用Gateway修改代碼才能實現的功能,在ShenYu上基本都可以實現可視化管理,感興趣的小夥伴可以嘗試下!

項目地址

https://github.com/apache/shenyu

user avatar youyudeshangpu_cny857 头像
点赞 1 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.