SpringCloud 升级到 2020.4 后,网关Gateway启动不了,没有报错,一直卡住。
只要 @Autowired 注入 OpenFeignClient ,就启动不起来。
SpringCloud版本: 2020.0.4 SpringCloudAlibaba版本: 2021.1 SpringBoot版本: 2.5.7
有以下几个需要注意的地方:
// 我这里降级啥的都没写哦 @FeignClient(name = "system", decode404 = true) public interface SystemFeignClient { @GetMapping("/test") String test(@RequestParam("id") String id); }
// 这个类的作用,是将Client包装一层,在这里做异步处理 @Slf4j @Component public class ClientHolder { @Lazy // 重点:这里必须使用@Lazy @Autowired private SystemFeignClient systemFeignClient; @Async // 重点:这里必须在异步线程中执行,执行结果返回Future public Future<String> systemClientTest() { log.info("开始使用SystemClient..."); String s = systemFeignClient.test("1001"); return new AsyncResult<>(s); } }
在其他Bean中使用是一样的哈。
@Slf4j @Component public class TestFilter implements GlobalFilter, Ordered { @Autowired private ClientHolder clientHolder; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { callClient(); return chain.filter(exchange); } private void callClient() { // 使用Client Future<String> stringFuture = clientHolder.systemClientTest(); try { log.info("stringFuture.rs :{}", stringFuture.get()); } catch (Exception e) { e.printStackTrace(); } } @Override public int getOrder() { return Ordered.HIGHEST_PRECEDENCE; } }
@Configuration @EnableAsync(proxyTargetClass = true) public class AsycTaskConfig { @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 我这里是固定写死的哦,实际不能这样写的哦 // 可以使用 Runtime.getRuntime().availableProcessors() 获取系统核心数进行配置 executor.setCorePoolSize(4); executor.setMaxPoolSize(8); executor.setQueueCapacity(1000); executor.setThreadNamePrefix("my-core-"); // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }
完整代码链接 码云地址
笔者刚开始写博客,若是帮助到您,帮忙点赞推荐下哦 ~