gateway配置
【網(wǎng)關(guān)系統(tǒng)框架】腳手架項目
概述
【網(wǎng)關(guān)系統(tǒng)框架】項目是一個腳手架項目,來幫助開發(fā)同事快速搭建一個完整結(jié)構(gòu)的網(wǎng)關(guān)層項目,開發(fā)者在生成的項目基礎(chǔ)上進(jìn)行開發(fā)即可,以提高開發(fā)效率和代碼質(zhì)量。
【網(wǎng)關(guān)系統(tǒng)框架】項目功能主要體現(xiàn)在:
- 不必從零開始搭建初始項目,提高開發(fā)效率
- 路由功能
- token認(rèn)證 和 URL鑒權(quán)
- 限流功能
- 路徑重寫
- 跨域配置
- 通過 Feign 調(diào)用下游系統(tǒng)接口
路由功能
1、基于 Path 路徑的路由斷言
PathRoutePredicateFactory : 接收一個正則列表,根據(jù)路徑進(jìn)行匹配,如果滿足規(guī)則,則轉(zhuǎn)發(fā)到配置的 uri 地址
spring:
cloud:
gateway:
routes:
- id: path_route
# 路由跳轉(zhuǎn)地址
uri: https://www.csdn.net
predicates:
- Path=/blog/{segment}, /edu/**
如上:/blog/1、/blog/java、/edu/php 等請求都將被匹配。
URI 模板變量 (如上例中的 segment ) 將以 Map 鍵值的方式保存于 ServerWebExchange.getAttributes() 中,
可以在 GatewayFilterFactory 中使用。
Map<String, String> uriVariables = ServerWebExchangeUtils.getUriTemplateVariables(exchange);
String segment = uriVariables.get("segment");
2、基于 Query 請求參數(shù)的路由斷言
QueryRoutePredicateFactory : 接收兩個參數(shù),一個請求參數(shù)(必傳)和一個正則表達(dá)式(可選),判斷請求參數(shù)是否具有給定名稱且值與正則表達(dá)式匹配。
spring:
cloud:
gateway:
routes:
- id: query_route
uri: https://www.csdn.net
predicates:
# - Query=blog
- Query=blog, java.*
如上,- Query=blog 會匹配包含請求參數(shù) blog 的請求;
- Query=blog, java.* 會匹配請求中包含參數(shù) blog,并且值以 java 開頭(java / java1 / java123 等)的請求。
3、基于 Method 請求方式的路由斷言
MethodRoutePredicateFactory : 匹配一個或多個 HTTP 請求方式(GET / POST / PUT / DELETE / HEAD 等)
spring:
cloud:
gateway:
routes:
- id: method_route
uri: https://www.csdn.net
predicates:
- Method: GET,POST
所有 GET 請求和 POST 請求都將被路由
4、基于 Datetime 日期時間的路由斷言
此類型的斷言根據(jù)時間做判斷,主要有三個:
AfterRoutePredicateFactory: 接收一個日期參數(shù),判斷請求日期是否晚于指定日期BeforeRoutePredicateFactory: 接收一個日期參數(shù),判斷請求日期是否早于指定日期BetweenRoutePredicateFactory: 接收兩個日期參數(shù),判斷請求日期是否在指定時間段內(nèi)
spring:
cloud:
gateway:
routes:
- id: datetime_route
uri: https://www.csdn.net
predicates:
# - After=2021-08-30T23:59:59.789+08:00[Asia/Shanghai]
# - Before=2021-09-30T23:59:59.789+08:00[Asia/Shanghai]
- Between=2021-08-30T23:59:59.789+08:00[Asia/Shanghai], 2021-09-30T23:59:59.789+08:00[Asia/Shanghai]
5、基于 Weight 權(quán)重的路由斷言
WeightRoutePredicateFactory : 接收一個[組名, 權(quán)重],然后對同一個組內(nèi)的路由按照權(quán)重轉(zhuǎn)發(fā)
spring:
cloud:
gateway:
routes:
- id: weight_route1
uri: https://www.csdn.net
predicates:
- Path=/blog/**
# blogGroup 是組名, 90 是權(quán)重
- Weight=blogGroup, 90
- id: weight_route2
uri: http://www.rzrgm.cn
predicates:
- Path=/blog/**
# blogGroup 是組名, 10 是權(quán)重
- Weight=blogGroup, 10
此斷言可用于實現(xiàn)灰度發(fā)布等功能。
6、基于 Header 頭信息的路由斷言
HeaderRoutePredicateFactory :接收兩個參數(shù),header名稱和一個正則表達(dá)式。 判斷請求頭信息中是否具有給定名稱且值與正則表達(dá)式匹配。
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://www.csdn.net
predicates:
- Header=X-Request-Id, BLOG
匹配請求頭中,參數(shù)名稱為 X-Request-Id, 且值為 BLOG 的請求。
7、基于 Cookie 的路由斷言
CookieRoutePredicateFactory :接收兩個參數(shù),cookie 名稱和一個正則表達(dá)式。 判斷請求 cookie 是否具有給定名稱且值與正則表達(dá)式匹配。
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://www.csdn.net
predicates:
- Cookie=UserName, 123456
8、基于 Host 的路由斷言
HostRoutePredicateFactory :接收一個正則域名列表。判斷請求的 Host 是否滿足匹配規(guī)則。
spring:
cloud:
gateway:
routes:
- id: host_route
uri: https://www.csdn.net
predicates:
- Host=**.order.baidu.com, **.goods.baidu.com
9、基于 RemoteAddr 遠(yuǎn)程地址的路由斷言
RemoteAddrRoutePredicateFactory :接收一個IP地址(格式為 ip/子網(wǎng)掩碼)列表,判斷請求主機(jī)地址是否在地址段中。
spring:
cloud:
gateway:
routes:
- id: remoteAddr_route
uri: https://www.csdn.net
predicates:
- RemoteAddr=192.168.1.1/24, 192.168.0.100
如上,192.168.1.1 是IP地址,24是子網(wǎng)掩碼,如果沒有寫子網(wǎng)掩碼,默認(rèn)為32(255.255.255.255)
token認(rèn)證 和 URL鑒權(quán)
白名單
配置到白名單的 url,不需要進(jìn)行token認(rèn)證 和 URL鑒權(quán)。
示例如下:
jwt:
# 無需進(jìn)行 token 校驗的請求路徑列表,請求支持通配符和RESTFUL規(guī)范
# 示例:
# 1、/admin/sys/login (可以匹配 /admin/sys/login 和 /admin/sys/login )
# 2、/admin/sys/login/*(可以匹配 /admin/sys/login/ 、 /admin/sys/login/1 和 /admin/sys/login/1/)
# 3、/admin/sys/login/**(可以匹配 /admin/sys/login/ 、 /admin/sys/login/1 、 /admin/sys/login/1/ 和 /admin/sys/login/1/1 等)
# 4、/admin/sys/login/? (可以匹配 /admin/sys/login/1 和 /admin/sys/login/1/)
# 5、/admin/sys/login::POST(只能匹配 POST 請求方式)
# 6、/admin/sys/login/?::POST(匹配 POST 請求方式的 /admin/sys/login/1 和 /admin/sys/login/1/)
# 7、......
allowedList:
- /login
- /limit/**
- /demo/allow/*::POST # 如果需要限制請求類型,則在請求地址后邊添加 [::請求類型]
token 認(rèn)證
對不在白名單中的請求,會先進(jìn)行 token 校驗。token 在 header 中進(jìn)行傳輸,相關(guān)配置見 JwtTokenConfig。
jwt:
secret: xxxxxxxx #JWT加解密使用的密鑰
expiration: 1800 #JWT的超期限時間(60 * 30),單位s
token 續(xù)期
當(dāng) token 校驗通過后,會嘗試重新生成 token,如果重新生成 token 成功,則會將新 token 保存到 response header 中。
生成邏輯為:原 token 沒有過期,并且剩余有效時間小于總有效時間的一半時,會生成新 token。
設(shè)置全局 header 信息
網(wǎng)關(guān)層可以將下游微服務(wù)系統(tǒng)使用到的通用信息保存到 header 中,如下:
// 將下游系統(tǒng)需要使用的屬性,設(shè)置到 header 中
// 將下游系統(tǒng)需要使用的屬性,設(shè)置到 header 中
ServerHttpRequest newRequest = exchange.getRequest().mutate()
.header(JwtTokenConfig.HEADER_TOKEN_KEY, "")
.header(GlobalHeaderConstant.USER_NAME_KEY, userName)
.header(Request.USER_HEADER, UserJsonUtils.serialize(jwtTokenUtil.getUserFromToken(token)))
.build();
log.info("轉(zhuǎn)發(fā)后的header信息[{}]",newRequest.getHeaders());
如需設(shè)置多個信息,可以使用 exchange.getRequest().mutate().headers() 進(jìn)行保存設(shè)置
限流功能
# 限流示例
- id: limit_route
uri: http://localhost:8080
predicates:
- Path=/limit/test
filters:
- StripPrefix=1
- name: RequestRateLimiter
args:
# 使用SpEL按名稱引用bean
key-resolver: "#{@ipKeyResolver}"
# 令牌桶填充平均速率 (每秒最大訪問次數(shù))
redis-rate-limiter.replenishRate: 1
# 令牌桶上限
redis-rate-limiter.burstCapacity: 2
RequestRateLimiter 是限流過濾器,該過濾器需要配置三個參數(shù):
- burstCapacity,令牌桶總?cè)萘俊?/li>
- replenishRate,令牌桶每秒填充平均速率。
- key-resolver,用于限流的鍵的解析器的 Bean 對象的名字。它使用 SpEL 表達(dá)式根據(jù)#{@beanName}從 Spring 容器中獲取 Bean 對象。
穩(wěn)定速率是通過在 replenishRate 和 burstCapacity 中設(shè)置相同的值來實現(xiàn)的。可通過設(shè)置 burstCapacity 高于 replenishRate 來允許臨時突發(fā)流量。
路徑重寫
StripPrefix 去掉請求路徑的最前面 n個部分
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: http://localhost:8080
predicates:
- Path=/name/**
filters:
- StripPrefix=2
請求 /name/blue/red 會轉(zhuǎn)發(fā)到 /red
PrefixPath 在請求路徑前添加前綴
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: http://localhost:8080
filters:
- PrefixPath=/mypath
訪問/test 的請求被發(fā)送到 http://localhost:8080/mypath/test
RedirectTo 重定向,配置包含重定向的返回碼和地址
spring:
cloud:
gateway:
routes:
- id: redirectTo_route
uri: http://localhost:8080
filters:
- RedirectTo=302, http://localhost:8081
RewritePath 改寫路徑
spring:
cloud:
gateway:
routes:
- id: rewrite_filter
uri: http://localhost:8080
predicates:
- Path=/test/**
filters:
- RewritePath=/where(?<segment>/?.*), /test(?<segment>/?.*)
/where/... 改成 /test/...
SetPath 設(shè)置請求路徑,與RewritePath類似
spring:
cloud:
gateway:
routes:
- id: setpath_route
uri: http://localhost:8080
predicates:
- Path=/red/{segment}
filters:
- SetPath=/{segment}
如 /red/blue 的請求被轉(zhuǎn)發(fā)到 /blue
SetRequestHeader 設(shè)置請求頭信息
spring:
cloud:
gateway:
routes:
- id: setrequestheader_route
uri: http://localhost:8080
filters:
- SetRequestHeader=X-Request-Red, Blue
RemoveRequestHeader 去掉某個請求頭信息
spring:
cloud:
gateway:
routes:
- id: removerequestheader_route
uri: http://localhost:8080
filters:
- RemoveRequestHeader=X-Request-Foo
去掉請求頭信息 X-Request-Foo
RemoveRequestParameter 去掉某個請求參數(shù)信息
spring:
cloud:
gateway:
routes:
- id: removerequestparameter_route
uri: http://localhost:8080
filters:
- RemoveRequestParameter=userName
Default-filters 對所有請求添加過濾器
spring:
cloud:
gateway:
default-filters:
- PrefixPath=/test
跨域配置
# 跨域配置
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowedOriginPatterns: '*'
allowedMethods: '*'
allowedHeaders: '*'
allowCredentials: true

浙公網(wǎng)安備 33010602011771號