佈署配置管理中心apollo

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

服務端基於Spring Boot和Spring Cloud開發,打包後能夠直接運行,不須要額外安裝Tomcat等應用容器。java

Java客戶端不依賴任何框架,可以運行於全部Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持。python

它具備如下特色mysql

統一管理不一樣環境、不一樣集羣的配置

Apollo提供了一個統一界面集中式管理不一樣環境(environment)、不一樣集羣(cluster)、不一樣命名空間(namespace)的配置。
同一份代碼部署在不一樣的集羣,能夠有不一樣的配置,好比zk的地址等
經過命名空間(namespace)能夠很方便的支持多個不一樣應用共享同一份配置,同時還容許應用對共享的配置進行覆蓋
配置修改實時生效(熱發佈)

用戶在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程序。
版本發佈管理

全部的配置發佈都有版本概念,從而能夠方便的支持配置的回滾。
灰度發佈

支持配置的灰度發佈,好比點了發佈後,只對部分應用實例生效,等觀察一段時間沒問題後再推給全部應用實例。
權限管理、發佈審覈、操做審計

應用和配置的管理都有完善的權限管理機制,對配置的管理還分爲了編輯和發佈兩個環節,從而減小人爲的錯誤。
全部的操做都有審計日誌,能夠方便的追蹤問題。
客戶端配置信息監控

能夠方便的看到配置在被哪些實例使用
提供Java和.Net原生客戶端

提供了Java和.Net的原生客戶端,方便應用集成
支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便應用使用(須要Spring 3.1.1+)
同時提供了Http接口,非Java和.Net應用也能夠方便的使用
提供開放平臺API

Apollo自身提供了比較完善的統一配置管理界面,支持多環境、多數據中心配置管理、權限、流程治理等特性。
不過Apollo出於通用性考慮,對配置的修改不會作過多限制,只要符合基本的格式就可以保存。
在咱們的調研中發現,對於有些使用方,它們的配置可能會有比較複雜的格式,如xml, json,須要對格式作校驗。
還有一些使用方如DAL,不只有特定的格式,並且對輸入的值也須要進行校驗後方可保存,如檢查數據庫、用戶名和密碼是否匹配。
對於這類應用,Apollo支持應用方經過開放接口在Apollo進行配置的修改和發佈,而且具有完善的受權和權限控制
部署簡單

配置中心做爲基礎服務,可用性要求很是高,這就要求Apollo對外部依賴儘量地少
目前惟一的外部依賴是MySQL,因此部署很是簡單,只要安裝好Java和MySQL就可讓Apollo跑起來
Apollo還提供了打包腳本,一鍵就能夠生成全部須要的安裝包,而且支持自定義運行時參數

 

一 快速部署 (單機,單環境)git

詳情可參考官方文檔https://github.com/ctripcorp/apollo/wiki/Quick-Startgithub

這裏作簡單記錄:spring

1.下載安裝包sql

2.安裝mysql數據庫。版本要求爲5.6+數據庫

3.建立數據庫。包括兩個。一個是元數據庫,ApolloPortalDB。一個是環境數據庫,ApolloConfigDB。相應的sql存放在安裝包的sql目錄下。庫名可自定義。json

4.修改配置。主要是啓動腳本。demo.sh.

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=用戶名
apollo_config_db_password=密碼(若是沒有密碼,留空便可)

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=用戶名
apollo_portal_db_password=密碼(若是沒有密碼,留空便可)

 

5.啓動。

Quick Start腳本會在本地啓動3個服務,分別使用8070, 8080, 8090端口,請確保這3個端口當前沒有被使用。

執行demo.sh start命令。啓動會很慢。

若是遇到如下錯誤是正常的。

注:在啓動apollo-configservice的過程當中會在日誌中輸出eureka註冊失敗的信息,如com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused。須要注意的是,這個是預期的狀況,由於apollo-configservice須要向Meta Server(它本身)註冊服務,可是由於在啓動過程當中,本身還沒起來,因此會報這個錯。後面會進行重試的動做,因此等本身服務起來後就會註冊正常了

 

6.若是一切正常的話。經過8080端口能夠看到註冊中心界面以下。

 

 經過8090端口能夠看到哪下界面:

經過8070端口能夠看到以下界面:

 

 

 用戶能夠經過此界面建立一個項目。新增修改刪除配置。併發布。若有錯誤可回滾上一版本。可建立灰度版本。可建立不一樣環境的配置。可查看配置發佈歷史,並選擇版本回滾。

 

 

 7.建立

   建立一個項目,併發佈一個配置:test->apollo

 

 8使用

官方提供了java,.net客戶端。也有網友提供了go,php,python等語言的http接口。這裏使用java客戶端。

8.1 新建一個項目,加入pom.xml

<dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.0.0</version>
    </dependency>

8.2建立appid,即哪個項目,好比剛纔咱們建立了一個test項目的時候,會填寫一個app.id,假如爲test.

官方實際上提供了3種配置方式 ,這裏只選擇在項目中配置文件的方式 。

在resource目錄下新建目錄META-INF,而後建立文件app.properties.內容爲app.id=test

 

 8.3建立Apollo Meta Server。即每個環境的服務地址。

