Spring-Cloud中通过Feign调用外网HTTP网络通信方法

使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务,比如调用百度登http接口:

1.对于调用的http,只要能访问即可:

2、访问端,也就是spring-cloud端。

A、在工程启动类名前加入@EnableFeignClients注解:如下图:

@SpringBootApplication
@EnableFeignClients
public class VisualintercomAppServiceApplication extends SpringBootServletInitializer {

B、加入依赖:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-

在使用 `spring-cloud-starter-gateway` 时,通过 Feign 调用服务出现 `'block()/blockFirst()/blockLast() are blocking'` 错误的原因是响应式编程模型与阻塞操作的不兼容性。Spring Cloud Gateway 基于 Project Reactor 构建,其内部使用非阻塞 I/O 和响应式流(如 `Mono` 和 `Flux`)来实现高性能的网关功能。然而,Feign 是一个同步的声明式 HTTP 客户端,其默认行为是阻塞式的,这与 Spring Cloud Gateway 的异步、非阻塞架构存在冲突[^1]。 当 Feign 被用于响应式上下文中(例如在 `Schedulers.parallel()` 提供的线程中),如果尝试调用 `block()`、`blockFirst()` 或 `blockLast()` 等方法,Reactor 会检测到当前线程属于 `parallel` 类型,并抛出 `IllegalStateException`,提示“blocking not supported in this thread”[^2]。 ### 替代方案 #### 使用 WebClient 替代 Feign 推荐的做法是使用 Spring WebFlux 提供的 `WebClient` 来替代 Feign,因为它是完全基于响应式流设计的客户端,能够与 Spring Cloud Gateway 的非阻塞特性无缝集成: ```java WebClient webClient = WebClient.builder() .baseUrl("http://service-name") .build(); Mono<String> result = webClient.get() .uri("/api") .retrieve() .bodyToMono(String.class); result.subscribe(System.out::println); ``` 这种方式避免了阻塞操作,保持了系统的响应性和吞吐量[^3]。 #### 在非响应式上下文中执行 Feign 请求 如果仍需使用 Feign,可以通过将请求调度到支持阻塞操作的调度器(如 `Schedulers.boundedElastic()`)来规避限制: ```java Mono.fromCallable(() -> feignClient.callService()) .subscribeOn(Schedulers.boundedElastic()) .subscribe(result -> System.out.println(result)); ``` 该方式利用 `boundedElastic()` 创建新的线程以隔离阻塞行为,从而避免影响其他任务的执行效率[^4]。 #### 配置 Feign 为响应式模式(不推荐) 虽然 Feign 可以通过配置支持响应式返回类型(如 `Mono`),但其实现本质上仍然是同步阻塞的,仅在外部封装为响应式接口,无法真正发挥响应式编程的优势: ```java @RequestLine("GET /api") Mono<String> callService(); ``` 这种做法并不符合响应式编程的最佳实践,建议优先考虑使用 `WebClient` 或 `Ribbon` + `Reactor` 的组合[^5]。 --- ### 总结 在 Spring Cloud Gateway 中应避免直接使用 Feign 进行服务调用,因其同步阻塞特性与响应式架构不兼容,容易引发性能瓶颈和运行时异常。推荐使用 `WebClient` 实现非阻塞通信,或在必要情况下切换至支持阻塞操作的调度器以完成调用---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kunzai6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值