橫切關注點之外部化配置
阿新 • • 發佈:2018-12-19
背景
應用程式通常使用一個或多個基礎結構和第三方服務。基礎結構服務的示例包括:服務登錄檔,訊息代理和資料庫伺服器。第三方服務的示例包括:支付處理,電子郵件和訊息傳遞等。
問題
如何使服務無需修改即可在多個環境中執行?
訴求
- 必須為服務提供配置資料,以告知它如何連線到外部/第三方服務。例如,資料庫網路位置和憑據
- 服務必須在多個環境中執行 - 開發,測試,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是服務的邏輯名稱。它使用客戶端發現解決。
結果
這種模式具有以下好處:
- 應用程式在多個環境中執行,無需修改和/或重新編譯
此模式存在以下問題:
- 如何確保在部署應用程式時,提供的配置與預期的匹配?
相關模式
- 服務發現模式,伺服器端服務發現和客戶端服務發現,解決了服務如何知道其他應用服務的網路位置的相關問題