极客前沿

新手入门:用 WebClient 让微服务互相通信

2026-05-29 01:30
DEV Beginners
查看原文

零基础学会使用 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:

Tutorial Image
  1. 创建一个配置类,用 @Configuration 注解。
  2. 编写一个方法返回 WebClient 对象,用 @Bean 注解,并指定 Bean 名称(例如 productWebClient)。
  3. 在方法内使用 WebClient.builder().baseUrl("http://localhost:8081/api/products").build(),这里 8081 是商品服务的端口。

在服务中使用 WebClient 发起请求

在订单服务的业务代码中,注入刚才定义的 WebClient:

  1. 使用 @RequiredArgsConstructor(来自 Lombok)自动生成构造函数,注入 WebClient。
  2. 调用 productWebClient.get().uri("/{id}", itemId).retrieve().bodyToMono(ProductResponse.class).block()
  3. 解释get() 表示 GET 请求,uri 拼接商品 ID,retrieve() 获取响应,bodyToMono 将 JSON 转为 Java 对象,.block() 让异步变为同步,等待结果返回。
  4. 拿到商品信息后,就可以计算总价、保存订单了。

常见坑与提醒

  • 依赖问题:如果只加了 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

返回 AI技术