SpringCloud Gateway基礎入門與使用實踐總結

官網文檔:點擊查看官網文檔

Cloud全家桶中有個很重要的組件就是網關,在1.x版本中都是采用的Zuul網關。但在2.x版本中,zuul的升級一直跳票,SpringCloud最后自己研發了一個網關替代Zuul,那就是SpringCloud Gateway一句話:gateway是原zuul1.x版的替代

在這里插入圖片描述

【1】Gateway簡介

① SpringCloud Gateway 是什么

SpringCloud Gateway 是 Spring Cloud 的一個全新項目,基于 Spring 5.0+Spring Boot 2.0 和 Project Reactor 等技術開發的網關,它旨在為微服務架構提供一種簡單有效的統一的 API 路由管理方式。

SpringCloud Gateway 作為 Spring Cloud 生態系統中的網關,目標是替代 Zuul,在Spring Cloud 2.0以上版本中,沒有對新版本的Zuul 2.0以上最新高性能版本進行集成,仍然還是使用的Zuul 1.x非Reactor模式的老版本。而為了提升網關的性能,SpringCloud Gateway是基于WebFlux框架實現的,而WebFlux框架底層則使用了高性能的Reactor模式通信框架Netty。

Spring Cloud Gateway的目標提供統一的路由方式且基于 Filter 鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。

SpringCloud Gateway 使用的Webflux中的reactor-netty響應式編程組件,底層使用了Netty通訊框架。

② 為什么選擇SpringCloud Gateway

一方面因為Zuul1.0已經進入了維護階段,而且Gateway是SpringCloud團隊研發的,是親兒子產品,值得信賴。而且很多功能Zuul都沒有用起來也非常的簡單便捷。

Gateway是基于異步非阻塞模型上進行開發的,性能方面不需要擔心。雖然Netflix早就發布了最新的 Zuul 2.x,但 Spring Cloud 貌似沒有整合計劃。而且Netflix相關組件都宣布進入維護期,不知前景如何。

多方面綜合考慮Gateway是很理想的網關選擇。

Spring Cloud Gateway 具有如下特性:

  • 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 進行構建;
  • 動態路由:能夠匹配任何請求屬性;
  • 可以對路由指定 Predicate(斷言)和 Filter(過濾器);
  • 集成Hystrix的斷路器功能;
  • 集成 Spring Cloud 服務發現功能;
  • 易于編寫的 Predicate(斷言)和 Filter(過濾器);
  • 請求限流功能;
  • 支持路徑重寫。

③ Spring Cloud Gateway 與 Zuul的區別

在SpringCloud Finchley 正式版之前,Spring Cloud 推薦的網關是 Netflix 提供的Zuul:

1、Zuul 1.x,是一個基于阻塞 I/ O 的 API Gateway

2、Zuul 1.x 基于Servlet 2. 5使用阻塞架構它不支持任何長連接(如 WebSocket) 。Zuul 的設計模式和Nginx較像,每次 I/ O 操作都是從工作線程中選擇一個執行,請求線程被阻塞到工作線程完成,但是差別是Nginx 用C++ 實現,Zuul 用 Java 實現,而 JVM 本身會有第一次加載較慢的情況,使得Zuul 的性能相對較差。

3、Zuul 2.x理念更先進,想基于Netty非阻塞和支持長連接,但SpringCloud目前還沒有整合。 Zuul 2.x的性能較 Zuul 1.x 有較大提升。在性能方面,根據官方提供的基準測試, Spring Cloud Gateway 的 RPS(每秒請求數)是Zuul 的 1. 6 倍。

4、Spring Cloud Gateway 建立 在 Spring Framework 5、 Project Reactor 和 Spring Boot 2 之上, 使用非阻塞 API。

傳統的Web框架,比如說:struts2,springmvc等都是基于Servlet API與Servlet容器基礎之上運行的。
但是在Servlet3.1之后有了異步非阻塞的支持。而WebFlux是一個典型非阻塞異步的框架,它的核心是基于Reactor的相關API實現的。相對于傳統的web框架來說,它可以運行在諸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函數式編程(Spring5必須讓你使用java8)
Spring WebFlux 是 Spring 5.0 引入的新的響應式框架,區別于 Spring MVC,它不需要依賴Servlet API,它是完全異步非阻塞的,并且基于 Reactor 來實現響應式流規范。

