架构模式: 外部配置化

架构模式: 外部配置化

上下文

应用程序通常使用一个或多个基础结构和第三方服务。基础结构服务的示例包括:服务注册表,消息代理和数据库服务器。第三方服务的示例包括:支付处理,电子邮件和消息传递等。

问题

如何使服务无需修改即可在多个环境中运行?

要点

  • 必须为服务提供配置数据,以告知它如何连接到外部/第三方服务。例如,数据库网络位置和凭据
  • 服务必须在多个环境中运行 - 开发,测试,qa,登台,生产 - 无需修改和/或重新编译
  • 不同的环境具有外部/第三方服务的不同实例,例如,QA数据库与生产数据库,测试信用卡处理帐户与生产信用卡处理帐户

解决方案

外部化所有应用程序配置,包括数据库凭据和网络位置。
在启动时,服务从外部源读取配置,例如, OS环境变量等

例子

Spring Boot外部化配置从各种源读取值,包括操作系统环境变量,属性文件和命令行参数。这些值在Spring应用程序上下文中可用。

来自Microservices示例应用程序的RegistrationServiceProxy是一个用Scala编写的组件示例,它使用变量user_registration_url进行配置:


@Component
class RegistrationServiceProxy @Autowired()(restTemplate: RestTemplate) extends RegistrationService {

  @Value("${user_registration_url}")
  var userRegistrationUrl: String = _

docker-compose.yml文件将其值作为操作系统环境变量提供:

web:
  image: sb_web
  ports:
    - "8080:8080"
  links:
    - eureka
  environment:
    USER_REGISTRATION_URL: http://REGISTRATION-SERVICE/user

REGISTRATION-SERVICE是服务的逻辑名称。它使用客户端发现解决。

结果上下文

这种模式具有以下好处:

  • 应用程序在多个环境中运行,无需修改和/或重新编译

此模式存在以下问题:

  • 如何确保在部署应用程序时,提供的配置与预期的匹配?

相关模式

  • 服务发现模式,服务器端服务发现和客户端服务发现,解决了服务如何知道其他应用服务的网络位置的相关问题

posted on 2019-08-02 16:16  yaofengspark  阅读(361)  评论(0编辑  收藏  举报

导航