我们将 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 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) 我在 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 Boot 应用程序,它们都将部署在 Kubernetes 集群中。其中一个应用程序将充当网关,因此使用 Spring Cloud Gateway 作为依赖项。另外我想将服务发现与 Spring Cloud Kubernetes 集成,网关使用服务发现来自动生成相应的路由。但是,当我公开在本地 Minikube 集群中运行的网关应用程序并调用第二个应用程序/服务时,我收到 503 错误并显示以下消息:Unable to find instance for ...-service
目前我已经安装了以下内容:
我创建了一个包含两个子项目(网关和另一个服务)的 Gradle 项目。所有项目都将在本地构建/部署。默认服务帐户具有读取 Kubernetes API 的权限。部署这些服务后,我向外部公开网关服务。在网关服务中,我实现了一些端点,其中
一切似乎都有效,但是当我使用其他服务调用时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
由于 Spring Cloud 团队已经放弃了 Zuul 模块的开发,我们正在转向 Spring Cloud Gateway 或 Zuul2,但我相信 Zuul2 需要在架构上进行大量更改,并且需要在微服务中进行较大更改(如果我错了,请纠正我),可以任何人都在 zuul2 或 Spring-Cloud-Gateway 上给出了推荐,有没有人或您知道使用 Spring-Cloud-Gateway 的技术领域的任何大玩家?
我们正在使用微服务架构方法重建我们的软件平台。
其中大部分使用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) 我正在 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文档中,但我找不到它。
先感谢您!
是否可以使用 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) 如何设置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.
尝试在 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 ×8
spring ×6
java ×5
spring-cloud ×3
api-gateway ×1
jaeger ×1
netty ×1
springdoc ×1
springdoc-ui ×1