Apollo配置中心的安裝與使用

ps:偷個懶,直接把我寫的文檔粘貼過來了,畢竟不想打字了= =

一、 文檔目的
本文檔主要目的爲,介紹Apollo配置中心的配置及在Java程序中的調用,以便方便大家的開發與使用。
二、 Apollo簡介
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,能夠集中化管理應用不同環境、不同集羣的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性,適用於微服務配置管理場景。

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

Java客戶端不依賴任何框架,能夠運行於所有Java運行時環境,同時對Spring/Spring Boot環境也有較好的支持。
三、 Apollo部署方式
Apollo的部署方式,可以分爲本地快速部署(Quick Start)和分佈式部署。

  1. Quick Start
    Quick Start是Apollo爲了讓大家快速上手配置中心,提供給開發者在本地部署及啓動的部署方式。本方式僅限於本地測試。

官網地址:https://github.com/ctripcorp/apollo/wiki/Quick-Start

使用Quick Start有以下步驟:
1.1 準備工作
1.1.1 環境要求
1.1.1.1 Java
Apollo對java的版本要求如下:
Apollo服務端:1.8+
Apollo客戶端:1.7+
因Quick Start需要在本地同時啓動服務端與客戶端,所以要求java版本爲1.8以上。
1.1.1.2 Mysql
版本要求:5.6.5+。
Apollo的表結構對timestamp使用了多個default聲明,所以需要5.6.5以上版本。但可以根據相關文檔說明,進行數據庫降級使用。可參考https://github.com/ctripcorp/apollo/issues/481。
1.1.2 Quick Start安裝包準備
1.1.2.1 從github直接下載安裝包
地址:https://github.com/nobodyiam/apollo-build-scripts
1.1.2.2 自行打包(不推薦)
因Quick Start本身即爲方便快速啓動而準備的程序包,所以並不推薦自己打包,但若有興趣自行打包,可參考下面步驟:
修改apollo-configservice, apollo-adminservice和apollo-portal的pom.xml,註釋掉spring-boot-maven-plugin和maven-assembly-plugin
在根目錄下執行mvn clean package -pl apollo-assembly -am -DskipTests=true
複製apollo-assembly/target下的jar包,rename爲apollo-all-in-one.jar
1.1.3 安裝步驟
1.1.3.1 創建數據庫
Apollo服務端共需要兩個數據庫:ApolloPortalDB和ApolloConfigDB,且官方已提供文件,自行下載導入即可。
下載地址:https://github.com/nobodyiam/apollo-build-scripts/tree/master/sql
1.1.3.2 配置數據庫連接信息
安裝完數據庫之後,需要對數據庫連接信息進行配置,讓服務端知道你數據庫存放地址。打開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=密碼(如果沒有密碼,留空即可)

1.1.3.3 啓動Apollo配置中心
啓動時,使用命令行進入項目所在目錄(不需要通過IDE打開),運行demo.sh start即可訪問。

注意:服務會默認佔用8070(portal), 8080(configservice), 8090(adminservice)三個端口,其中,configservice跟默認的eureka註冊中心位於同一進程內,佔用8080端口。請保證這仨個端口未被佔用。

  1. 分佈式部署
    2.1 準備工作
    2.1.1 運行時環境
    2.1.1.1 OS
    服務端基於Spring Boot,啓動腳本理論上支持所有Linux發行版,建議CentOS 7。
    2.1.1.2 Java
    同1.1.1.1.
    對於Apollo客戶端,運行時環境只需要1.7+即可。
    注:對於Apollo客戶端,如果有需要的話,可以做少量代碼修改來降級到Java 1.6.
    可參考:https://github.com/ctripcorp/apollo/issues/483。
    2.1.2 Mysql數據庫
    同1.1.1.2
    2.1.3 環境設置
    Apollo支持多種環境的配置與使用,需要在部署之前,確認要部署的環境。當前支持的環境有:
    • DEV
    o 開發環境
    • FAT
    o 測試環境,相當於alpha環境(功能測試)
    • UAT
    o 集成環境,相當於beta環境(迴歸測試)
    • PRO
    o 生產環境
    在部署的時候,Portal只需要在產品環境部署一次,adminservice與configservice需在每個環境部署一次。若需要添加自定義的環境,則需要修改com.ctrip.framework.apollo.core.enums.Env這個枚舉類,添加新的枚舉即可。
    參考文檔:https://github.com/ctripcorp/apollo/wiki/%E9%83%A8%E7%BD%B2&%E5%BC%80%E5%8F%91%E9%81%87%E5%88%B0%E7%9A%84%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98#42-%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E7%8E%AF%E5%A2%83

2.1.4 網絡策略
網絡策略在官網有具體說明,主要爲了解決網絡設置導致的獲取不到配置的問題。我在測試的時候,將服務部署在10.60.但我在本地訪問,卻訪問不到配置中心。在查看日誌後發現,該服務器有兩個網卡,分別時10.18.X.X與192.168.X.X,而服務默認使用了192.168.X.X的網卡,導致我訪問不了。解決這個問題,有多種方式,官網有說明,我使用了在start.sh中添加-D參數直接指定啓動ip解決的。
參考文檔:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97#14%E7%BD%91%E7%BB%9C%E7%AD%96%E7%95%A5