官方一樣提供了不少種建立方式。這裏在本地的話,使用在項目中經過配置文件的方式指定。

在resource目錄下建立apollo-env.properties,內容爲

dev.meta=http://localhost:8080
fat.meta=http://localhost:8180
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xxx.com

目前只是單環境,實際上只須要修改dev.meta的內容。其它環境在多環境部署時介紹。

8.4 指定環境 。哪怕是在單環境下,要使用配置,也是須要指定一個環境的。

官方提供的指定方式也蠻多。在開發環境下,可直接在eclipse裏設定。

windon->preferences->java->Installed JREs

 

 8.5 java的api

 

Config config = ConfigService.getAppConfig(); 
        String value = config.getProperty("test", "default");
        System.out.println("value = " + value);

輸出

value = hello apollo

應用很是簡單。

 

9 一些疑問。

9.1 在服務器修改了配置後,它真的能作到官方所言1秒鐘實時推送到客戶端嗎?

能夠。

Config config = ConfigService.getAppConfig(); 
        while (true) {
            String value = config.getProperty("test", "default");
            System.out.println("time = " + System.currentTimeMillis() + " value = " + value);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

輸出

 

 9.2 配置其實是保存在mysql裏面的,頻繁讀取會有額外的性能壓力嗎?

沒有去調試去源碼,但本地保存有一個緩存文件。在/opt/data/test/config-cache目錄下,會有一個文件,保存有最新的配置數據。每次讀取都是到這裏獲取。

 

 

 二多環境部署。

1.直觀上的區別 。首先咱們來看快速單環境部署的目錄。

直接從官網下載安裝包,解壓,獲得這樣的目錄,修改配置,直接啓動demo.sh就能夠啓動了。很是簡單。

可是多環境佈署的目錄是這樣的,假設部署DEV和FAT兩個環境。

dev下

 

2.一樣須要安裝數據庫。跟快速部署同樣。一個是元數據庫,ApolloPortalDB。環境數據庫則需建立多個,ApolloConfigDB_DEV,ApolloConfigDB_FAT。相應的sql存放在安裝包的sql目錄下。庫名可自定義。

3.打開ApolloPortalDB庫serverconfig表,修改apollo.portal.envs值,默認爲dev,加入須要配置的其它環境。如fat,如自定義。不區分大小寫。

 

4.打開ApolloConfigDB_DEV或者 ApolloConfigDB_FAT庫,打開serverconfig表,修改eureka.service.url註冊服務中心地址。

具體怎麼修改呢?

假設咱們如今是要部署dev和fat兩個環境,由單環境部署可知,服務啓動會有三個端口,分別是配置中心8070,註冊服務8080,admin服務8090,

假設咱們規劃,因爲8070端口只有一個

dev環境中三個端口分別爲 8070,8080,8090

fat環境中三個端口分別爲  8070,8180,8090

那麼ApolloConfigDB_DEV中因爲默認關係能夠不用修改,而ApolloConfigDB_FAT中則須要把eureka.service.url修改成http://localhost:8180/eureka/

 

 5準備工做完成,開始下載或者編譯安裝包。

我選擇的是下載源碼,編譯。在script目錄下有個build.bat和build.sh文件,點擊聯網自動完成編譯。

獲取三個目錄apollo-adminservice apollo-configservice apollo-portal 下的target文件下的zip文件。放入建立好的dev/adminservice dev/configservice 目錄下並解壓。portal 只需放在一個目錄 下。

6首先啓動portal

首先在config目錄下修改application-github.properties文件相關mysql配置

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 123456

而後修改apollo-env.properties中各個環境註冊中心的服務地址

dev.meta=http://localhost:8080
fat.meta=http://localhost:8180

而後點擊script目錄下startup.sh啓動。

 

7啓動dev環境

7.1首先啓動adminservcie,首先修改config目錄下application-github.properties文件中mysql配置

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_DEV?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 123456

修改script目錄下start.sh中關於端口SERVER_PORT=8090。

點擊script目錄下start.sh啓動。

7.2而後啓動configservice,首先修改config目錄下application-github.properties文件中mysql配置

修改script目錄下start.sh中關於端口SERVER_PORT=8080。

點擊script目錄下start.sh啓動。

 

8啓動fat環境

8.1首先啓動adminservice,首先修改config目錄下application-github.properties文件中mysql配置

# DataSource
spring.datasource.url = jdbc:mysql://localhost:3306/ApolloConfigDB_FAT?characterEncoding=utf8
spring.datasource.username = root
spring.datasource.password = 123456

修改script目錄下start.sh中關於端口SERVER_PORT=8190。

點擊script目錄下start.sh啓動。

8.2而後啓動configservice,首先修改config目錄下application-github.properties文件中mysql配置

修改script目錄下start.sh中關於端口SERVER_PORT=8180。

點擊script目錄下start.sh啓動。

 

9.啓動成功後,經過8070端口能夠看到以下畫面,環境列表中出現了兩個。

 

 在dev環境中加入配置test->apollodev,fat環境中加入test->apollofat,經過切換不一樣的環境能夠獲得不一樣的值。

 

 

 

 參考自apollo官方文檔

https://github.com/ctripcorp/apollo

相關文章
相關標籤/搜索