微服務ServiceComb示例講解微服務配置中心選型與對接

做者    李波html

配置中心    

項目代碼中常常會用到各類配置項,好比下面的代碼中是從系統環境變量中獲取prop :java

String prop = System.getProperty(myProperty);
int x = DEFAULT_VALUE;
try {
    x = Integer.parseInt(prop);
} catch (NumberFormatException e) {
    // handle format issues
}
myMethod(x);

相似使用環境變量或者propertiesxml等文件方式傳入配置進而控制應用表現的方法普遍應用於開發過程當中,這樣作能夠將外部配置與業務代碼解耦,如有變更只需修改配置參數而不須要從新編譯構建項目。可是這種將配置和代碼放在一塊兒的方式可能會泄露隱私信息(好比密碼),由於代碼可能會公開,出於安全的考慮,配置和代碼分離管理的方式開始普遍使用,常見的方法好比將配置放在CI服務器上經過打包腳本打入應用包中,或者直接放到運行應用的服務器的特定目錄下,或者存儲到數據庫中。這種方式在傳統的單體應用中簡單有效,但也帶來一些新的挑戰:git

  • 配置變化頻繁時,須要頻繁的打包部署應用
  • 不一樣的環境下配置項不一樣須要分開管理(好比測試環境和生產環境)
  • 配置項中的隱私信息雖然避免了隨代碼公開而泄露,可是仍是會打包到應用包中

此外,面對微服務爆發式增加的應用數量和服務器數量帶來新的困難github

  • 複雜的業務對應大量的配置項
  • 配置項在不一樣服務中可能出現衝突
  • 對集羣部署的應用配置進行修改時須要一次修改每一個機器上的應用配置

這種背景下,中心化的配置服務即配置中心應運而生,簡單來講,配置中心就是一種統一管理各類應用配置的基礎服務組件,一個合格的配置中心須要知足:redis

  • 配置項容易讀取和修改
  • 添加新配置要簡單直接
  • 支持對配置的修改的檢視以把控風險
  • 能夠查看配置修改的歷史記錄
  • 不一樣部署環境支持隔離

開源社區目前主流的配置中心有spring-cloud-config, ctrip apollo, disconf 等,下表是對其功能特性、技術路線、可用性和易用性等發麪的比較[3]供參考。spring

  spring-cloud-config ctrip apollo disconf
靜態配置管理 基於文件 支持 支持
動態配置管理 支持 支持 支持
統一管理 無,須要github 支持 支持
多維度管理 無,須要github 支持 支持
本地配置緩存 支持 支持
配置生效時間 重啓或手動refresh生效 實時 實時
配置更新推送 手動觸發 支持 支持
配置定時拉取 支持 依賴事件驅動
受權、審計、審覈 無,須要github 支持
配置版本管理 git作版本管理 界面上提供發佈歷史和回滾按鈕 操做記錄在數據庫,無查詢接口
實例配置監控 須要結合spring admin 支持 支持
灰度發佈 不支持 支持 不支持部分更新
告警通知 不支持 支持,郵件方式告警 支持,郵件方式告警
多數據中心部署 支持 支持 支持
配置界面 無,經過git操做 統一界面 統一界面

綜合比較後,ServiceComb選擇了Apollo[4]做爲配置中心進行對接。Apollo是攜程框架部門研發並貢獻到開源社區的分佈式配置中心,活躍貢獻者近百人。最新版本的ServiceComb Java Chassis已實現支持Apollo,用戶可使用該配置中心結合Chassis中集成的Archaius實如今不須要從新啓動或從新部署應用的前提下進行配置項的集中管理和動態修改。基於ServiceComb優秀的插件化設計,用戶能夠很是簡單的對接到其餘開源或自研的配置中心。docker

使用簡介

啓動Apollo服務

  • 啓動apollo服務

        Apollo服務能夠經過docker或二進制啓動,方法參考官網文檔[5],推薦使用docker啓動。        數據庫