2.2 部署步驟
2.2.1 創建數據庫
同1.1.3.1.
數據庫中重要表字段說明,可參照下面文檔:
https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97#21-%E5%88%9B%E5%BB%BA%E6%95%B0%E6%8D%AE%E5%BA%93

2.2.2 獲取安裝包
安裝包同樣可直接下載或自己通過源碼構建。根據自己需求改動。
2.2.2.1 下載安裝包
下載地址:https://github.com/ctripcorp/apollo/releases
下載apollo-adminservice-1.5.0-github.zip,apollo-configservice-1.5.0-github.zip,apollo-portal-1.5.0-github.zip,三個壓縮包即可。
下載完成後需要做如下操作:

  1. 將壓縮包上傳到服務器,並進行解壓。
  2. 修改config目錄下的application-github.properties文件,修改爲你數據庫的正確地址。注意:adminService和configService連接的是ApolloConfigDB,而portal連接的是ApolloPortalDB。

DataSource

spring.datasource.url = jdbc:mysql://localhost:3306/ApolloPortalDB?useSSL=false&characterEncoding=utf8
spring.datasource.username = someuser
spring.datasource.password = somepwd
3. 配置apollo-portal的meta信息(這裏在多環境管理還會提到)。修改portal服務config路徑下的apollo-env.properties,對meta進行修改,若無對應環境,可刪除對應的配置。默認情況下,meta service 與 config service是在同一個JVM進程中,所以這裏指定的即爲config service的地址。如:
dev.meta=http://localhost:8080
fat.meta=http://apollo.fat.xxx.com
uat.meta=http://apollo.uat.xxx.com
pro.meta=http://apollo.xxx.com
2.2.2.2 通過源碼構建
源碼下載地址:https://github.com/ctripcorp/apollo
通過源碼構建,需要做如下操作:

  1. 修改scripts/build.sh中的數據庫信息。跟上面相同。
  2. 修改scripts/build.sh中的meta server地址,跟上面相同。
  3. 若沒有自己的個性化設置,則可以直接運行build.sh進行打包即可。
  4. Build運行成功後,可在portal,adminservice,configservice下對應的target目錄下,拿到apollo-XX-x.x.x-github.zip。跟直接下載的包相同。

Ps:在windows下執行構建操作時,可能會報如下異常:ERROR OS=Windows and the assembly descriptor contains a *nix-specific root-relative-reference (starting with slash) / [duplicate]。問題原因是編譯腳本調用獲取文件的時候,以linux的路徑來進行訪問,所以在windows下會找不到,解決方式如下(我測試時,第二種方式可行,第一種有可能出現問題):

<fileSets>
  <fileSet>
    <directory>src/main/resources</directory>
    <outputDirectory/>
  </fileSet>
</fileSets>
或者

<fileSets>
  <fileSet>
    <directory>src/main/resources</directory>
    <outputDirectory>./</outputDirectory>
  </fileSet>
</fileSets>

2.2.3 部署及啓動應用
將zip包上傳到服務器相應位置,解壓後,執行scripts/start.sh即可。
Ps:在執行start.sh時可設置JVM內存內存設置,可根據需求來設置。我使用了默認配置。
四、 Java客戶端調用方式

  1. 環境要求
    1.1 必選設置
    1.1.1 AppId
    AppId是應用的身份信息,也是在Apollo配置中心中創建項目的必要參數。
    通常可在app. Properties或 application.properties中配置即可:
    AppId=myProject
    1.1.2 Apollo Meta Server
    Apollo支持應用在不同的環境有不同的配置,所以需要在運行提供給Apollo客戶端當前環境的Apollo Meta Server信息。默認情況下,meta server和config service是部署在同一個JVM進程,所以meta server的地址就是config service的地址。
    Apollo Meta Server的設置方式有多種,
    通常可在application.properties或bootstrap.properties中指定:
    apollo.meta=http://config-service-url
    或在apollo-env.properties中配置,apollo-env.properties中的配置如下:
    dev.meta=http://1.1.1.1:8080
    fat.meta=http://apollo.fat.xxx.com
    uat.meta=http://apollo.uat.xxx.com
    pro.meta=http://apollo.xxx.com
    更多配置方式可參考:https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#122-apollo-meta-server

1.1.3 本地緩存路徑
Apollo客戶端會把從服務端獲取到的配置在本地文件系統緩存一份,用於在遇到服務不可用,或網絡不通的時候,依然能從本地恢復配置,不影響應用正常運行。
本地緩存路徑默認位於以下路徑,所以請確保/opt/data或C:\opt\data\目錄存在,且應用有讀寫權限。

Mac/Linux: /opt/data/{appId}/config-cache
Windows: C:\opt\data{appId}\config-cache
本地配置文件會以下面的文件名格式放置於本地緩存路徑下:

{appId}+{cluster}+{namespace}.properties

appId就是應用自己的appId,如100004458
cluster就是應用使用的集羣,一般在本地模式下沒有做過配置的話,就是default
namespace就是應用使用的配置namespace,一般是application.

