springcloud gateway設置context-path的操作
今天說一下遇到的問題,關(guān)于 springcloud gateway 設置 context-path 的問題。
1.使用場景
由于沒有申請二級域名,網(wǎng)關(guān)使用的地址是 xxx.com/gateway/ 用nginx轉(zhuǎn)發(fā)的時候 /gateway/ 也被用來尋址。
gateway 沒辦法設置 context-path ,針對我這個場景有3個解決方案。
2.解決方案
2.1 增加本地路由(有一個網(wǎng)址指向自己,這里就是 /gateway)
spring:
cloud:
gateway:
routes:
# 網(wǎng)關(guān)本身沒有contextPath,通過自己轉(zhuǎn)發(fā)自己,達到能處理contextPath
- id: self
uri: http://localhost:${server.port}
predicates:
- Path=/${spring.application.name}/**
filters:
- StripPrefix=1
order: -11000
這種方式會丟失請求,暫時沒考慮原因,就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 請求進來之后,轉(zhuǎn)發(fā)到routers 的時候會把 /gateway去掉,缺點是每個請求進來都需要對路徑處理一次。
能配置的盡量不寫代碼。
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
偷懶的做法,路由多的時候也挺難受。
現(xiàn)在路由不多,選擇了第三種方式??锤髯缘膱鼍斑x擇吧。
springcloud 的gateway踩坑
添加了路由規(guī)則的配置以后,SpringCloud無法正常啟動,啟動的時候報錯
1、配置文件中開啟debug=true模式
錯誤信息顯示缺少javax.validation.ValidatorException類;
2、在pom文件中添加hibernate-validator(以及所有相關(guān)依賴)

3、結(jié)果仍舊報錯,此時錯誤信息:
![]()
![]()
不能為空,之前是配置在yml文件中,后來換成了properties,問題就解決了;
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java BigDecimal解決double精度丟失的問題
我們在日常開發(fā)中, 有很多時候會遇到小數(shù)(double類型)精確計算,本文主要介紹了Java BigDecimal解決double精度丟失的問題,具有一定的參考價值,感興趣的可以了解一下2023-11-11
Spring中利用SchedulingConfigurer實現(xiàn)動態(tài)定時任務配置的示例
定時任務是一項至關(guān)重要的功能,它們使得我們能夠按照預定的時間執(zhí)行特定的任務,本文主要介紹了Spring中利用SchedulingConfigurer實現(xiàn)動態(tài)定時任務配置的示例,感興趣的可以了解一下2024-05-05
Java8并發(fā)新特性CompletableFuture
這篇文章主要介紹了Java8并發(fā)新特性CompletableFuture,CompletableFuture針對Future接口做了改進,相比Callable/Runnable接口它支持多任務進行鏈式調(diào)用、組合、多任務并發(fā)處理,下面文章更多相關(guān)內(nèi)容得介紹,需要的小伙伴可以參考一下2022-06-06
java 使用ImageIO.writer從BufferedImage生成jpeg圖像遇到問題總結(jié)及解決
這篇文章主要介紹了java 使用ImageIO.writer從BufferedImage生成jpeg圖像遇到問題總結(jié)及解決的相關(guān)資料,需要的朋友可以參考下2017-03-03
JAVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析
下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07
SpringBoot+Redis使用AOP防止重復提交的實現(xiàn)
本文主要介紹了SpringBoot+Redis使用AOP防止重復提交的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07

