Spring Cloud Gateway 报错"Only one connection receive subscriber allowed."
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Gateway 报错"Only one connection receive subscriber allowed."相关的知识,希望对你有一定的参考价值。
参考技术A 调试工具postman 抛出的错误信息:"timestamp": "2019-07-16T05:04:21.442+0000",
"path": "/action/obtain/train-record-list",
"status": 500,
"error": "Internal Server Error",
"message": "Only one connection receive subscriber allowed."
因为引入了一个过滤器来判断是否存在header 中是否存在token,如果没有则拦截的 GloabFilter,设置的order 为 0,导致会报这个错误,而我将设置为2则正常。具体的原因,还没有深入了解。
Spring Cloud Gateway初体验
前段时间项目上打算使用gateway替换掉zuul1.0于是我简单的体验了一下。
gateway是什么:Spring Cloud Gateway
是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。这里需要注意一下gateway使用的netty+webflux实现,不要加入web依赖,需要加入webflux依赖。
gateway与zuul的区别的简单比较:gateway使用的是异步请求,zuul是同步请求,gateway的数据封装在ServerWebExchange里,zuul封装在RequestContext里。
过滤器:gateway有两种filter,一种是GlobalFilter一种是GatewayFilter,全局过滤器默认对所有路由有效,gatewayFilter需要进行指定。
spring: cloud: gateway: # 配置所有路由的默认过滤器 这里配置的是gatewayFilter default-filters: routes: - id: server-test # 服务的id uri: lb://server-test #服务的application名称 order: 0 #路由级别 predicates: - Path=/bus/** #前缀 filters: - StripPrefix=1 #去前缀 去几层
关于重写数据:由于gateway是异步的最好不要对响应的body进行操作,如果需要操作的话需要重写writeWith方法,简单事例如下:
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(response) { @Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { if (body instanceof Flux) { Flux<? extends DataBuffer> fluxBody = (Flux<? extends DataBuffer>) body; return super.writeWith(fluxBody.map(dataBuffer -> { //在这边需要对dataBuffer拿到字节数组进行操作 return response.bufferFactory().wrap(nodeObject.getBytes()); })); } return super.writeWith(body); } }; return chain.filter(exchange.mutate().response(decoratedResponse).build();
}
只是简单的分享,后续有时间会尽量分享更多的细节...
以上是关于Spring Cloud Gateway 报错"Only one connection receive subscriber allowed."的主要内容,如果未能解决你的问题,请参考以下文章
同时引入依赖:spring-cloud-starter-gateway 和 spring-boot-starter-web,报错
Spring Cloud Gateway 报错"Only one connection receive subscriber allowed."
聊聊spring cloud gateway的NettyConfiguration