gateway网关 feign请求 报错Load balancer does not contain an instance for the service
最近使用springcloudgateway网关统一做权限校验,校验过程中需要使用feign调用内部服务接口获取用户权限,权限过滤器如下@Component@Slf4jpublic class AuthFilter implements GlobalFilter {@Resourceprivate FormApi formApi;@Overridepublic Mono<Void> f
·
最近使用springcloudgateway网关统一做权限校验,校验过程中需要使用feign调用内部服务接口获取用户权限,
springboot 版本:2.3.10
springcloud 版本:Hoxton.SR11
nacos 版本:2021.1
使用spring-cloud-starter-loadbalancer做负载
权限过滤器如下
@Component
@Slf4j
public class AuthFilter implements GlobalFilter {
@Resource
private FormApi formApi;
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
URI uri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
RequestModel requestModel = HttpRequestFilter.getRequestContext(request);
requestModel.setUri(uri);
log.info(requestModel.toString());
// feign接口
formApi.getForm();
return chain.filter(exchange);
}
}
但是在调用feign接口时一直提示找不到可用的服务
后续打断点进入源码查看,发现卡住的是这个地方,单独抽出这一部分代码在controller层测试 能正常获取服务实例
最终经过测试修改后,使用webflux的过滤器接口WebFilter 代码中能正常调用feign接口
对比WebFilter和GlobalFilter后发现2个过滤器执行时不在同一个线程中
GlobalFilter只对路由到其他服务的请求有效,WebFilter对所有请求有效
最终代码
@Component
public class AuthFilter2 implements WebFilter {
@Resource
private FormApi formApi;
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
// feign请求
formApi.getForm().getData();
return chain.filter(exchange);
}
}
在WebFilter中除了不能获取路由后的实际请求路径
其他的暂时没发现什么问题
更多推荐
已为社区贡献2条内容
所有评论(0)