springcloud gateway设置context-path的操作

 更新时间:2021年07月15日 14:42:18   作者:烤鸭的世界我们不懂  
这篇文章主要介绍了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

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

能配置的尽量不写代码。

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(以及所有相关依赖)

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 初识Java8中的Stream

    初识Java8中的Stream

    lambda表达式是stream的基础,接下来通过实例代码给大家详细介绍java8中的stream,感兴趣的朋友一起看看吧
    2017-08-08
  • Java中OkHttp 超时设置的实现

    Java中OkHttp 超时设置的实现

    超时设置是网络编程中不可忽视的一部分,本文就来介绍一下Java中OkHttp 超时设置的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Java数据结构之有效队列定义与用法示例

    Java数据结构之有效队列定义与用法示例

    这篇文章主要介绍了Java数据结构之有效队列定义与用法,结合实例形式分析了java有效队列的数据插入、删除、判断、计算等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • idea Gradle 控制台中文乱码的解决

    idea Gradle 控制台中文乱码的解决

    通过IDEA执行gradle的任务时,在终端的输出出现中文乱码,本文主要介绍了idea Gradle 控制台中文乱码的解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Simple Java Mail邮件发送实现过程解析

    Simple Java Mail邮件发送实现过程解析

    这篇文章主要介绍了Simple Java Mail邮件发送实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • spring boot 自定义参数过滤器,把传入的空字符转换成null方式

    spring boot 自定义参数过滤器,把传入的空字符转换成null方式

    这篇文章主要介绍了spring boot 自定义参数过滤器,把传入的空字符转换成null方式。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • MyBatis映射文件resultMap元素中使用多个association的方法

    MyBatis映射文件resultMap元素中使用多个association的方法

    这篇文章主要介绍了MyBatis映射文件resultMap元素中使用多个association的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Mybatis学习总结之mybatis使用建议

    Mybatis学习总结之mybatis使用建议

    这篇文章主要介绍了Mybatis学习总结之mybatis使用建议的相关资料,非常具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • 利用Java手写阻塞队列的示例代码

    利用Java手写阻塞队列的示例代码

    在我们平时编程的时候一个很重要的工具就是容器,在本篇文章当中主要给大家介绍阻塞队列的原理,并且在了解原理之后自己动手实现一个低配版的阻塞队列,感兴趣的可以尝试一下
    2022-08-08
  • 深入了解java 8的函数式编程

    深入了解java 8的函数式编程

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。下面我们来详细了解一下吧
    2019-06-06

最新评论