新手入门:用 WebClient 让微服务互相通信
零基础学会使用 Spring WebClient 在微服务间发起 HTTP 请求,完成服务间数据调用。
什么是微服务通信?
在微服务架构中,每个服务只负责一个独立功能,比如订单服务和商品服务。当订单服务需要商品信息时,它不能直接读取商品服务的数据库,而是需要通过 HTTP 请求(就像浏览器访问网页一样)向商品服务询问。Spring 提供了 WebClient 这个工具,专门用来发起这样的请求。
准备工作:搭建两个 Spring Boot 服务
- 创建两个 Spring Boot 项目:order-service(订单服务)和 product-service(商品服务)。
- 在两个项目的
pom.xml中都添加 Spring WebFlux 依赖,因为 WebClient 来自 WebFlux。 - 确保每个服务有自己的数据库(比如 PostgreSQL),并且能独立运行。
配置 WebClient
在 order-service 中,定义一个 WebClient Bean,并设置好商品服务的基础 URL:
- 创建一个配置类,用
@Configuration注解。 - 编写一个方法返回
WebClient对象,用@Bean注解,并指定 Bean 名称(例如productWebClient)。 - 在方法内使用
WebClient.builder().baseUrl("http://localhost:8081/api/products").build(),这里 8081 是商品服务的端口。
在服务中使用 WebClient 发起请求
在订单服务的业务代码中,注入刚才定义的 WebClient:
- 使用
@RequiredArgsConstructor(来自 Lombok)自动生成构造函数,注入 WebClient。 - 调用
productWebClient.get().uri("/{id}", itemId).retrieve().bodyToMono(ProductResponse.class).block()。 - 解释:
get()表示 GET 请求,uri拼接商品 ID,retrieve()获取响应,bodyToMono将 JSON 转为 Java 对象,.block()让异步变为同步,等待结果返回。 - 拿到商品信息后,就可以计算总价、保存订单了。
常见坑与提醒
- 依赖问题:如果只加了 Spring Web(传统 MVC),WebClient 不可用,必须加 spring-boot-starter-webflux。
- 端口冲突:确保两个服务端口不同(比如订单用 8080,商品用 8081)。
- DTO 共享:订单服务不要引入商品服务的实体类,而是定义一个简单的 DTO(数据传输对象),只包含需要的字段(如 id、名称、价格)。
- 数据库枚举类型:如果使用 PostgreSQL 的自定义枚举,记得在实体字段上加
@Enumerated(EnumType.STRING)或使用@Column(columnDefinition = "...")匹配数据库类型。
验证是否成功
启动两个服务,用 Postman 或浏览器向订单服务发送一个创建订单的请求(包含商品 ID 和数量)。如果订单服务能正确返回包含商品名称和总价的结果,说明通信成功。
内容来源
DEV Beginners
发布时间
2026-05-29 01:30