引起错误的原因,在负载均衡调用时 BlockingLoadBalancerClient 会有一个 block 的操作

	@Override
	public <T> ServiceInstance choose(String serviceId, Request<T> request) {
        // 略...
        // block
		Response<ServiceInstance> 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) 获取响应结果;简单的例子如下:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1 + 1);
Integer ret = future.get(1, TimeUnit.SECONDS);
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