本地緩存路徑,可以根據自身需求進行自定義。自定義方式有多種:

  1. 在application.properties或bootstrap.properties中指定apollo.cacheDir=/opt/data/some-cache-dir。

  2. 在server.properties配置文件中指定apollo.cacheDir=/opt/data/some-cache-dir。
    這裏同樣可以通過指定jvm參數的方式指定,更多自定義方式請參考:
    https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#1231-%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BC%93%E5%AD%98%E8%B7%AF%E5%BE%84

  3. maven依賴
    配置完環境後,需要引入Apollo的client依賴,如下:

<dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.5.0</version>
</dependency>
  1. 客戶端讀取配置方式
    Java客戶端在讀取Apollo配置中心配置時,有多種方式,且多種方式並不衝突,可組合使用。
    3.1 API使用方式
    API方式是最簡單、高效使用Apollo配置的方式,不依賴Spring框架即可使用。
    Config config= ConfigService.getAppConfig();
    config.addChangeListener(new ConfigChangeListener() {
    @Override
    public void onChange(ConfigChangeEvent configChangeEvent) {
    ConfigChange change=configChangeEvent.getChange(key);
    }
    });
    String value=config.getProperty(key,“default”);

上述代碼的作用是,獲取默認的配置NameSpace(application.properties),並設置監聽,最後通過鍵值key獲取配置文件中的值。
注:在獲取Config對象時,可通過ConfigService.getAppConfig();獲取默認的NameSpace(application.properties),也可通過ConfigService.getConfig(configNamespace);來獲取其他NameSpace下的配置信息。
若配置文件的格式不爲properties,則需要寫完整的名稱,如test.yaml。
3.2 Spring整合方式
Apollo也支持和Spring整合(Spring 3.1.1+),只需要做一些簡單的配置.Apollo支持spring的多種整合方式,xml方式,javaconfig方式,springboot方式等,xml方式暫不介紹。
3.2.1 配置
3.2.1.1 Javaconfig整合方式
直接看代碼:

需要注意的點:

  1. @EnableApolloConfig要和@Configuration一起使用,不然不會生效。
  2. @EnableApolloConfig後面可加參數可不加參數,若直接使用@EnableApolloConfig,則會注入默認的Namespace(application.properties).若要注入其他的NameSpace,則需要通過value屬性來指定。若有多個,則用“,”分割。
  3. @EnableApolloConfig可使用order屬性,其值爲整數,最小值爲0.且值越小,優先級越高。
    3.2.1.2 Spring boot整合方式
    在application.properties/bootstrap.properties中進行配置:
  4. 注入默認application namespace的配置示例
    apollo.bootstrap.enabled = true
  5. 注入非默認application namespace或多個namespace的配置示例
    apollo.bootstrap.enabled = true
    apollo.bootstrap.namespaces = application,FX.apollo,application.yml

3.2.2 Spring Placeholder的使用
跟讀取配置文件中的使用方式相同:

@Value("${name:default}")
private String name;

同時,也可以在應用中的配置文件裏,使用placeholder,讀取配置中心的配置信息。
多種方式不做贅述了。有疑問可參考:
https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97#322-spring-placeholder%E7%9A%84%E4%BD%BF%E7%94%A8

3.2.3 Spring Annotation支持
Apollo增加了幾個新的Annotation來簡化在Spring環境中的使用。

  1. @ApolloConfig
    o 用來自動注入Config對象

  2. @ApolloConfigChangeListener
    o 用來自動註冊ConfigChangeListener

  3. @ApolloJsonValue
    o 用來把配置的json字符串自動注入爲對象

然後在configuration類中,將bean注入spring容器即可。

五、 多環境管理
Apollo可支持多個環境的管理和配置,實現步驟如下:

  1. 創建多個環境
    每一個環境需要獨立部署一套Config Service、Admin Service和ApolloConfigDB,所以第一步需要在不同的服務器安裝這些環境。(portal和ApolloPortalDB只需要部署在產品環境)
  2. 將多個環境配置到portal中
    向portal添加環境其實很簡單,只需要修改portal的配置文件就好(apollo-env.properties這裏有多種方式,可以去查看官網文檔,我這裏只寫集羣部署的配置文檔)。配置完成後,服務需要重啓。

這裏指定了不同環境的meta server(即eureka註冊中心,默認爲configsevice的地址),根據你的具體情況作出調整。
3. 客戶端設置
Java客戶端調用時可使用下面方式:
1)在配置文件中添加 env=你的環境。對於Mac/Linux,文件位置爲/opt/settings/server.properties
對於Windows,文件位置爲C:\opt\settings\server.properties(沒有可自己創建)。
2)在你應用的根目錄或者config目錄,添加文件apollo-env.properties,在文件中指定meta server。結合1.2步,就可以修改server.properties時,自動更改配置了。
apollo-env.properties配置如下:

六、 參考文檔及源碼
Apollo分佈式部署指南:
https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97
Java客戶端使用指南:
https://github.com/ctripcorp/apollo/wiki/Java%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97
源碼:
https://github.com/ctripcorp/apollo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章