免費政府網站html模板百度首頁快速排名系統(tǒng)
1、網關簡介
網關作為流量的入口,常用的功能包括路由轉發(fā),權限校驗,限流等。
2、Gateway簡介
Spring Cloud Gateway 是Spring Cloud官方推出的第二代網關框架,定位于取代 Netflix Zuul。相比 Zuul 來說,Spring Cloud Gateway 提供更優(yōu)秀的性能,更強大的有功能。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 實現的響應式的 API 網關。
它不能在傳統(tǒng)的 servlet 容器中工作,也不能構建成 war 包。
Spring Cloud Gateway 旨在為微服務架構提供一種簡單且有效的 API 路由的管理方式,并基于 Filter 的方式提供網關的基本功能,例如說安全認證、監(jiān)控、限流等等。
網文檔:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter
3、核心概念
-
路由(route)
路由是網關中最基礎的部分,路由信息包括一個ID、一個目的URI、一組謂 詞工廠、一組Filter組成。如果謂詞為真,則說明請求的URL和配置的路由匹配。
-
謂詞(predicates)
即java.util.function.Predicate , Spring Cloud Gateway使用Predicate實現路由的匹配條件。
-
過濾器(Filter)
SpringCloud Gateway中 的filter分為Gateway FilIer和Global Filter。Filter可以對請求和響應進行處理。
【路由就是轉發(fā)規(guī)則,謂詞就是是否走這個路徑的條件,過濾器可以為路由添加業(yè)務邏輯,修改請求以及響應】
示例演示
spring:cloud:gateway:routes:#路由ID全局唯一- id: msb-order-route#目標微服務的請求地址和端口uri: http://localhost:8001predicates:- Path=/order/*filters:- AddRequestHeader=X-Request-Foo, Bar
這里就演示了請求 /order/*的路徑就會路由到上邊這個url上去
2、 工作原理
Spring Cloud Gateway 的工作原理跟 Zuul 的差不多,最大的區(qū)別就是 Gateway 的 Filter 只有 pre 和 post 兩種。
客戶端向 Spring Cloud Gateway 發(fā)出請求,如果請求與網關程序定義的路由匹配,則該請求就會被發(fā)送到網關 Web 處理程序,此時處理程序運行特定的請求過濾器鏈。
過濾器之間用虛線分開的原因是過濾器可能會在發(fā)送代理請求的前后執(zhí)行邏輯。所有 pre 過濾器邏輯先執(zhí)行,然后執(zhí)行代理請求;代理請求完成后,執(zhí)行 post 過濾器邏輯。
4、快速入門
3.1環(huán)境搭建
引入依賴
<!-- gateway網關--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies><!-- nacos注冊中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
父工程的pom
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>
spring:application:name: msb-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:#默認值是false,如果設為true開啟通過微服務創(chuàng)建路由的功能,即可以通過微服務名訪問服務#http://localhost:13001/msb-order/order/create#不建議打開,因為這樣暴露了服務名稱enabled: true#是否開啟網關enabled: true
這里注意不要引入springmvc工程否則會報錯如下:
我們工程中如下:
msb-gateway工程的pom
<dependencies><!-- gateway網關--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>test</scope> <!-- 特殊處理,不引入父工程依賴 --></dependency>
</dependencies>
3.2 測試
我們剛才說了我們不建議開啟通過微服務創(chuàng)建路由的功能,這樣就把微服務名稱暴露了,如果設置位默認值在請求一下,是否能成功呢? 我們測試一下:
是失敗的,剛才能成功主要是
http://localhost:13001/msb-order/order/create 可以進行轉化:
http://localhost:13001/msb-order/order/create可以替換為http://localhost:8001/order/create
然而此時的請求是轉化不了的
http://localhost:13001/order/create
這是我們就需要我們的gateway 中的 route& predicates 建立映射
二、路由謂詞工廠(Route Predicate Factories)配置
1、路由配置的兩種形式
1.1 路由到指定URL
-
通配
spring:cloud:gateway:routes:- id: {唯一標識}uri: http://localhost:8001
表示訪問
GATEWAY_URL/**
會轉發(fā)到http://localhost:8001/**
注:上面路由的配置必須和下面謂詞(Predicate)配合使用才行
-
精確匹配
spring:cloud:gateway:routes:- id: {唯一標識}uri: http://localhost:8001/predicates:- Path=/order/*
表示訪問
GATEWAY_URL/order/*
會轉發(fā)到http://localhost:8001/order/*
1.2 路由到服務發(fā)現組件上的微服務
-
通配
spring:cloud:gateway:routes:- id: {唯一標識}uri: lb://msb-order
表示訪問
GATEWAY_URL/**
會轉發(fā)到msb-order
微服務的/**
注:上面路由的配置必須和下面謂詞(Predicate)配合使用才行
-
精確匹配
spring:cloud:gateway:routes:- id: {唯一標識}uri: lb://msb-order/predicates:- Path=/order/*
表示訪問
GATEWAY_URL/order/
會轉發(fā)到msb-order
微服務的/order/
2、謂詞工廠分類
官網:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
網關啟動日志:
3、謂詞介紹
3.1 After路由斷言工廠
規(guī)則:
該斷言工廠的參數是一個 UTC 格式的時間。其會將請求訪問到 Gateway 的時間與該參數時間相比,若請求時間在參數時間之后,則匹配成功,斷言為 true。
配置:
spring:cloud:gateway:routes:- id: after_routeuri: lb://msb-userpredicates:# 當且僅當請求時的時間After配置的時間時,才會轉發(fā)到用戶微服務# 目前配置不會進該路由配置,所以返回404# 將時間改成 < now的時間,則訪問localhost:8040/** -> msb-user/**# eg. 訪問http://localhost:8040/users/1 -> msb-user/users/1- After=2030-01-20T17:42:47.789-07:00[America/Denver]
技巧:時間可使用 System.out.println(ZonedDateTime.now());
打印,然后即可看到時區(qū)。例如:2019-08-10T16:50:42.579+08:00[Asia/Shanghai]
時間格式的相關邏輯:
- 默認時間格式:org.springframework.format.support.DefaultFormattingConversionService#addDefaultFormatters
- 時間格式注冊:org.springframework.format.datetime.standard.DateTimeFormatterRegistrar#registerFormatters
3.2 Before路由斷言工廠
規(guī)則:
該斷言工廠的參數是一個 UTC 格式的時間。其會將請求訪問到 Gateway 的時間與該參數時間相比,若請求時間在參數時間之前,則匹配成功,斷言為 true。
配置:
spring:cloud:gateway:routes:- id: before_routeuri: lb://msb-userpredicates:# 當且僅當請求時的時間Before配置的時間時,才會轉發(fā)到用戶微服務# 目前配置不會進該路由配置,所以返回404# 將時間改成 > now的時間,則訪問localhost:8040/** -> msb-user/**# eg. 訪問http://localhost:8040/users/1 -> msb-user/users/1- Before=2018-01-20T17:42:47.789-