springcloud gateway設(shè)置context-path的操作
今天說一下遇到的問題,關(guān)于 springcloud gateway 設(shè)置 context-path 的問題。
1.使用場景
由于沒有申請二級域名,網(wǎng)關(guān)使用的地址是 xxx.com/gateway/ 用nginx轉(zhuǎn)發(fā)的時(shí)候 /gateway/ 也被用來尋址。
gateway 沒辦法設(shè)置 context-path ,針對我這個(gè)場景有3個(gè)解決方案。
2.解決方案
2.1 增加本地路由(有一個(gè)網(wǎng)址指向自己,這里就是 /gateway)
spring: cloud: gateway: routes: # 網(wǎng)關(guān)本身沒有contextPath,通過自己轉(zhuǎn)發(fā)自己,達(dá)到能處理contextPath - id: self uri: http://localhost:${server.port} predicates: - Path=/${spring.application.name}/** filters: - StripPrefix=1 order: -11000
這種方式會丟失請求,暫時(shí)沒考慮原因,就pass了。
2.2 增加過濾器,改寫路徑
ApiFilter.java
package com.yiche.ballast.filter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpStatus; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.WebFilter; import reactor.core.publisher.Mono; @Configuration public class ApiFilter { @Value("${spring.cloud.gateway.api-prefix:/gateway}") private String prefix; @Bean @Order(-1) public WebFilter apiPrefixFilter() { return (exchange, chain) -> { ServerHttpRequest request = exchange.getRequest(); String path = request.getURI().getRawPath(); if (!path.contains(prefix)) { ServerHttpResponse response = exchange.getResponse(); response.setStatusCode(HttpStatus.BAD_GATEWAY); DataBuffer buffer = response .bufferFactory() .wrap(HttpStatus.BAD_GATEWAY.getReasonPhrase().getBytes()); return response.writeWith(Mono.just(buffer)); } String newPath = path.replaceFirst(prefix, ""); ServerHttpRequest newRequest = request.mutate().path(newPath).build(); return chain.filter(exchange.mutate().request(newRequest).build()); }; } }
這樣/gateway 請求進(jìn)來之后,轉(zhuǎn)發(fā)到routers 的時(shí)候會把 /gateway去掉,缺點(diǎn)是每個(gè)請求進(jìn)來都需要對路徑處理一次。
能配置的盡量不寫代碼。
2.3 修改配置,在所有的router路徑前加前綴(這里就是都加上 /gateway)
spring: cloud: gateway: routes: - id: api-route filters: - StripPrefix=1 predicates: - name: Path args[pattern]: /gateway/api/** uri: lb://xxx-api
偷懶的做法,路由多的時(shí)候也挺難受。
現(xiàn)在路由不多,選擇了第三種方式??锤髯缘膱鼍斑x擇吧。
springcloud 的gateway踩坑
添加了路由規(guī)則的配置以后,SpringCloud無法正常啟動(dòng),啟動(dòng)的時(shí)候報(bào)錯(cuò)
1、配置文件中開啟debug=true模式
錯(cuò)誤信息顯示缺少javax.validation.ValidatorException類;
2、在pom文件中添加hibernate-validator(以及所有相關(guān)依賴)
3、結(jié)果仍舊報(bào)錯(cuò),此時(shí)錯(cuò)誤信息:
不能為空,之前是配置在yml文件中,后來換成了properties,問題就解決了;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中OkHttp 超時(shí)設(shè)置的實(shí)現(xiàn)
超時(shí)設(shè)置是網(wǎng)絡(luò)編程中不可忽視的一部分,本文就來介紹一下Java中OkHttp 超時(shí)設(shè)置的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之有效隊(duì)列定義與用法,結(jié)合實(shí)例形式分析了java有效隊(duì)列的數(shù)據(jù)插入、刪除、判斷、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析
這篇文章主要介紹了Simple Java Mail郵件發(fā)送實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11spring boot 自定義參數(shù)過濾器,把傳入的空字符轉(zhuǎn)換成null方式
這篇文章主要介紹了spring boot 自定義參數(shù)過濾器,把傳入的空字符轉(zhuǎn)換成null方式。具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08MyBatis映射文件resultMap元素中使用多個(gè)association的方法
這篇文章主要介紹了MyBatis映射文件resultMap元素中使用多個(gè)association的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議
這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05