SpringBoot整合Apollo配置中心

驚天霸戈發表於2018-12-29

準備工作

本文假設讀者已經在本地部署Apollo配置中心,如還未部署可參考之前的文章 《Docker部署Apollo配置中心》 文章將引導在Docker中執行Apollo配置中心。在開始使用之前我們們先了解一下Apollo的的一些概念:

應用ID(AppId)

AppId是應用的身份資訊,是從服務端獲取配置的一個重要資訊。Apollo支援三種設定AppId的方式,按照優先順序從高到低分別為:

  1. 可以通過Java的System Property apollo.meta來指定
  2. System Property(系統屬性)
  3. Spring Boot application.properties(SpringBoot配置)
  4. 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資訊,按照優先順序從高到低分別為:

  1. 使用系統屬性 apollo.meta
    • 可以通過Java的System Property apollo.meta來指定定
    • 在Java程式啟動指令碼中,可以指定-Dapollo.meta=" Apollo Meta Server URL"
    • 也可以通過程式指定,如System.setProperty
  2. 通過Spring Boot的配置檔案
    • 可以在Spring Boot的application.properties或bootstrap.properties中指定apollo.meta的值
  3. 通過作業系統的System EnvironmentAPOLLO_META
    • 需要注意大小寫敏感的
  4. 通過server.properties配置檔案
    • 可以在server.properties配置檔案中指定apollo.meta=http://config-service-url
    • 對於Mac/Linux,檔案位置為/opt/settings/server.properties
    • 對於Windows,檔案位置為C:\opt\settings\server.properties
  5. 通過app.properties配置檔案
  6. 通過Java system property ${env}_meta
  7. 通過作業系統的System Environment${ENV}_META(1.2.0版本開始支援)
  8. 通過apollo-env.properties檔案
    • 使用者也可以建立一個apollo-env.properties,放在程式的classpath下,或者放在spring boot應用的config目錄下

以上配置方式詳細資訊可檢視 官方Wiki 來了解詳細資訊。

環境

搞清楚AppIdApollo Meta Server這兩個概念後,可以再進一步瞭解環境的概念。我們都知道SpringBoot中可以通過spring.profiles.active來配置應用的配置環境,通過指定不同的環境來使應用執行時產生不同的行為,Apollo中的環境與SpringBoot的中的環境類似,你可以將Apollo部署在dev環境供開發人員測試,在dev環境部署Apollo後,然後將Apollo的環境標記設定為dev這樣應用在dev環境執行並且獲取到的配置資訊是相對於dev環境中的配置。環境可以通過以下3種方式的任意一個配置:

  1. 可以通過Java的System Property env來指定環境
    • 可通過引數-Denv=dev
  2. 通過作業系統的ENV環境變數指定
    • 大小寫敏感
  3. 通過配置檔案
    • 可以在server.properties配置檔案中指定env=YOUR-ENVIRONMENT

Apollo中還支援叢集Namespace相關的概念這裡就不細說了,本文中要使用Apollo配置中心瞭解AppIdApollo 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和名稱分別設定為20181228001ApolloSample新增應用完成後,先發布一下應用不然啟動ApolloSample工程的時候會找不到配置檔案:

SpringBoot整合Apollo配置中心

然後回到工程專案中在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
複製程式碼

回到管理控制中心可以檢視已註冊的例項:

SpringBoot整合Apollo配置中心

測試配置

啟動ApolloSample工程後我們可以訪問 http://localhost:8090/configurations/welcome檢視welcome中的值,因為我們沒有沒配置所以預設會輸出undefined

SpringBoot整合Apollo配置中心

現在往Apollo配置中心新增鍵為welcome的配置:

SpringBoot整合Apollo配置中心

點選釋出然後再獲取下welcome的值可以看到值已經實時更新了:

SpringBoot整合Apollo配置中心

現在Apllo配置中心已經集並測試成功,測試就暫時測試到這裡後面再來探索更多的高階成功。

總結

因為官方文件很全,這次測試SpringBoot整合總的來說挺順利,後續會再深入瞭解些Apollo配置中心的知識,比如多環境多叢集Namespace等知識。

相關文章