5、Spring Cloud Gateway 還 支持 WebSocket, 并且與Spring緊密集成擁有更好的開發體驗。

④ Spring Cloud Gateway的核心概念

① Route(路由)

路由是構建網關的基本模塊,它由ID,目標URI,一系列的斷言和過濾器組成,如果斷言為true則匹配該路由。

② Predicate(斷言)

參考的是Java8的java.util.function.Predicate。

開發人員可以匹配HTTP請求中的所有內容(例如請求頭或請求參數),如果請求與斷言相匹配則進行路由。

③ Filter(過濾)

指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求被路由前或者之后對請求進行修改。

在這里插入圖片描述

簡單來說,web請求,通過一些匹配條件,定位到真正的服務節點。并在這個轉發過程的前后,進行一些精細化控制。

  • predicate就是我們的匹配條件;
  • 而filter,就可以理解為一個無所不能的攔截器。

有了這兩個元素,再加上目標uri,就可以實現一個具體的路由了

【2】Gateway工作流程

在這里插入圖片描述

客戶端向 Spring Cloud Gateway 發出請求。然后在 Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到 Gateway Web Handler。

Handler 再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然后返回。
過濾器之間用虛線分開是因為過濾器可能會在發送代理請求之前(“pre”)或之后(“post”)執行業務邏輯。

Filter在“pre”類型的過濾器可以做參數校驗、權限校驗、流量監控、日志輸出、協議轉換等,
在“post”類型的過濾器中可以做響應內容、響應頭的修改,日志的輸出,流量監控等有著非常重要的作用。在這里插入圖片描述

【3】實踐實例

① IP端口路由

pom文件引入依賴

<!--gateway-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

yml配置:

server:port: 9527
eureka:instance:hostname: cloud-gateway-serviceclient:service-url:register-with-eureka:  truefetch-registry:  truedefaultZone: http://eureka7001.com:7001/eureka  
spring:application:name: cloud-gatewaycloud:gateway:routes:- id: payment_routh #payment_route    #路由的ID,沒有固定規則但要求唯一,建議配合服務名uri: http://localhost:8001          #匹配后提供服務的路由地址predicates:- Path=/payment/get/**         # 斷言,路徑相匹配的進行路由- id: payment_routh2 #payment_route    #路由的ID,沒有固定規則但要求唯一,建議配合服務名uri: http://localhost:8001          #匹配后提供服務的路由地址predicates:- Path=/payment/lb/**         # 斷言,路徑相匹配的進行路由

主啟動類:

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class GateWay9527 {public static void main(String[] args) {SpringApplication.run(GateWay9527.class,args);}
}

這樣就可以實現訪問http://localhost:9527/payment/get/31 請求會路由到http://localhost:8001 ,也就是 http://localhost:8001/payment/get/31

這里可以看到uri直接使用了IP和端口,其實這是不太合適的。在微服務體系中,我們推薦使用服務實例名稱進行路由。

② 服務實例路由

修改yml文件如下所示:

server:port: 9527
spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true # 開啟從服務在注冊中心動態創建路由的功能routes: # 可以配置多個路由- id: payment_routh # 路由id,沒有固定規則但要求唯一
#          uri:  http://localhost:8001 # 匹配后提供服務的路由地址uri:  lb://cloud-payment-servicepredicates:- Path=/payment/get/** # 路徑相匹配的進行路由- After=2020-05-26T17:07:03.043+08:00[Asia/Shanghai]
#            - Cookie=username,wxh- id: payment_routh2 # 路由id,沒有
#          uri:  http://localhost:8001 # 匹配后提供服務的路由地址uri:  lb://cloud-payment-servicepredicates:- Path=/payment/create # 路徑相匹配的進行路由eureka:instance:hostname: cloud-gateway-serviceclient:service-url:register-with-eureka:  truefetch-registry:  truedefaultZone: http://eureka7001.com:7001/eureka

默認情況下Gateway會根據注冊中心注冊的服務列表,以注冊中心上微服務名為路徑創建動態路由進行轉發,從而實現動態路由的功能。

需要注意的是uri的協議為lb,表示啟用Gateway的負載均衡功能。lb://serviceName是spring cloud gateway在微服務中自動為我們創建的負載均衡uri

【4】編碼注冊路由

