spring?cloud?gateway中配置uri三種方式
spring cloud gateway中配置uri
gateway中配置uri配置有三種方式:
- websocket方式:uri: ws://localhost:9000
- http方式: uri: http://localhost:8130/
- lb注冊(cè)中心配置方式(注冊(cè)的服務(wù)名稱): uri: lb://monitor-ms
gateway的lb方式識(shí)別的服務(wù)名稱命名規(guī)則:
"[a-zA-Z]([a-zA-Z]|\\d|\\+|\\.|-)*:.*"
SpringCloud GateWay 使用說(shuō)明
前言:
gateway 組件是SpringCloud 組件中的網(wǎng)關(guān)組件,主要是解決路由轉(zhuǎn)發(fā)的問(wèn)題;跟nginx有點(diǎn)類似,區(qū)別是nginx多用在前端上,gateway用在后端上。當(dāng)然gateway的功能不止路由轉(zhuǎn)發(fā),還可以用來(lái):
1.針對(duì)所有請(qǐng)求做統(tǒng)一鑒權(quán)、限流、熔斷、日志;
2.協(xié)議轉(zhuǎn)化,針對(duì)后端多種協(xié)議可以在網(wǎng)關(guān)層統(tǒng)一處理后以http對(duì)外服務(wù);
3.統(tǒng)一錯(cuò)誤代碼處理(跟springboot統(tǒng)一錯(cuò)誤處理配置一樣);
一、配置說(shuō)明
gateway的配置文件是其使用的核心。
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table-service/** filters: - StripPrefix=1
字段說(shuō)明:
id:自定義路由的ID;
uri:目標(biāo)服務(wù)器地址,同時(shí)支持 URI(http://ip:port/route) 和 lb(lb://應(yīng)用注冊(cè)服務(wù)名) 方式,推薦使用lb方式;
predicates:路由條件,根據(jù)匹配結(jié)果決定是否執(zhí)行該請(qǐng)求路由;
filters:過(guò)濾規(guī)則,包含 pre 和 post 過(guò)濾,其中 StripPrefix=1 表示根據(jù)請(qǐng)求時(shí)去掉URL路徑的第一個(gè)前綴。
二、路由條件配置說(shuō)明
即predicates 配置項(xiàng),支持多種規(guī)則:
1. 指定時(shí)間規(guī)則匹配路由
時(shí)間的書(shū)寫(xiě)必須是ZoneDateTime格式。
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - After=2022-07-20T10:25:00.000+08:00[Asia/Shanghai]
有三種規(guī)則:
After:指定時(shí)間之后轉(zhuǎn)發(fā)到該服務(wù);
Before:指定時(shí)間之前轉(zhuǎn)發(fā)到該服務(wù);
Between:兩個(gè)時(shí)間之前轉(zhuǎn)發(fā)到該服務(wù),兩個(gè)時(shí)間之間用逗號(hào)隔開(kāi);
2. Cookie 匹配路由
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Cookie=cho,123
上述配置表示請(qǐng)求時(shí)Cookie 必須攜帶 cho=123 鍵值對(duì)才能轉(zhuǎn)發(fā)到該服務(wù);逗號(hào)前表示鍵值,逗號(hào)后表示該鍵對(duì)應(yīng)的值,該值是個(gè)正則表達(dá)式。
3. Header 匹配路由
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Header=cho,123
上述配置表示請(qǐng)求時(shí)header 必須攜帶 cho=123 鍵值對(duì)才能轉(zhuǎn)發(fā)到該服務(wù);逗號(hào)前表示鍵值,逗號(hào)后表示該鍵對(duì)應(yīng)的值,該值是個(gè)正則表達(dá)式。
4. Host 匹配路由
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Host=127.0.0.1,localhost
上述配置表示請(qǐng)求時(shí)Host 必須攜帶 127.0.0.1,localhost 中的任何一個(gè)值才能轉(zhuǎn)發(fā)到該服務(wù);匹配多值時(shí)用逗號(hào)隔開(kāi),并且支持星號(hào)(*)做域名通配符。
5. 請(qǐng)求方法匹配路由
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Method=POST,GET
上述配置表示請(qǐng)求時(shí)只有 GET 和 POST 方法才能轉(zhuǎn)發(fā)到該服務(wù);匹配多值時(shí)用逗號(hào)隔開(kāi)。
6. 請(qǐng)求路徑匹配路由
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table/**
該方式是使用最多的。/* 表示單層路徑匹配,/** 表示多層路徑匹配。
三、過(guò)濾配置說(shuō)明
即filters 配置項(xiàng),支持多種配置:
1. AddRequestParameters GatewayFilter Factory
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table/** filters: - AddRequestParameter=foo,bar
上述配置會(huì)對(duì)走該路由的所有請(qǐng)求都加上 foo=bar 參數(shù)。
2. AddResponseHeader GatewayFilter Factory
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table/** filters: - AddResponseHeader=foo,bar
上述配置會(huì)對(duì)走該路由的所有請(qǐng)求的返回都加上響應(yīng)頭foo=bar 。
3. RequestRateLimiter GatewayFilter Factory
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20
這個(gè)過(guò)濾器是基于令牌桶實(shí)現(xiàn)的,replenishRate 表示令牌填充速度,burstCapacity 表示令牌桶容量;限流用的,需要集成redis才行。限流的使用略復(fù)雜,建議單獨(dú)研究。
4. Retry GatewayFilter Factory
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table/** filters: - name: Retry args: retries: 3 status: 503
總共涉及4個(gè)參數(shù):
retries:重試次數(shù);
status:http 請(qǐng)求返回的狀態(tài)碼,上述配置表示服務(wù)端返回503時(shí)發(fā)起重試;
methods:指定請(qǐng)求類型才會(huì)發(fā)起重試;
series:配置錯(cuò)誤碼段,表示符合狀態(tài)碼才發(fā)起重試,默認(rèn)SERVER_ERROR(5),即 5xx 段狀態(tài)碼才會(huì)發(fā)起重試;如果 series 配置了錯(cuò)誤碼,但 status 缺省,則仍然匹配 series 進(jìn)行重試。
四、自定義 Filter
自定義 filter 有兩個(gè),GlobalFilter 和 GatewayFilter ;GlobalFilter 對(duì)全局生效,GatewayFilter 只對(duì)配置了的才生效。
1. 自定義GlobalFilter
可以存在多個(gè)GlobalFilter,執(zhí)行順序由 getOrder() 控制,值越小執(zhí)行越靠前。
@Slf4j @Service public class GatewayGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); log.info("pre action..."); //請(qǐng)求到路由前的操作... return chain.filter(exchange).then(Mono.fromRunnable(() -> { log.info("post action..."); //請(qǐng)求返回后的操作... })); } @Override public int getOrder() { return 0; } }
2. 自定義 gatewayFilter
@Slf4j @Service public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.CustomConfig> { public CustomGatewayFilterFactory() { super(CustomConfig.class); } @Override public GatewayFilter apply(CustomConfig config) { return ((exchange, chain) -> { String name = config.getName(); log.info("config name:{}", name); log.info("pre action..."); if (name.equals("123")) { // 使用config值的樣例 return exchange.getResponse().setComplete(); // 不返回任何信息 } return chain.filter(exchange).then(Mono.fromRunnable(() -> { log.info("post action..."); })); }); } public static class CustomConfig { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } }
上述對(duì)應(yīng)的配置文件:
spring: cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table/** filters: - name: Custom args: name: 123
幾點(diǎn)注意:
1. 類名一般遵循以 GatewayFilterFactory 結(jié)尾,所以默認(rèn)情況下過(guò)濾器 name 會(huì)采用該自定義類名的前綴,這里配置 name=Custom;或者類名完全不遵循上述規(guī)則,,配置時(shí)name為類全名;
2. 在 apply 方法中,同時(shí)包含 Pre 和 Post 過(guò)濾;在 then 方法中是請(qǐng)求執(zhí)行結(jié)束之后的處置;
3. CustomConfig 是一個(gè)配置類,其屬性值可在配置文件 args 下一層進(jìn)行配置;
3. 補(bǔ)充
以下是請(qǐng)求不滿足條件時(shí)的json 返回。
// msg 是個(gè) json 字符串 DataBuffer bodyDataBuffer =response.bufferFactory().wrap(msg.getBytes(StandardCharsets.UTF_8)); return response.writeWith(Mono.just(bodyDataBuffer));
五、整個(gè) demo
1. 本地起一個(gè)eureka的注冊(cè)中心(也可以用nacos等其他的注冊(cè)中心)
端口:9099
本片代碼不是該博客核心,忽略。
2. 起一個(gè)gateway的client注冊(cè)到eureka
依賴:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>eureka-gateway</artifactId> <version>1.0.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> </parent> <dependencies> <!--在springboot的pom文件中,該依賴已經(jīng)集成了springMVC等web啟動(dòng)器,不需要再添加spring-boot-starter-web 依賴了--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--eureka-client依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2020.0.2</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
啟動(dòng)類:
@EnableEurekaClient @SpringBootApplication public class GatewayServer { public static void main(String[] args) { SpringApplication.run(GatewayServer.class, args); } }
配置文件:
server: port: 8999 spring: application: name: gateway-service cloud: gateway: routes: - id: table-service uri: lb://table-service predicates: - Path=/table-service/** filters: - StripPrefix=1 - id: table-service uri: lb:ws://table-service #這是websocket轉(zhuǎn)發(fā)的配置 predicates: - Path=/table-socket/** filters: - StripPrefix=1 eureka: instance: lease-expiration-duration-in-seconds: 10 lease-renewal-interval-in-seconds: 5 prefer-ip-address: true instance-id: ${spring.cloud.client.ip-address}:${server.port} client: service-url: defaultZone: http://user:passwd@localhost:9099/eureka/
到此這篇關(guān)于spring cloud gateway中配置uri三種方式的文章就介紹到這了,更多相關(guān)spring cloud gateway配置uri內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Runtime.getRuntime().exec 路徑包含空格的解決
這篇文章主要介紹了Runtime.getRuntime().exec 路徑包含空格的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java基于servlet編寫(xiě)上傳下載功能 類似文件服務(wù)器
這篇文章主要為大家詳細(xì)介紹了java基于servlet編寫(xiě)上傳下載功能,類似文件服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Java 獲取Web項(xiàng)目相對(duì)webapp地址的實(shí)例
下面小編就為大家?guī)?lái)一篇Java 獲取Web項(xiàng)目相對(duì)webapp地址的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11迅速掌握J(rèn)ava容器中常用的ArrayList類與Vector類用法
這篇文章主要介紹了Java容器中常用的ArrayList類與Vector類用法,文中只對(duì)其最基本的功能給出了示例代碼,需要的朋友可以參考下2015-11-11Java線程池ThreadPoolExecutor原理及使用實(shí)例
這篇文章主要介紹了Java線程池ThreadPoolExecutor原理及使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05