1. 程式人生 > >分散式配置中心——攜程Apollo(阿波羅)的實現

分散式配置中心——攜程Apollo(阿波羅)的實現

    分散式配置中心有很多,springcloud的config、百度的disconfig、攜程的apollo、淘寶的diamond。由於攜程的apollo極少的侵入性,以及面對springcloud開發,所以專案技術選型最終定為apollo。

一、攜程apollo優點:

    ①支援配置熱更新,而且不需要想springcloud那樣需要訊息匯流排來回調通知。

    ②對於接入專案,只需要引client包和@EnableApolloConfig註解即可

    ③與spring整合,在0.10.0之後支援 ${} 格式直接獲取資料,並支援熱更新

    缺點:1、官方文件經過版本迭代很多贅述地方 2、環境被限定為dev、uat、fat、pro,不能自定義

二、apollo術語:

    友情提示:portal、admin、client都只需用同一個即可,但是apollo-configservice要不同環境生成不同的(不同環境資料庫連線資訊不同)。其實也可以通過引數來設定,詳細的去看官網。本人是不同環境打不同的包。

    ①portal:視覺化頁面模組,進行配置檔案的實際操作。

    ②meta server:攜程寫的一個介面,記錄apollo-configservice地址

    ③apollo-configservice:提供獲取配置資訊介面

    ④apollo-client:給專案引用的包,該包還依賴buildtools、core等包,core裡包含meta server資訊。

    ⑤apollo-admin:portal的服務端。

三、安裝:

    ①下載檔案,官網地址:https://github.com/ctripcorp/apollo

    ②執行scripts/sql下的2個sql

    ③修改表:ApolloPortalDB/ServerConfig 修改成apollo-configservice(內嵌eureka)的地址,或者填寫自己的eureka地址

                   ApolloConfigDB/ServerConfig 修改你要整合的環境,可填dev、uat、fat、pro(以逗號分隔)

    ④修改包:

        1、如果第③部你用了自己的eureka 那麼把configuration專案啟動類的@enableeurekaserver改為@enableeurekaclient,記得import裡也要改!如果不用自己的此步跳過。

  1. package com.ctrip.framework.apollo.configservice;
  2. import com.ctrip.framework.apollo.biz.ApolloBizConfig;
  3. import com.ctrip.framework.apollo.common.ApolloCommonConfig;
  4. import com.ctrip.framework.apollo.metaservice.ApolloMetaServiceConfig;
  5. import org.springframework.boot.actuate.system.ApplicationPidFileWriter;
  6. import org.springframework.boot.actuate.system.EmbeddedServerPortFileWriter;
  7. import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
  8. import org.springframework.boot.builder.SpringApplicationBuilder;
  9. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  10. import org.springframework.context.ConfigurableApplicationContext;
  11. import org.springframework.context.annotation.ComponentScan;
  12. import org.springframework.context.annotation.Configuration;
  13. import org.springframework.context.annotation.EnableAspectJAutoProxy;
  14. import org.springframework.context.annotation.PropertySource;
  15. import org.springframework.transaction.annotation.EnableTransactionManagement;
  16. @EnableEurekaClient
  17. @EnableAspectJAutoProxy
  18. @EnableAutoConfiguration // (exclude = EurekaClientConfigBean.class)
  19. @Configuration
  20. @EnableTransactionManagement
  21. @PropertySource(value = {"classpath:configservice.properties"})
  22. @ComponentScan(basePackageClasses = {ApolloCommonConfig.class,
  23. ApolloBizConfig.class,
  24. ConfigServiceApplication.class,
  25. ApolloMetaServiceConfig.class})
  26. public class ConfigServiceApplication {

        2、修改scripts/build.sh裡apollo_config和apollo_portal資料庫資訊、meta_server的url以及META_SERVERS_OPTS。就是由於這一步才需要不同環境打不同的包。

        3、修改apollo-configservice的application.ym。加上eureka.instance.homePageUrl=http://你的外網IP:埠。除了此方法官網還提供另外3種忽略網絡卡的方式。注意:這行配置可以不修改原始碼,在後來的apollo-configservice的start.sh里加做啟動引數也可以!

        4、如果有maven私庫的deploy許可權,把mvn clean install 改為mvn clean deploy,並新增setting.xml,官網上有例子。如果沒有許可權,則跳過這一步,下面有手動上傳的方法。

        5、執行編譯打包:./build.sh(第一次會去拉取很多包,所以要比較久時間)

    ⑤修改啟動指令碼start.sh(這一步如果是想用docker執行的話就跳過!)

        在編譯打包結束後,在每個模組下都出現一個target。target裡頭有一個XXX-github.zip檔案,解壓開後,在scripts下有start.sh。

        要解壓3個包:apollo-configservice、apollo-adminservice、apollo-portal

        修改start.sh的server_port和server_url

    ⑥啟動專案:

        如果你要直接執行,./start.sh即可。這裡主要講解docker形式啟動。

        1、下載dockerfile,地址https://github.com/kulovecc/docker-apollo.git           

        2、修改各個部分的dockerfile。主要就是埠和路徑。

        3、按dockerfile裡的docker build生成映象,docker run生成容器        

    ⑦手動上傳apollo-client包:

        進入你的本地倉庫,預設地址為:~/.m2/repository/com/ctrip/framework/apollo/

        下面有4個包,將每一個包的jar包和pom檔案都上傳到私庫。並且包名和格式都和本地倉庫一樣就可以了。

四、portal使用中重要概念

    ①namespace:每一個應用都有一個預設的application.properties私有namespace(apollo只支援properties),私有的只允許該應用可見,還可以建立共有的,共有的namespace可以其他應用共享。順便說一點公共的namespace可以被覆蓋。

    ②叢集:這裡的叢集的指的是,同一環境可以建立多個叢集,不同叢集可以有不同配置。

五、專案中引用:

    ①引私庫裡apollo-client包。

    ②@EnableApolloConfig({“application”,”DEPT1.eureka.client.serviceUrl”,”DEPT1.hikari.HikariDataSource”}) 

application,為該AppId在配置中心的預設私有名稱空間,裡面存放該AppId自有的配置屬性。(預設自帶的名稱空間,但是若指定了其他名稱空間,application也需要寫上) 

    ③啟動引數加上 -Denv=環境 -Dapp.id=你的應用名

到此,結束!

六、

Apollo提供了一套的Http REST介面,使第三方應用能夠自己管理配置。雖然Apollo系統本身提供了Portal來管理配置,但是在有些情景下,應用需要通過程式去管理配置