Python 官方文档:入门教程 => 点击学习
今天说一下遇到的问题,关于 SpringCloud gateway 设置 context-path 的问题。 1.使用场景 由于没有申请二级域名,网关使用的地址是 xxx.com/g
今天说一下遇到的问题,关于 SpringCloud gateway 设置 context-path 的问题。
由于没有申请二级域名,网关使用的地址是 xxx.com/gateway/ 用Nginx转发的时候 /gateway/ 也被用来寻址。
gateway 没办法设置 context-path ,针对我这个场景有3个解决方案。
spring:
cloud:
gateway:
routes:
# 网关本身没有contextPath,通过自己转发自己,达到能处理contextPath
- id: self
uri: Http://localhost:${server.port}
predicates:
- Path=/${spring.application.name}/**
filters:
- StripPrefix=1
order: -11000
这种方式会丢失请求,暂时没考虑原因,就pass了。
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 请求进来之后,转发到routers 的时候会把 /gateway去掉,缺点是每个请求进来都需要对路径处理一次。
能配置的尽量不写代码。
spring:
cloud:
gateway:
routes:
- id: api-route
filters:
- StripPrefix=1
predicates:
- name: Path
args[pattern]: /gateway/api/**
uri: lb://xxx-api
偷懒的做法,路由多的时候也挺难受。
现在路由不多,选择了第三种方式。看各自的场景选择吧。
添加了路由规则的配置以后,SpringCloud无法正常启动,启动的时候报错
错误信息显示缺少javax.validation.ValidatorException类;
不能为空,之前是配置在yml文件中,后来换成了properties,问题就解决了;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
--结束END--
本文标题: springcloud gateway设置context-path的操作
本文链接: https://lsjlt.com/news/130563.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0