最近使用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中除了不能获取路由后的实际请求路径
其他的暂时没发现什么问题

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