分佈式配置中心選型

隨着業務的發展、微服務架構的升級,服務的數量、程序的配置日益增多(各類微服務、各類服務器地址、各類參數),傳統的配置文件方式和數據庫的方式已沒法知足開發人員對配置管理的要求:java

  • 安全性:配置跟隨源代碼保存在代碼庫中,容易形成配置泄漏。
  • 時效性:修改配置,須要重啓服務才能生效。
  • 侷限性:沒法支持動態調整:例如日誌開關、功能開關。

所以,分佈式配置中心應運而生!git

開源項目

關於分佈式配置中心,網上已經有不少開源的解決方案,例如:github

Apollo

Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。

項目地址:https://github.com/ctripcorp/apollospring

Diamond

Diamond是淘寶研發的分佈式配置管理系統。使用Diamond可讓集羣中的服務進程動態感知數據的變化,無需重啓服務就能夠實現配置數據的更新。shell

項目地址:https://github.com/gzllol/diamond數據庫

Disconf

專一於各類「分佈式系統配置管理」的「通用組件」和「通用平臺」, 提供統一的「配置管理服務」
api

項目地址:https://github.com/knightliao/disconf安全

項目對比

綜合對比,以爲攜程的Apollo 功能強大完善,github上開源社區比較活躍,代碼一直在維護,並且文檔寫得清楚,故最終選擇Apollo 做爲咱們的分佈式配置中心。下面簡要介紹下Apollo項目。服務器

Apollo簡介

Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。
服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。
Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持。
.Net客戶端不依賴任何框架,可以運行於全部.Net運行時環境。架構

特性

  • 統一管理不一樣環境、不一樣集羣的配置
    • Apollo提供了一個統一界面集中式管理不一樣環境(environment)、不一樣集羣(cluster)、不一樣命名空間(namespace)的配置。
    • 同一份代碼部署在不一樣的集羣,能夠有不一樣的配置,好比zookeeper的地址等
    • 經過命名空間(namespace)能夠很方便地支持多個不一樣應用共享同一份配置,同時還容許應用對共享的配置進行覆蓋
  • 配置修改實時生效(熱發佈)
    • 用戶在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序
  • 版本發佈管理
    • 全部的配置發佈都有版本概念,從而能夠方便地支持配置的回滾
  • 灰度發佈
    • 支持配置的灰度發佈,好比點了發佈後,只對部分應用實例生效,等觀察一段時間沒問題後再推給全部應用實例
  • 權限管理、發佈審覈、操做審計
    • 應用和配置的管理都有完善的權限管理機制,對配置的管理還分爲了編輯和發佈兩個環節,從而減小人爲的錯誤。
    • 全部的操做都有審計日誌,能夠方便地追蹤問題
  • 客戶端配置信息監控
    • 能夠在界面上方便地看到配置在被哪些實例使用
  • 提供Java和.Net原生客戶端
    • 提供了Java和.Net的原生客戶端,方便應用集成
    • 支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應用使用(須要Spring 3.1.1+)
    • 同時提供了Http接口,非Java和.Net應用也能夠方便地使用
  • 提供開放平臺API
    • Apollo自身提供了比較完善的統一配置管理界面,支持多環境、多數據中心配置管理、權限、流程治理等特性。不過Apollo出於通用性考慮,不會對配置的修改作過多限制,只要符合基本的格式就能保存,不會針對不一樣的配置值進行鍼對性的校驗,如數據庫用戶名、密碼,Redis服務地址等
    • 對於這類應用配置,Apollo支持應用方經過開放平臺API在Apollo進行配置的修改和發佈,而且具有完善的受權和權限控制
  • 部署簡單
    • 配置中心做爲基礎服務,可用性要求很是高,這就要求Apollo對外部依賴儘量地少
    • 目前惟一的外部依賴是MySQL,因此部署很是簡單,只要安裝好Java和MySQL就可讓Apollo跑起來
    • Apollo還提供了打包腳本,一鍵就能夠生成全部須要的安裝包,而且支持自定義運行時參數

發佈配置

經過配置中心發佈配置:

填寫發佈信息:

客戶端獲取配置(Java API樣例)

配置發佈後,就能在客戶端獲取到了,以Java爲例,獲取配置的示例代碼以下。Apollo客戶端還支持和Spring整合,更多客戶端使用說明請參見Java客戶端使用指南和.Net客戶端使用指南。

Config config = ConfigService.getAppConfig();
Integer defaultRequestTimeout = 200;
Integer requestTimeout = config.getIntProperty("requestTimeout", defaultRequestTimeout);

客戶端監聽配置變化

經過上述獲取配置代碼,應用就能實時獲取到最新的配置了。
不過在某些場景下,應用還須要在配置變化時得到通知,好比數據庫鏈接的切換等,因此Apollo還提供了監聽配置變化的功能,Java示例以下:

Config config = ConfigService.getAppConfig();
config.addChangeListener(new ConfigChangeListener() {
  @Override
  public void onChange(ConfigChangeEvent changeEvent) {
    for (String key : changeEvent.changedKeys()) {
      ConfigChange change = changeEvent.getChange(key);
      System.out.println(String.format(
        "Found change - key: %s, oldValue: %s, newValue: %s, changeType: %s",
        change.getPropertyName(), change.getOldValue(),
        change.getNewValue(), change.getChangeType()));
     }
  }
});

Spring集成樣例

Apollo和Spring也能夠很方便地集成,只須要標註@EnableApolloConfig後就能夠經過@Value獲取配置信息:

@Configuration
@EnableApolloConfig
public class AppConfig {}

@Component
public class SomeBean {
    //timeout的值會自動更新
    @Value("${request.timeout:200}")
    private int timeout;
}

總結

本文主要介紹和對比了幾種開源分佈式配置中心的選型,並重點介紹了下咱們最終選擇的攜程Apollo(阿波羅)分佈式配置中心的特性和簡單使用,有興趣的讀者能夠到具體項目的官網進行詳細研究。

相關文章
相關標籤/搜索