标签: spring-cloud-gateway

在 Spring Cloud Gateway 过滤器中抛出自定义运行时异常

我们将 Spring Cloud Gateway 与 Spring Boot 2 和反应式 WebFlux 模块结合使用。

为其中一条路由添加了一个身份验证过滤器。现在,如果我们抛出一个带有特定状态代码的 RuntimeException,它实际上不会被接收。

早些时候,这种身份验证检查是 Spring 中 HandlerInterceptor 的一部分,但现在我们不能将 Web 模块与 WebFlux 一起使用(与 Spring 云网关冲突)。

例子:

@Override
public GatewayFilter apply(Object config) {
   ServerHttpRequest httpRequest = exchange.getRequest();
   if(!someUtil.validRequest(httpRequest) {
          throw new RuntimeException("Throw 401 Unauthorized with Custom error code and message");
   }
}
Run Code Online (Sandbox Code Playgroud)

目前,实际响应总是给出500 内部服务器错误。这是从哪里来的?我们可以在这里找到过滤器的错误吗?

spring spring-cloud-gateway

6
推荐指数
1
解决办法
9781
查看次数

增加或删除Spring-Boot的嵌入式Netty中的内容长度限制

我正在将一个Spring Cloud Gateway放在一些现有的微服务之前.它主要工作,但我有一个websocket(SockJS)连接(显然)传输大量的数据.

事实证明,Netty显然具有最大内容长度 - 当我在SockJS路线中跳过该限制时,我收到此错误:

2018-06-22 16:47:58.740 ERROR 11164 --- [ctor-http-nio-5] r.ipc.netty.channel.ContextHandler       : Error cannot be forwarded to user-facing Mono

io.netty.handler.codec.TooLongFrameException: content length exceeded 65536 bytes.
    at io.netty.handler.codec.MessageAggregator.handleOversizedMessage(MessageAggregator.java:399) [netty-codec-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.handler.codec.MessageAggregator.invokeHandleOversizedMessage(MessageAggregator.java:383) [netty-codec-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.handler.codec.MessageAggregator.decode(MessageAggregator.java:277) [netty-codec-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:88) [netty-codec-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-codec-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [netty-codec-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) [netty-transport-4.1.24.Final.jar:4.1.24.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) …
Run Code Online (Sandbox Code Playgroud)

netty spring-boot spring-cloud-gateway

6
推荐指数
2
解决办法
1001
查看次数

禁止 Spring Cloud Gateway 中未经身份验证的请求

我在 spring 云网关中实现了自定义预过滤器,它允许经过身份验证的请求通过下游过程。我想要的是,如果请求未经身份验证,则返回 401 UNAUTHORIZE 状态的响应并停止下游处理。能不能实现这个spring cloud gateway。

请帮忙。

我的过滤器代码如下

public class ValidUserFilter implements GatewayFilterFactory {

  @Override
  public GatewayFilter apply(Object config) {
    return (exchange, chain) -> {
      ServerHttpRequest request = exchange.getRequest();

      if (isValidRequest(request)) {
        // Allow processing
      } else {
      // set UNAUTHORIZED 401 response and stop the processing
      }

      return chain.filter(exchange);
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

和配置如下:

  - id: myroute
            uri: http://localhost:8080/bar
            predicates:
            - Path=/foo/**
            filters:
            - ValidUserFilter
Run Code Online (Sandbox Code Playgroud)

spring spring-boot spring-cloud spring-cloud-gateway

6
推荐指数
1
解决办法
3023
查看次数

如何设置 Spring Cloud Gateway 应用程序以便它可以使用 Spring Cloud Kubernetes 的服务发现?

我创建了两个 Spring Boot 应用程序,它们都将部署在 Kubernetes 集群中。其中一个应用程序将充当网关,因此使用 Spring Cloud Gateway 作为依赖项。另外我想将服务发现与 Spring Cloud Kubernetes 集成,网关使用服务发现来自动生成相应的路由。但是,当我公开在本地 Minikube 集群中运行的网关应用程序并调用第二个应用程序/服务时,我收到 503 错误并显示以下消息:Unable to find instance for ...-service

目前我已经安装了以下内容:

  • Minikube
  • 虚拟盒子
  • Docker 工具箱

我创建了一个包含两个子项目(网关和另一个服务)的 Gradle 项目。所有项目都将在本地构建/部署。默认服务帐户具有读取 Kubernetes API 的权限。部署这些服务后,我向外部公开网关服务。在网关服务中,我实现了一些端点,其中

  1. 通过 DiscoveryClient 提供集群中所有服务的列表。
  2. 应用层根据 DiscoveryClient 提供的 URI 调用其他服务。

一切似乎都有效,但是当我使用其他服务调用时URI/serviceId,出现 503 错误...

使用以下 Spring Cloud 版本: spring-cloud-starter-kubernetes 1.0.1.RELEASE spring-cloud-starter-gateway 2.1.1.RELEASE

我的演示应用程序可从https://github.com/nmaoez/spring-cloud-gateway-kubernetes 获得,README.md 提供了在本地 Minikube 集群中部署这两种服务的步骤。还显示了所有可用的端点。但有趣的部分是 application.yaml 和网关的应用程序类。

应用程序.yaml:

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
management:
  endpoints: …
Run Code Online (Sandbox Code Playgroud)

service-discovery spring-boot spring-cloud spring-cloud-gateway spring-cloud-kubernetes

6
推荐指数
1
解决办法
4185
查看次数

Spring Cloud Gateway 或 Zuul2,哪一个是 Zuul1 的正确替代品?

由于 Spring Cloud 团队已经放弃了 Zuul 模块的开发,我们正在转向 Spring Cloud Gateway 或 Zuul2,但我相信 Zuul2 需要在架构上进行大量更改,并且需要在微服务中进行较大更改(如果我错了,请纠正我),可以任何人都在 zuul2 或 Spring-Cloud-Gateway 上给出了推荐,有没有人或您知道使用 Spring-Cloud-Gateway 的技术领域的任何大玩家?

java spring spring-boot spring-cloud spring-cloud-gateway

6
推荐指数
3
解决办法
8646
查看次数

有人用 Spring Cloud Gateway 实现 Jaeger 吗?

我们正在使用微服务架构方法重建我们的软件平台。

其中大部分使用Spring Boot库,对于我们的入口点,我们使用Spring Cloud Gateway,它可以轻松集成以Jaeger在平台中进行跟踪。

我们使用以下 Maven 依赖项来做到这一点:

<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
    <version>2.0.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

它运行良好,我们可以在Jaeger UIWeb 控制台上看到跟踪。

现在的问题是如何将跟踪信息发送到平台中的下一个内部服务,以使每个服务相关联。

有任何想法吗?

我们尝试使用 a 将跟踪信息作为 HTML 标头注入,GlobalFilter但它正在使用传入的请求,我们需要将它们放在下游请求上......任何关于如何覆盖HTTPClient下面使用的线索。

<dependency>
    <groupId>io.opentracing.contrib</groupId>
    <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
    <version>2.0.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

java spring-boot jaeger spring-cloud-gateway

6
推荐指数
1
解决办法
393
查看次数

GlobalFilter 与 WebFilter

我正在 Spring Cloud Gateway 中迈出第一步。在学习过程中,我想更好地了解GlobalFilter. 具体来说,我打算每次为每条路线应用一些过滤器。

阅读文档(参考)有两种方法可以实现我的目标。第一个是使用GlobalFilter,第二个是拥有一个GatewayFilterin default-filters

这两种解决方案都工作得很好,仅限于 YAML 配置中定义的路由。如果我有任何 RouteLocator 或 RouterFunctions 我需要每次都声明过滤器

.filters(f -> f.globalFilter("something"))
Run Code Online (Sandbox Code Playgroud)

我发现实现目标的唯一方法是直接使用WebFilter参考

GatewayFilter所以我的问题是是否有人可以解释两个过滤器/GlobalFilter和之间的区别Webfilter

也许答案在Spring文档中,但我找不到它。

先感谢您!

java spring spring-webflux spring-cloud-gateway

6
推荐指数
1
解决办法
4574
查看次数

Spring Cloud Gateway 使用谓词检查头授权

是否可以使用 spring cloud gateway 配置的谓词部分来检查标头授权,我的目标是在一个或多个端点上进行一些基本身份验证

我正在使用 application.yml 进行路由配置

cloud:
gateway:
  routes:
    - id: serviceRoute
      uri: http://service:8000
      predicates:
        - Path=/service/
        **- Header= ??** 
      filters:
        - name: CircuitBreaker
          args:
            name: slow
            fallbackUri: forward:/fallback/service
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot spring-cloud-gateway

6
推荐指数
2
解决办法
1879
查看次数

如何在Spring Cloud Gateway中设置超时?

如何设置time-outa spring cloud gateway

routeLocatorBuilder.routes()
        .route("test-api", r -> r.path("/api/**")).uri(apiLb))
        .route("test-doc", r -> r.path("/doc/**")).uri(docLb));
Run Code Online (Sandbox Code Playgroud)

有没有办法只为一个人设置一个超时ROUTE- doc.

java spring spring-boot api-gateway spring-cloud-gateway

6
推荐指数
2
解决办法
2万
查看次数

SpringDoc OpenAPI 使用“springdoc-openapi-ui”与“springdoc-openapi-webmvc-core”

尝试在 Spring Cloud 网关级别为我的微服务实现 spring 文档。

遇到了这两个依赖项。想知道有什么区别

"springdoc-openapi-ui" vs "springdoc-openapi-webmvc-core"
Run Code Online (Sandbox Code Playgroud)

"springdoc-openapi-ui" vs "springdoc-openapi-ui"
Run Code Online (Sandbox Code Playgroud)

更喜欢哪个依赖项?

spring-boot spring-cloud-gateway springdoc springdoc-ui

6
推荐指数
1
解决办法
3795
查看次数