gpt4 book ai didi

springcloud gateway设置context-path的操作

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章springcloud gateway设置context-path的操作由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

今天说一下遇到的问题,关于 springcloud gateway 设置 context-path 的问题.

1.使用场景

由于没有申请二级域名,网关使用的地址是 xxx.com/gateway/ 用nginx转发的时候 /gateway/ 也被用来寻址.

gateway 没办法设置 context-path ,针对我这个场景有3个解决方案.

2.解决方案

2.1 增加本地路由(有一个网址指向自己,这里就是 /gateway)

spring:  cloud:    gateway:      routes:      # 网关本身没有contextPath,通过自己转发自己,达到能处理contextPath      - id: self        uri: http://localhost:${server.port}        predicates:        - Path=/${spring.application.name}/**        filters:        - StripPrefix=1        order: -11000

这种方式会丢失请求,暂时没考虑原因,就pass了.

2.2 增加过滤器,改写路径

ApiFilter.java 。

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;  @Configurationpublic 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去掉,缺点是每个请求进来都需要对路径处理一次.

能配置的尽量不写代码.

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

偷懒的做法,路由多的时候也挺难受.

现在路由不多,选择了第三种方式。看各自的场景选择吧.

springcloud 的gateway踩坑

添加了路由规则的配置以后,SpringCloud无法正常启动,启动的时候报错 。

1、配置文件中开启debug=true模式

错误信息显示缺少javax.validation.ValidatorException类; 。

2、在pom文件中添加hibernate-validator(以及所有相关依赖)

springcloud gateway设置context-path的操作

3、结果仍旧报错,此时错误信息:

springcloud gateway设置context-path的操作

springcloud gateway设置context-path的操作

不能为空,之前是配置在yml文件中,后来换成了properties,问题就解决了; 。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/Angry_Mills/article/details/108132203 。

最后此篇关于springcloud gateway设置context-path的操作的文章就讲到这里了,如果你想了解更多关于springcloud gateway设置context-path的操作的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com