引起错误的原因,在负载均衡调用时 BlockingLoadBalancerClient 会有一个 block 的操作
@Override publicServiceInstance choose(String serviceId, Request request) { // 略... // block Response loadBalancerResponse = Mono.from(loadBalancer.choose(request)).block(); // 略... return loadBalancerResponse.getServer(); }
往里面走会看到有个 blockingGet 方法,有做一个判断当前线程是否为非阻塞线程(NonBlocking)
// BlockingSingleSubscriber 类方法
final T blockingGet() {
if (Schedulers.isInNonBlockingThread()) {
throw new IllegalStateException("block()/blockFirst()/blockLast() are blocking, which is not supported in thread " + Thread.currentThread().getName());
}
}
// Schedulers 类方法
public static boolean isInNonBlockingThread() {
return Thread.currentThread() instanceof NonBlocking;
}
由于 Gateway 使用的线程为 NonBlocking,因此会报错,解决方案可以直接使用其他线程池调用,使用 Future#get(long, Timeunit) 获取响应结果;简单的例子如下:
CompletableFuturefuture = CompletableFuture.supplyAsync(() -> 1 + 1); Integer ret = future.get(1, TimeUnit.SECONDS);