上面是通過配置方式注冊的路由,gateway同樣支持通過編碼方式注冊路由。

@Configuration
public class GateWayConfig {@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder  routes = routeLocatorBuilder.routes();/** 代表訪問http://localhost:9527/guonei* 跳轉到http://news.baidu.com/guonei* */routes.route("route1",r->r.path("/guonei").uri("http://news.baidu.com/guonei")).build();return routes.build();}
}

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

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

相關文章

抖音賬號永久封號后強制注銷釋放實名!一分鐘教程方法公開

目前方法是可行的&#xff0c;不知道能保持多久&#xff01; 下載舊版本抖音&#xff1a;下載抖音6.8版本或5.8版本的老版本應用。 使用封禁手機號登錄&#xff1a;使用已被永久封禁的手機號登錄舊版本的抖音應用。 賬號注銷操作&#xff1a; 在設置中找到賬號與安全的選項。…

從零開始發布你的第一個npm插件包并在多項目中使用

引言 在開源的世界里&#xff0c;每個人都有機會成為貢獻者&#xff0c;甚至是創新的引領者。您是否有過這樣的想法&#xff1a;開發一個解決特定問題的小工具&#xff0c;讓她成為其他開發者手中的利器&#xff1f;今天&#xff0c;我們就來一場實戰訓練&#xff0c;學習如何將…

【ubuntu】增加samba服務和文件夾

發現ai -server的ubuntu機器無法git clone 下來github的文件所以 使用samba 連接到linux的文件夾proj然后在我的windows上git clone 即可。安裝samba Creating config file /etc/samba/smb.conf with new version Setting up libcephfs2 (17.2.7-0ubuntu0.22.04.1) ... Setting…

漏洞挖掘 | 驗證碼繞過

還是老規矩&#xff0c;開局一個登錄框&#xff0c;中途漏洞全靠舔&#xff0c;先來研究一下這個登錄窗口 很好&#xff0c;發現有驗證碼登錄&#xff0c;先測試測試能不能并發 看來沒有&#xff0c;只成功發送了兩條&#xff0c;再看看驗證碼是不是4位 很好&#xff0c;是4位。…

UE5-AI

AI角色 角色控制器 AI角色必須要一個角色控制器 角色控制器最基本只需要執行行為樹&#xff0c;在EventOnPossess后runBehaviorTree 如果要的是一個角色&#xff0c;可以創建一個Character&#xff0c;在類默認設置中可以找到 Pawn->AIControllerClass&#xff0c;在這里…

Android 架構組件面試問答

1. 什么是 Android Architecture Components&#xff1f; 答&#xff1a; 組件是一組庫&#xff0c;可幫助您設計健壯、可測試且可維護的應用程序。它們提供了一種清晰且慣用的方式來使用 REST API。這些組件包括 Room、ViewModel、LiveData 等。 2. 什么是LiveData&#xff…

Java接口的變更過程

Java 接口相信所有學過 Java 的人一定都知道&#xff0c;而且 99% 的人一定都背過這個面試題&#xff1a;Java 接口和抽象類的區別是什么&#xff1f;答案都是什么接口方法不能有實現&#xff0c;都是抽象的&#xff0c;接口的方法都默認為 public 修飾等等之類的&#xff0c;這…

推箱子小游戲C++

推箱子是一款經典的益智游戲&#xff0c;玩家需要通過推動箱子來達到特定的目標。在C中實現這樣的小游戲需要考慮游戲邏輯、用戶輸入、圖形界面&#xff08;如果需要的話&#xff09;以及可能的關卡設計。 下面是一個簡單的推箱子游戲的實現框架&#xff1a; 定義游戲環境 創建…

DSP問題:CCS更改工程名導入報錯

1、問題現象 復制一個工程出來后&#xff0c;修改版本號&#xff0c;重新導入工程后報錯。 顯示項目描述無效。 2、問題原因 由于CCS無法通過工程描述中找到指定名字文件夾。使用記事本打開.project文件&#xff0c;里面的描述還是以前的文件夾名&#xff0c;所以導入時報…

Spring Boot 開發 -- 靜態資源配置詳解

一、引言 在開發Web應用程序時&#xff0c;靜態資源的管理和配置是一個重要的環節。Spring Boot框架為開發者提供了便捷的靜態資源配置方式&#xff0c;使得我們可以輕松地管理如HTML、CSS、JavaScript、圖片等靜態資源。本文將詳細介紹如何在Spring Boot項目中配置和管理靜態…

