gateway的GlobalFilter调用feign后,发现GlobalFilter不起作用

gateway的GlobalFilter调用feign后,发现GlobalFilter不起作用

springcloud的版本为2020.0.6

1.问题:只有feignclient无法引用

实测发现:gateway项目可以引用其他的bean,但唯独feignclient的bean无法引用。甚至都无法让feignclient的类成为bean,一旦成为bean,那么gateway的GlobalFilter就失效,而且是所有的GlobalFilter都失效。
但是可以引入其他类型的bean。

2.为什么?

不知道暂时。

3.怎么办?

3.1 第一种方案: 扔掉feign,采用 自带的WebClient远程调用:
先注册一个WebClient的bean.

    @Bean
    @LoadBalanced     // 如果不添加,无法通过服务名进行调用,只能通过ip调用
    public WebClient.Builder webBuilder(){
        return WebClient.builder();
    }

在GlobalFilter里使用

    @Autowired
    WebClient.Builder webBuilder;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //...
        //...
        String uri= "/getUserByToken";
        Mono<User> userMono = webBuilder.baseUrl("http://localhost:8080")
                .build().get()
                .uri(uri).retrieve().bodyToMono(User.class);
        User user = userMono.block();
        //...
        //...
    }

但是在“User user = userMono.block();”这里面报错了,报的什么

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking

说是在GlobalFilter里面不支持同步阻塞调用。FUCK!

没有办法,只能采取异步的调用了。但这种所谓的异步,依然是隐式阻塞.不过这个倒是可行的。

    @Autowired
    WebClient.Builder webBuilder;
    //添加个线程池
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //...
        //...
        Future<User> submit = executorService.submit(() -> {
            Mono<User> userMono = webBuilder.baseUrl("http://localhost:8080")
                    .build().get()
                    .uri(uri).retrieve().bodyToMono(User.class);
            User block = userMono.block();
            return block;
        });
        User User = submit.get();
        //...
        //...
    }

3.2 第二种方案:
尽量在设计的时候在gateway里面摒弃remote-feign调用,某些操作可以直接调用service就直接调用service,比如说调用RedisService.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值