git clone https://github.com/lijasonvip/apollo-image-for-servicecomb.git
cd apollo-image-for-servicecomb && docker-compose up

       出現apollo-quick-start | Portal started. You can visit http://localhost:8070 now!後表示Apollo已經啓動成功,瀏覽器訪問http://localhost:8070便可訪問portal服務,默認登陸帳號爲apollo/adminapache

  • 建立應用

        登陸後點擊建立項目,填入應用名稱,其餘選默認便可,建立應用後須要進入應用點擊發布才能生效。瀏覽器

  • 生產TOKEN

        應用發佈後咱們須要獲取一個TOKEN,在http://localhost:8070/open/manage.html頁面填入剛纔建立的應用ID和應用名稱並選擇項目和部門信息後點擊建立便可生成一個TOKEN,保存此TOKEN並配置到Chassis應用的配置文件中。         

引入依賴

在Chassis應用的pom文件中引入依賴config-apollo

<dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>config-apollo</artifactId>
 </dependency>

添加配置

 在Chassis應用的配置文件microservice.yaml中增長如下配置:

apollo:
     config:
       serverUri: http://127.0.0.1:8070
       serviceName: provider-id				#建立應用時的AppID
       env: DEV
       clusters: default
       namespace: application
       token: de3c5b2e6d8535b96
       refreshInterval: 10

至此,經過簡單的4步應用已經成功的對接到了Apollo配置中心,啓動應用後能夠在Apollo頁面經過對配置項的新增、更新、回滾等操做進行服務治理啦!Demo參考[6]。

對接配置中心

Chassis動態配置基於Netflix的Archaius實現[7],Archaius擴展數據源方法參考文檔[8]和demo[9],Chassis按照[8]擴展了PolledConfigurationSourceAbstractPollingScheduler,啓動的時候用SPI機制找到Source接口的實現類。

對接到一個新的配置中心只要擴展實現ConfigCenterConfigurationSource接口,實現init方法,在init方法中實現鏈接配置中心,刷新配置項的邏輯便可,具體代碼請參考[10]。

  • 設計配置項

        對接到新的配置中心能夠設計新的配置參數,定義新的工具類獲取這些參數,並指定默認值,參考ApolloConfig類對新增apollo.config.serverUri等參數的處理

  • 擴展Source接口

        init函數實現固定時間間隔或實時獲取配置中心的配置項邏輯。ApolloClientrefreshApolloConfig函數啓動了一個定時執行的線程刷新配置項:

 public void refreshApolloConfig() {
    EXECUTOR
        .scheduleWithFixedDelay(new ConfigRefresh(serviceUri), 
                                firstRefreshInterval, 
                                refreshInterval, 
                                TimeUnit.SECONDS);
  }

       ConfigRefresh線程的run中會從Apollo配置中心獲取最新配置項並和以前的配置項對比分析出新增、修改和刪除的配置參數,而後去執行對應的更新操做。對配置項的修改更新都是基於Archaius的WatchedUpdateListener 進而實現應用內參數的動態更新。

加入ServiceComb社區

ServiceComb目前在Apache基金會孵化,誠摯的歡迎開發者和用戶一塊兒參與社區討論和貢獻,加入社區的方法有訂閱郵件列表,關注微信公衆號,加入社區微信羣等,詳細方法請參考[1]。

掃描下方二維碼添加ServiceComb助手和關注社區公衆號。

ServiceComb小助手

ServiceComb公衆號

參考資料

[1]  加入ServiceComb社區 http://mp.weixin.qq.com/s/a8dJupGGLPG0zhnhVq-Rdg

[2]  ServiceComb 項目地址 https://github.com/apache/incubator-servicecomb-java-chassis

[3]  開源配置中心比較 https://github.com/ctripcorp/apollo/wiki/FAQ

[4]  ctrip apollo https://github.com/ctripcorp/apollo/

[5]  Apollo啓動 https://github.com/ctripcorp/apollo/wiki/Quick-Start

[6]  Chassis應用使用Apollo配置中心Demo https://github.com/apache/incubator-servicecomb-java-chassis/tree/master/samples/config-apollo-sample

[7]  Netflix Archaius https://github.com/Netflix/archaius/

[8]  Archaius 擴展數據源 https://github.com/Netflix/archaius/wiki/Users-Guide

[9]  Archaius 對接Redis Demo https://github.com/cnwrinc/archaius-redis

[10] Chassis對接配置中心代碼 https://github.com/apache/incubator-servicecomb-java-chassis/tree/master/dynamic-config/config-apollo

相關文章
相關標籤/搜索