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。

results matching ""

    No results matching ""