準備工作
本文假設讀者已經在本地部署Apollo配置中心,如還未部署可參考之前的文章 《Docker部署Apollo配置中心》 文章將引導在Docker中執行Apollo配置中心。在開始使用之前我們們先了解一下Apollo的的一些概念:
應用ID(AppId)
AppId是應用的身份資訊,是從服務端獲取配置的一個重要資訊。Apollo支援三種設定AppId
的方式,按照優先順序從高到低分別為:
- 可以通過Java的System Property apollo.meta來指定
- System Property(系統屬性)
- Spring Boot application.properties(SpringBoot配置)
- app.properties (需放置在classpath:/META-INF/目錄下)
為方便演示,本文采用第3種方案來設定AppId
。
Apollo Meta Server
Apollo支援應用在不同的環境有不同的配置,Apollo Meta Server
可以理解為包含特定環境配置資訊的服務,比如Apollo Meta Server
可以執行在dev
環境下,你的應用同樣也以dev
環境執行那麼獲取到的配置就是dev
環境的配置,稍後我們再來講解環境
與Apollo Meta Server
的使用。從1.0.0版本開始支援以下方式配置apollo meta server資訊,按照優先順序從高到低分別為:
- 使用系統屬性
apollo.meta
- 可以通過Java的System Property
apollo.meta
來指定定 - 在Java程式啟動指令碼中,可以指定-Dapollo.meta=" Apollo Meta Server URL"
- 也可以通過程式指定,如System.setProperty
- 可以通過Java的System Property
- 通過Spring Boot的配置檔案
- 可以在Spring Boot的application.properties或bootstrap.properties中指定
apollo.meta
的值
- 可以在Spring Boot的application.properties或bootstrap.properties中指定
- 通過作業系統的System EnvironmentAPOLLO_META
- 需要注意大小寫敏感的
- 通過server.properties配置檔案
- 可以在server.properties配置檔案中指定apollo.meta=http://config-service-url
- 對於Mac/Linux,檔案位置為/opt/settings/server.properties
- 對於Windows,檔案位置為C:\opt\settings\server.properties
- 通過app.properties配置檔案
- 通過Java system property
${env}_meta
- 通過作業系統的System Environment
${ENV}_META
(1.2.0版本開始支援) - 通過apollo-env.properties檔案
- 使用者也可以建立一個apollo-env.properties,放在程式的classpath下,或者放在spring boot應用的config目錄下
以上配置方式詳細資訊可檢視 官方Wiki 來了解詳細資訊。
環境
搞清楚AppId
與Apollo Meta Server
這兩個概念後,可以再進一步瞭解環境的概念。我們都知道SpringBoot中可以通過spring.profiles.active
來配置應用的配置環境,通過指定不同的環境來使應用執行時產生不同的行為,Apollo中的環境與SpringBoot的中的環境類似,你可以將Apollo部署在dev
環境供開發人員測試,在dev
環境部署Apollo後,然後將Apollo的環境標記
設定為dev
這樣應用在dev
環境執行並且獲取到的配置資訊是相對於dev
環境中的配置。環境可以通過以下3種方式的任意一個配置:
- 可以通過Java的System Property env來指定環境
- 可通過引數-Denv=dev
- 通過作業系統的ENV環境變數指定
- 大小寫敏感
- 通過配置檔案
- 可以在server.properties配置檔案中指定env=YOUR-ENVIRONMENT
Apollo中還支援叢集
、Namespace
相關的概念這裡就不細說了,本文中要使用Apollo配置中心瞭解AppId
、Apollo Meta Server
與環境
就夠了,詳細可檢視 Java客戶端使用指南
使用Apollo配置中心
可以 start.spring.io/ 建立一個SpringBoot工程,這裡我們建立一個ApolloSample
的工程,並引入spring-boot-starter-web
依賴,建立完後開啟工程,然後再來演示Apollo的使用。本文中使用使用的工程及docker-compose.yaml
檔案已經打包上傳到了 Github
, 可訪問 倉庫地址 地址下載本地進行測試。
git clone git@github.com:yjwfn/ApolloSample.git
複製程式碼
配置ApolloSample工程
Maven依賴
首先新增Apollo客戶端的Maven依賴:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.1.0</version>
</dependency>
複製程式碼
ApolloSample應用配置
《Docker部署Apollo配置中心》
已經講解過如何在Dockre中部署,這裡就不在細說了,我們這裡直接在ApolloSample
工程目錄下執行docker-compose up -d apollo-portal
把Apollo的服務啟動起來,這裡要等待大概1分鐘,待服務完全啟動後後開啟 http://localhost:8070訪問管理控制檯
新增應用,應用ID和名稱分別設定為20181228001
和ApolloSample
新增應用完成後,先發布一下應用不然啟動ApolloSample
工程的時候會找不到配置檔案:
然後回到工程專案中在application.properties
中新增以下配置:
app.id=20181228001
apollo.meta=http://apollo-configservice-dev:8080
apollo.bootstrap.enabled = true
複製程式碼
新增測試介面
在工程裡面新增個RestControllre
用於獲取指定的的配置:
package cn.rcntech.ApolloSample.controller;
import com.ctrip.framework.apollo.ConfigService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(path = "/configurations")
public class ApolloConfigurationController {
@RequestMapping(path = "/{key}")
public String getConfigForKey(@PathVariable("key") String key){
return ConfigService.getAppConfig().getProperty(key, "undefined");
}
}
複製程式碼
釋出到Docker
由於Apollo是在Docker中執行的,為了方便測試同樣也將ApolloSample
打包釋出到Docker裡面執行。
製作Docker映象
由於使用的Docker所以需要安裝下Docker的 Maven外掛:
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>v1.4.9</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>apollo/apollo-sample</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
複製程式碼
然後再新增一個Dockerfile在工程的根目錄下:
FROM openjdk:8-jre
ARG JAR_FILE
RUN mkdir /apollo-sample
ADD target/$JAR_FILE /apollo-sample/app.jar
ENTRYPOINT ["java", "-jar", "/apollo-sample/app.jar"]
複製程式碼
開啟終端進入到工程目錄下執行命令,將工程打包成Docker映象:
./mvnw package -DskipTests
複製程式碼
啟動ApolloSample
打包完成後apollo/apollo-sample
映象就製作完成了,可以使用docker images
檢視映象。注意我們的Apollo服務也是執行在Docker中的,工程容器需要能夠訪問Apollo Meta Server
推薦使用dockere-compose
部署:
vresion: 3
srevices:
... #其他服務
apollo-sample-dev:
image: apollo/apollo-sample:0.0.1-SNAPSHOT
environment:
ENV: dev
ports:
- 8090:8080
depends_on:
- apollo-configservice-dev
複製程式碼
使用docker-compose
啟動時需要docker-compose.yaml
檔案,本文使用的docker-compose.yaml
檔案已經包含在git倉庫中了,只需要在倉庫根目錄執行docker-compose up -d
即可,執行命令後檢視是否啟動成功可通過docker logs <容器名稱>
檢視啟動日誌,啟動成功後部分日誌如下:
2018-12-29 00:50:34.092 INFO 1 --- [ main] c.c.f.f.i.p.DefaultApplicationProvider : App ID is set to 20181228001 by app.id property from System Property
2018-12-29 00:50:34.099 INFO 1 --- [ main] c.c.f.f.i.p.DefaultServerProvider : Environment is set to [dev] by OS env variable 'ENV'.
2018-12-29 00:50:34.184 INFO 1 --- [ main] c.c.f.a.i.DefaultMetaServerProvider : Located meta services from apollo.meta configuration: http://apollo-configservice-dev:8080!
2018-12-29 00:50:34.198 INFO 1 --- [ main] c.c.f.apollo.core.MetaDomainConsts : Located meta server address http://apollo-configservice-dev:8080 for env DEV from com.ctrip.framework.apollo.internals.DefaultMetaServerProvider
2018-12-29 00:50:34.413 INFO 1 --- [ main] c.r.A.ApolloSampleApplication : Starting ApolloSampleApplication v0.0.1-SNAPSHOT on 937733c90b79 with PID 1 (/apollo-sample/app.jar started by root in /)
2
複製程式碼
回到管理控制中心
可以檢視已註冊的例項:
測試配置
啟動ApolloSample
工程後我們可以訪問 http://localhost:8090/configurations/welcome檢視welcome
中的值,因為我們沒有沒配置所以預設會輸出undefined
。
現在往Apollo配置中心新增鍵為welcome
的配置:
點選釋出
然後再獲取下welcome
的值可以看到值已經實時更新了:
現在Apllo配置中心已經集並測試成功,測試就暫時測試到這裡後面再來探索更多的高階成功。
總結
因為官方文件很全,這次測試SpringBoot整合總的來說挺順利,後續會再深入瞭解些Apollo配置中心的知識,比如多環境
、多叢集
、Namespace
等知識。