架构模式: 外部配置化
架构模式: 外部配置化
上下文
应用程序通常使用一个或多个基础结构和第三方服务。基础结构服务的示例包括:服务注册表,消息代理和数据库服务器。第三方服务的示例包括:支付处理,电子邮件和消息传递等。
问题
如何使服务无需修改即可在多个环境中运行?
要点
- 必须为服务提供配置数据,以告知它如何连接到外部/第三方服务。例如,数据库网络位置和凭据
- 服务必须在多个环境中运行 - 开发,测试,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) 编辑 收藏 举报