跨领域问题:外部配置

背景

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

问题

怎样使一个服务不经过修改就可以运行在多个环境?

限制

  • 必须提供配置给服务,告诉它怎么链接外部 / 第三方服务。比如,数据库网络地址和证书
  • 服务必须运行在多个环境 - dev,test,qa,staging,production - 而无需修改和重编译
  • 不同的环境使用了外部 / 第三方服务的不同实例。比如,QA的数据库 vs. 生产环境的数据库,测试环境的信用卡处理账号和生产环境的信用卡处理账号

解决方案

将应用的所有配置外部化,包括数据库证书和网络地址。启动时,服务从外部源读取配置信息,比如,操作系统的环境变量等等。

示例

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

微服务示例应用中的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是服务的逻辑名称。通过客户端服务发现来解析。

结果

这个模式有以下优势:

  • 应用无需修改和重编译,就可以运行在多种环境

这个模式也有以下问题:

  • 当一个应用部署时,如何确保提供的配置就是它期待的?

相关模式

  • 服务发现模式,服务端发现 和 客户端发现 解决了一个服务如何知道其他服务的网络地址的相关问题。

你可能感兴趣的:(跨领域问题:外部配置)