8.3.1 Spring 中的服务间通信
根据十五要素方法论,任何后端服务都应该通过资源绑定附加到应用程序。对于数据库,你依赖 Spring Boot 提供的配置属性来指定凭据和 URL。当后端服务是另一个应用程序时,你需要以类似方式提供其 URL。遵循外部化配置原则,URL 应该是可配置的,而不是硬编码的。在 Spring 中,你可以通过 @ConfigurationProperties bean 实现这一点,正如你在第 4 章中学到的。
在 Order Service 项目中,在 com.polarbookshop.orderservice.config 包中添加一个 ClientProperties 记录。在那里,定义你的自定义 polar.catalog-service-uri 属性来配置调用 Catalog Service 的 URI。
代码清单 8.16 为 Catalog Service URI 定义自定义属性
package com.polarbookshop.orderservice.config;
import java.net.URI;
import javax.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "polar") // 自定义属性的前缀
public record ClientProperties(
@NotNull URI catalogServiceUri // 指定 Catalog Service URI 的属性,不能为 null
) {}
注意: 要从 IDE 获得自动完成和类型验证检查,你需要在 build.gradle 文件中添加对 org.springframework.boot:spring-boot-configuration-processor 的依赖,scope 为 annotationProcessor,就像你在第 4 章中所做的那样。你可以参考本书附带的代码仓库中的 Chapter08/08-end/order-service/build.gradle 文件查看最终结果(https://github.com/ThomasVitale/cloud-native-spring-in-action)。
然后,在你的 OrderServiceApplication 类中使用 @ConfigurationPropertiesScan 注解启用自定义配置属性。
代码清单 8.17 启用自定义配置属性
package com.polarbookshop.orderservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
@SpringBootApplication
@ConfigurationPropertiesScan // 在 Spring 上下文中加载配置数据 bean
public class OrderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServiceApplication.class, args);
}
}
最后,在你的 application.yml 文件中添加新属性的值。作为默认值,你可以使用在本地环境中运行的 Catalog Service 实例的 URI。
代码清单 8.18 配置 Catalog Service 的 URI(application.yml)
# ... 其他配置
polar:
catalog-service-uri: "http://localhost:9001"
注意: 使用 Docker Compose 或 Kubernetes 部署系统时,你可以通过环境变量覆盖属性值,利用两个平台提供的服务发现功能。
在下一节中,你将使用通过此属性配置的值从 Order Service 调用 Catalog Service。