1. 程式人生 > >橫切關注點之外部化配置

橫切關注點之外部化配置

背景

應用程式通常使用一個或多個基礎結構和第三方服務。基礎結構服務的示例包括:服務登錄檔,訊息代理和資料庫伺服器。第三方服務的示例包括:支付處理,電子郵件和訊息傳遞等。

問題

如何使服務無需修改即可在多個環境中執行?

訴求

  • 必須為服務提供配置資料,以告知它如何連線到外部/第三方服務。例如,資料庫網路位置和憑據
  • 服務必須在多個環境中執行 - 開發,測試,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是服務的邏輯名稱。它使用客戶端發現解決。

結果

這種模式具有以下好處:

  • 應用程式在多個環境中執行,無需修改和/或重新編譯

此模式存在以下問題:

  • 如何確保在部署應用程式時,提供的配置與預期的匹配?

相關模式

  • 服務發現模式,伺服器端服務發現和客戶端服務發現,解決了服務如何知道其他應用服務的網路位置的相關問題