gateway网关 feign请求 报错Load balancer does not contain an instance for the service

3 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值