Innodb Buffer Pool緩存機制(三)Innodb Buffer Pool內部組成

一、控制塊緩存頁 Buffer Pool中默認的緩存頁大小和在磁盤上默認的頁大小是一樣的&#xff0c;都是16KB。為了更好的管理這些在Buffer Pool中的緩存頁&#xff0c;InnoDB為每一個緩存頁都創建了一些所謂的控制信息&#xff0c;這些控制信息包括該頁所屬的表空間編號、頁號、緩存…

Android基礎-AndroidManifest.xml詳解

在Android開發中&#xff0c;AndroidManifest.xml 文件是一個至關重要的組成部分&#xff0c;它位于應用的根目錄的 app/src/main/ 文件夾下。這個文件提供了Android系統和其他應用所需的所有關于應用的元數據信息。以下是對 AndroidManifest.xml 文件的詳細解析。 1. 文件結構…

[Vulfocus解題系列]spring 命令執行(CVE-2022-22947)

環境部署 使用docker部署環境 漏洞等級&#xff1a;高危 3 月 1 日&#xff0c;VMware 官方發布安全公告&#xff0c;聲明對 Spring Cloud Gateway 中的一處命令注入漏洞進行了修復&#xff0c;漏洞編號為CVE-2022-22947 Spring官方發布 漏洞描述 使用 Spring Cloud Gate…

javaweb—Vue

重點為&#xff1a;雙向數據綁定。 框架&#xff1a;是一個半成品軟件&#xff0c;是一套可重用的、通用的、軟件基礎代碼模型&#xff0c;基于框架進行開發&#xff0c;更加快捷&#xff0c;更加高效。 Vue快速入門 基礎框架&#xff1a; <!DOCTYPE html> <html lan…

【Python Cookbook】S01E20 fnmatch 模塊做字符串匹配

目錄 問題解決方案討論 問題 在不同的操作系統下&#xff0c;怎樣做字符串匹配&#xff1f; 解決方案 fnmatch() 模塊提供兩個函數&#xff0c;fnmatch() 以及 fnmatchcase() 可以用來執行做這樣的匹配。 from fnmatch import fnmatch, fnmatchcasematch_res fnmatch(foo.…

vue路由緩存

vue路由緩存 在業務場景中有時候需要頁面緩存不清空&#xff0c;那么就需要保留緩存(include為需要緩存&#xff0c;而exclude為不緩存&#xff0c;且優先級大于include) <KeepAlive> 是一個內置組件&#xff0c;它的功能是在多個組件間動態切換時緩存被移除的組件實例…

【java 為什么說 Synchronized 是非公平鎖?】

文章目錄 概要1. 非公平鎖的定義2. synchronized 作為非公平鎖的原因3. 非公平鎖的特點4. 如何實現公平鎖總結 概要 在Java中&#xff0c;synchronized 關鍵字用于實現同步&#xff0c;以確保在多線程環境下對共享資源的訪問是線程安全的。然而&#xff0c;synchronized 實現的…

03-3.1.2 棧的順序存儲的實現

&#x1f44b; Hi, I’m Beast Cheng&#x1f440; I’m interested in photography, hiking, landscape…&#x1f331; I’m currently learning python, javascript, kotlin…&#x1f4eb; How to reach me --> 458290771qq.com 喜歡《數據結構》部分筆記的小伙伴可以訂…

郵件地址搜索軟件

易郵件地址搜索大師  一、易郵件地址搜索大師特色 — 易郵件地址搜索大師是一款搜索郵件地址和手機號碼的軟件&#xff0c;可以按整站搜索&#xff0c;也可以按關鍵詞搜索。使用方法非常簡單和方便。 — “整站搜索”可以搜索有很多郵件地址的單一網站&#xff0c;主要用于…

Technart電動螺絲刀TN101控制器維修

Technart電動螺絲刀以其高效、穩定和精確的扭矩控制而聞名。然而&#xff0c;即使優質的產品&#xff0c;在長時間的使用下&#xff0c;也可能會出現TECHNART電動螺母扳手控制器故障。 常見故障及維修方法 1. 控制器不工作 癥狀&#xff1a;電動螺絲刀無法啟動&#xff0c;或啟…