SpringBoot 集成 Apollo 配置中心

目錄css

. 1、基本概念java

. 一、背景node

. 二、簡介mysql

. 三、特色git

. 四、基礎模型github

. 五、Apollo 的四個維度web

. 六、本地緩存spring

. 七、客戶端設計sql

. 八、整體設計docker

. 九、可用性考慮

. 2、Apollo 配置中心建立項目與配置

. 一、登陸 Apollo

. 二、修改與增長部門數據

. 三、建立一個項目

. 四、建立一個配置參數

. 3、建立 Apollo 客戶端測試項目

. 一、Mavne 添加 Apollo 依賴

. 二、配置文件添加參數

. 三、建立測試 Controller 類

. 四、建立啓動類

. 五、JVM 啓動參數添加啓動參數

. 4、啓動項目進行測試

. 一、測試是否可以獲取 Apollo 中設置的值

. 二、測試當 Apollo 中修改參數值後客戶端是否能及時刷新

. 三、測試當 Apollo 執行配置回滾操做時客戶端是否能及時改變

. 四、測試當不能訪問 Apollo 時客戶端的變化

. 五、測試當 Apollo 中將參數刪除後客戶端的變化

. 5、對 Apollo 的 Cluster、Namespace 進行探究

. 一、不一樣環境下的配置

. 二、不一樣集羣下的配置

. 三、不一樣命名空間下的配置

. 6、Kubernetes 的 SpringBoot 應用使用 Apollo 配置中心

. 一、構建 Docker 鏡像

. 二、Kubernetes 部署示例應用

. 三、測試部署的應用接口

目錄

  • 1、Kubernetes 部署配置中心 Apollo

  • 2、SpringBoot 集成 Apollo 配置中心

系統環境

  • SpringBoot 版本:2.1.8.RELEASE

  • Apollo 版本:1.4.0

參考地址

  • Apollo 文檔知識

  • Apollo Github 地址

  • SpringBoto 集成 Apollo 示例項目 Github 地址:https://github.com/my-dlq/blog-example/tree/master/springboot/springboot-apollo-demo

1、基本概念

因爲 Apollo 概念比較多,剛開始使用比較複雜,最好先過一遍概念再動手實踐嘗試使用。

一、背景

隨着程序功能的日益複雜,程序的配置日益增多,各類功能的開關、參數的配置、服務器的地址……對程序配置的指望值也愈來愈高,配置修改後實時生效,灰度發佈,分環境、分集羣管理配置,完善的權限、審覈機制…… 在這樣的大環境下,傳統的經過配置文件、數據庫等方式已經愈來愈沒法知足開發人員對配置管理的需求。所以 Apollo 配置中心應運而生!

二、簡介

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

特色

  • 部署簡單

  • 灰度發佈

  • 版本發佈管理

  • 提供開放平臺API

  • 客戶端配置信息監控

  • 提供Java和.Net原生客戶端

  • 配置修改實時生效(熱發佈)

  • 權限管理、發佈審覈、操做審計

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

基礎模型

以下便是 Apollo 的基礎模型:

(1)、用戶在配置中心對配置進行修改併發布

(2)、配置中心通知Apollo客戶端有配置更新

(3)、Apollo客戶端從配置中心拉取最新的配置、更新本地配置並通知到應用

五、Apollo 的四個維度

Apollo支持4個維度管理Key-Value格式的配置:

  • application (應用)

  • environment (環境)

  • cluster (集羣)

  • namespace (命名空間)

(1)、application

  • Apollo 客戶端在運行時須要知道當前應用是誰,從而能夠根據不一樣的應用來獲取對應應用的配置。

  • 每一個應用都須要有惟一的身份標識,能夠在代碼中配置 app.id 參數來標識當前應用,Apollo 會根據此指來辨別當前應用。

(2)、environment

在實際開發中,咱們的應用常常要部署在不一樣的環境中,通常狀況下分爲開發、測試、生產等等不一樣環境,不一樣環境中的配置也是不一樣的,在 Apollo 中默認提供了四種環境:

  • FAT(Feature Acceptance Test):功能測試環境

  • UAT(User Acceptance Test):集成測試環境

  • DEV(Develop):開發環境

  • PRO(Produce):生產環境

在程序中若是想指定使用哪一個環境,能夠配置變量 env 的值爲對應環境名稱便可。

(3)、cluster

  • 一個應用下不一樣實例的分組,好比典型的能夠按照數據中心分,把上海機房的應用實例分爲一個集羣,把北京機房的應用實例分爲另外一個集羣。

  • 對不一樣的集羣,同一個配置能夠有不同的值,好比說上面所指的兩個北京、上海兩個機房設置兩個集羣,兩個集羣中都有 mysql 配置參數,其中參數中配置的地址是不同的。

(4)、namespace

一個應用中不一樣配置的分組,能夠簡單地把 namespace 類比爲不一樣的配置文件,不一樣類型的配置存放在不一樣的文件中,如數據庫配置文件,RPC 配置文件,應用自身的配置文件等。

熟悉 SpringBoot 的都知道,SpringBoot 項目都有一個默認配置文件 application.yml,若是還想用多個配置,能夠建立多個配置文件來存放不一樣的配置信息,經過指定 spring.profiles.active 參數指定應用不一樣的配置文件。這裏的 namespace 概念與其相似,將不一樣的配置放到不一樣的配置 namespace 中。

Namespace 分爲兩種權限,分別爲:

  • public(公共的): public權限的 Namespace,能被任何應用獲取。

  • private(私有的): 只能被所屬的應用獲取到。一個應用嘗試獲取其它應用 private 的 Namespace,Apollo 會報 「404」 異常。

Namespace 分爲三種類型,分別爲:

  • 私有類型: 私有類型的 Namespace 具備 private 權限。例如 application Namespace 爲私有類型。

  • 公共類型: 公共類型的 Namespace 具備 public 權限。公共類型的N amespace 至關於遊離於應用以外的配置,且經過 Namespace 的名稱去標識公共 Namespace,因此公共的 Namespace 的名稱必須全局惟一。

  • 關聯類型(繼承類型): 關聯類型又可稱爲繼承類型,關聯類型具備 private 權限。關聯類型的 Namespace 繼承於公共類型的 Namespace,將裏面的配置所有繼承,而且能夠用於覆蓋公共 Namespace 的某些配置。

  • 繼承,而且能夠用於覆蓋公共 Namespace 的某些配置。

六、本地緩存

Apollo客戶端會把從服務端獲取到的配置在本地文件系統緩存一份,用於在遇到服務不可用,或網絡不通的時候,依然能從本地恢復配置,不影響應用正常運行。

本地緩存路徑默認位於如下路徑,因此請確保/opt/data或C:\opt\data\目錄存在,且應用有讀寫權限。

  • Mac/Linux: /opt/data/{appId}/config-cache

  • Windows: C:\opt\data{appId}\config-cache

本地配置文件會如下面的文件名格式放置於本地緩存路徑下:

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

七、客戶端設計

上圖簡要描述了Apollo客戶端的實現原理

  • 客戶端和服務端保持了一個長鏈接,從而能第一時間得到配置更新的推送。

  • 客戶端還會定時從 Apollo 配置中心服務端拉取應用的最新配置。

  • 這是一個 fallback 機制,爲了防止推送機制失效致使配置不更新

  • 客戶端定時拉取會上報本地版本,因此通常狀況下,對於定時拉取的操做,服務端都會返回 304 - Not Modified

  • 定時頻率默認爲每 5 分鐘拉取一次,客戶端也能夠經過在運行時指定 apollo.refreshInterval 來覆蓋,單位爲分鐘。

  • 客戶端從 Apollo 配置中心服務端獲取到應用的最新配置後,會保存在內存中。

  • 客戶端會把從服務端獲取到的配置在本地文件系統緩存一份 在遇到服務不可用,或網絡不通的時候,依然能從本地恢復配置。

  • 應用程序從 Apollo 客戶端獲取最新的配置、訂閱配置更新通知。

配置更新推送實現

前面提到了 Apollo 客戶端和服務端保持了一個長鏈接,從而能第一時間得到配置更新的推送。長鏈接實際上咱們是經過 Http Long Polling 實現的,具體而言:

  • 客戶端發起一個 Http 請求到服務端

  • 服務端會保持住這個鏈接 60 秒

  • 若是在 60 秒內有客戶端關心的配置變化,被保持住的客戶端請求會當即返回,並告知客戶端有配置變化的 namespace 信息,客戶端會據此拉取對應 namespace 的最新配置

  • 若是在 60 秒內沒有客戶端關心的配置變化,那麼會返回 Http 狀態碼 304 給客戶端

  • 客戶端在收到服務端請求後會當即從新發起鏈接,回到第一步

  • 考慮到會有數萬客戶端向服務端發起長連,在服務端咱們使用了 async servlet(Spring DeferredResult) 來服務 Http Long Polling 請求。

八、整體設計

 

上圖簡要描述了Apollo的整體設計,咱們能夠從下往上看:

  • Config Service 提供配置的讀取、推送等功能,服務對象是 Apollo 客戶端

  • Admin Service 提供配置的修改、發佈等功能,服務對象是 Apollo Portal(管理界面)

  • Config Service 和 Admin Service 都是多實例、無狀態部署,因此須要將本身註冊到 Eureka 中並保持心跳

  • 在 Eureka 之上咱們架了一層 Meta Server 用於封裝Eureka的服務發現接口

  • Client 經過域名訪問 Meta Server 獲取Config Service服務列表(IP+Port),然後直接經過 IP+Port 訪問服務,同時在 Client 側會作 load balance 錯誤重試

  • Portal 經過域名訪問 Meta Server 獲取 Admin Service 服務列表(IP+Port),然後直接經過 IP+Port 訪問服務,同時在 Portal 側會作 load balance、錯誤重試

  • 爲了簡化部署,咱們實際上會把 Config Service、Eureka 和 Meta Server 三個邏輯角色部署在同一個 JVM 進程中

九、可用性考慮

配置中心做爲基礎服務,可用性要求很是高,下面的表格描述了不一樣場景下Apollo的可用性:

場景 影響 降級 緣由
某臺 config service 下線 無影響   Config service無狀態,客戶端重連其它config service
全部 config service 下線 客戶端沒法讀取最新配置,Portal無影響 客戶端重啓時,能夠讀取本地緩存配置文件  
某臺 admin service 下線 無影響   Admin service無狀態,Portal重連其它 admin service
全部 admin service 下線 客戶端無影響,portal沒法更新配置    
某臺 portal 下線 無影響   Portal域名經過slb綁定多臺服務器,重試後指向可用的服務器
所有 portal 下線 客戶端無影響,portal沒法更新配置    
某個數據中心下線 無影響   多數據中心部署,數據徹底同步,Meta Server/Portal 域名經過 slb 自動切換到其它存活的數據中心

2、Apollo 配置中心建立項目與配置

接下來咱們將建立一個 Apollo 的客戶端項目,引用 Apollo 來實現配置動態更新,不過在此以前咱們須要提早進入 Apollo Portal 界面,在裏面提早建立一個項目並在其配置一個參數,方便後續客戶端引入該配置參數,測試是否能動態變化。

一、登陸 Apollo

我這裏是部署到 Kubernetes 中,經過 NodePort 方式暴露出一個端口,打開這個地址登陸 Apollo:

  • 用戶名:apollo

  • 密 碼:admin

二、修改與增長部門數據

在登陸後建立項目時,選擇部門默認只能選擇 Apollo 自帶的 測試部門1與測試部門2兩個選項。

開始這真讓人迷糊,原來 Apoloo 沒有修改或新增部門信息的管理節目,只能經過修改數據庫,來新增或者修改數據,這裏打開 Portal 對月的數據庫中的表 ApolloPortalDB 修改 key 爲 organizations 的 value 的 json 數據,改爲本身對於的部門信息。

                   

三、建立一個項目

修改完數據庫部門信息後,從新登陸 Apollo Portal,而後建立項目,這時候選擇部門能夠看到已經變成咱們本身修改後的部門信息了,選擇咱們自定義部門,而後設置應用 ID 爲 apollo-test,應用名爲 apollo-demo 。

建立完成後進入配置管理界面

四、建立一個配置參數

建立一個配置參數,方便後續 Apollo 客戶端項目引入該參數,進行動態配置測試。

設置 key 爲 test value 爲 123456 而後設置一個備註,保存。

建立完成後能夠看到配置管理節目新增了一條配置。

接下來咱們將此配置經過發佈按鈕,進行發佈。

3、建立 Apollo 客戶端測試項目

這裏建立一個 SpringBoot 項目,引入 Apollo 客戶端來來實現與 Apollo 配置中心服務端交互。

一、Maven 添加 Apollo 依賴

 1
2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4    <modelVersion>4.0.0</modelVersion>
5
6    <parent>
7        <groupId>org.springframework.boot</groupId>
8        <artifactId>spring-boot-starter-parent</artifactId>
9        <version>2.1.8.RELEASE</version>
10    </parent>
11
12    <groupId>club.mydlq</groupId>
13    <artifactId>apollo-demo</artifactId>
14    <version>0.0.1</version>
15    <name>apollo-demo</name>
16    <description>Apollo Demo</description>
17
18    <properties>
19        <java.version>1.8</java.version>
20    </properties>
21
22    <dependencies>
23        <dependency>
24            <groupId>org.springframework.boot</groupId>
25            <artifactId>spring-boot-starter-web</artifactId>
26        </dependency>
27        <dependency>
28            <groupId>com.ctrip.framework.apollo</groupId>
29            <artifactId>apollo-client</artifactId>
30            <version>1.4.0</version>
31        </dependency>
32    </dependencies>
33
34    <build>
35        <plugins>
36            <plugin>
37                <groupId>org.springframework.boot</groupId>
38                <artifactId>spring-boot-maven-plugin</artifactId>
39            </plugin>
40        </plugins>
41    </build>
</project>

二、配置文件添加參數

在 application.yml 配置文件中添加下面參數,這裏簡單介紹下 Apollo 參數做用:

  • apollo.meta: Apollo 配置中心地址。

  • apollo.cluster: 指定使用某個集羣下的配置。

  • apollo.bootstrap.enabled: 是否開啓 Apollo。

  • apollo.bootstrap.namespaces : 指定使用哪一個 Namespace 的配置,默認 application。

  • apollo.cacheDir=/opt/data/some-cache-dir: 爲了防止配置中心沒法鏈接等問題,Apollo 會自動將配置本地緩存一份。

  • apollo.autoUpdateInjectedSpringProperties: Spring應用一般會使用 Placeholder 來注入配置,如${someKey:someDefaultValue},冒號前面的是 key,冒號後面的是默認值。若是想關閉 placeholder 在運行時自動更新功能,能夠設置爲 false。

  • apollo.bootstrap.eagerLoad.enabled : 將 Apollo 加載提到初始化日誌系統以前,若是設置爲 false,那麼將打印出 Apollo 的日誌信息,可是因爲打印 Apollo 日誌信息須要日誌先啓動,啓動後沒法對日誌配置進行修改,因此 Apollo 不能管理應用的日誌配置,若是設置爲 true,那麼 Apollo 能夠管理日誌的配置,可是不能打印出 Apollo 的日誌信息。

 1#應用配置
2server:
3  port: 8080
4spring:
5  application:
6    name: apollo-demo
7
8#Apollo 配置
9app:
10  id: apollo-test                            #應用ID
11apollo:
12  cacheDir: /opt/data/                       #配置本地配置緩存目錄
13  cluster: default                           #指定使用哪一個集羣的配置
14  meta: http://192.168.2.11:30002            #DEV環境配置中心地址
15  autoUpdateInjectedSpringProperties: true   #是否開啓 Spring 參數自動更新
16  bootstrap:                                
17    enabled: true                            #是否開啓 Apollo
18    namespaces: application                  #設置 Namespace
19    eagerLoad:
20      enabled: false                         #將 Apollo 加載提到初始化日誌系統以前

三、建立測試 Controller 類

寫一個 Controller 類來輸出 test 變量的值,使用了 Spring 的 @Value 註解,用於讀取配置文件中的變量的值,這裏來測試該值,項目啓動後讀取到的變量的值是設置在 application 配置文件中的默認值,仍是遠程 Apollo 中的值,若是是 Apollo 中配置的值,那麼再測試在 Apollo 配置中心中改變該變量的值後,這裏是否會產生變化。

 1import org.springframework.beans.factory.annotation.Value;
2import org.springframework.web.bind.annotation.GetMapping;
3import org.springframework.web.bind.annotation.RestController;
4
5@RestController
6public class TestController {
7
8    @Value("${test:默認值}")
9    private String test;
10
11    @GetMapping("/test")
12    public String test(){
13        return "test的值爲:" + test;
14    }
15}

四、建立啓動類

SpringBoot 項目啓動類。

 1import org.springframework.boot.SpringApplication;
2import org.springframework.boot.autoconfigure.SpringBootApplication;
3
4@SpringBootApplication
5public class Application {
6
7    public static void main(String[] args) {
8        SpringApplication.run(Application.class, args);
9    }
10
11}

五、JVM 啓動參數添加啓動參數

因爲本人的 Apollo 是部署在 Kubernetes 環境中的,JVM 參數中必須添加兩個變量:

  • env: 應用使用 Apollo 哪一個環境,例如設置爲 DEV 就是指定使用開發環境,若是設置爲 PRO 就是制定使用生產環境。

     

  • apollo.configService: 指定配置中心的地址,跳過 meta 的配置,在測試時指定 meta 地址無效果。若是 Apollo 是部署在 Kubernetes 中,則必須設置該參數爲配置中心地址,若是 Apollo 不是在 Kubernetes 環境中,能夠不設置此參數,只設置 meta 參數便可。通常狀況下,configService 和 meta 值一致。

若是是在 Idea 中啓動,能夠配置啓動參數,加上:

1-Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV

若是是 java 命令啓動程序,須要 JVM 加上:

1$ java -Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV -jar apollo-demo.jar

注意:上面 env 指定的環境,要和 apollo.meta 指定 Config 地址的環境一致,例如 -Denv=DEV 即便用開發環境,那麼 apollo.meta=http://xxx.xxx.xxx:8080 這個url 的 Config 也是開發環境下的配置中心服務,而不能是 PRO 或者其它環境下的配置中心。

4、啓動項目進行測試

一、測試是否可以獲取 Apollo 中設置的值

啓動上面的測試用例,而後輸入地址 http://localhost:8080/test 查看:

1test的值爲:123456

能夠看到使用的是 Apollo 中配置的 test 參數的值 123456,而不是默認的值。

二、測試當 Apollo 中修改參數值後客戶端是否能及時刷新

修改 Apollo 配置中心參數 test 值爲 666666 ,而後再次發佈。

發佈完成後再次輸入地址 http://localhost:8080/test 查看:

1test的值爲:666666

能夠看到示例應用中的值已經改變爲最新的值。

三、測試當 Apollo 執行配置回滾操做時客戶端是否能及時改變

回滾完成後狀態將變爲未發佈狀態,則時候輸入地址 http://localhost:8080/test 查看:

1test的值爲:123456

能夠看到已經回滾到以前的 test 配置的值了。

四、測試當不能訪問 Apollo 時客戶端的變化

這裏咱們將 JVM 參數中 Apollo 配置中心地址故意改錯:

1-Dapollo.configService=http://192.168.2.100:30002 -Denv=DEV

而後輸入地址 http://localhost:8080/test 能夠看到值爲:

1test的值爲:123456

能夠看到顯示的值並非咱們定義的默認值,而仍是 Apollo 配置中心配置的 test 參數的值。考慮到因爲 Apollo 會在本地將配置緩存一份,出現上面緣由,估計是緩存生效。當客戶端不能鏈接到 Apollo 配置中心時候,默認使用本地緩存文件中的配置。

上面咱們配置了本地緩存配置文件存放地址爲 「/opt/data/」 ,接下來進入緩存目錄,找到對應的緩存配置文件,刪除緩存配置文件後,重啓應用,再次輸入地址查看:

1test的值爲:默認值

刪除緩存配置文件後,能夠看到輸出的值爲本身定義的默認值。

五、測試當 Apollo 中將參數刪除後客戶端的變化

這裏咱們進入 Apollo 配置中心,刪除以前建立的 test 參數,而後發佈。

而後再次打開地址 http://localhost:8080/test 查看:

1test的值爲:默認值

能夠看到顯示的是應用程序中設置的默認值。

5、對 Apollo 的 Cluster、Namespace 進行探究

在 Apollo 中,配置能夠根據不一樣的環境劃分爲 Dev(開發)、Prod(生產) 等環境,又能根據區域劃分爲不一樣的 Cluster(集羣),還能根據配置參數做用功能的不一樣劃分爲不一樣的 Namespace(命名空間),這裏探究下,如何使用上述能力。

一、不一樣環境下的配置

(1)、Apollo 配置中心 PRO 環境添加參數

打開 Apollo 配置中心,環境列表點擊 PRO 環境,而後新增一條配置,和以前例子中參數保持一致,都爲 test 參數,建立完成後發佈。

而後修改上面的示例項目,將配置參數指定爲 PRO 環境:

(2)、示例項目修改 application.yml 配置文件

把 apollo.meta 參數改爲 RPO 的配置中心地址

1......
2
3apollo:
4  meta: http://192.168.2.11:30005            #RPO環境配置中心地址
5
6......

(3)、示例項目修改 JVM 參數

把 apollo.configService 參數改爲 PRO 配置中心地址,env 參數的值改成 PRO

1-Dapollo.configService=http://192.168.2.11:30005 -Denv=PRO

(4)、啓動示例項目觀察結果

啓動示例項目,而後接着輸入地址 http://localhost:8080/test 查看信息:

1test的值爲:abcdefg

能夠看到已經改爲生成環境配置,因此在實際項目中,若是要更換環境,須要修改 JVM 參數 env(若是 Apollo 部署在 Kubernetes 環境中,還須要修改 apollo.configService 參數),和修改 application.yml 配置文件的參數 apollo.meta 值。

二、不一樣集羣下的配置

(1)、建立兩個集羣

例如在開發過程當中,常常要將應用部署到不一樣的機房,這裏分別建立 beijingshanghai 兩個集羣。

(2)、兩個集羣都配置一樣的參數不一樣的值

在兩個集羣 beijing 與 shanghai 中,都統一配置參數 test,而且設置不一樣的值。

(3)、示例項目 application.yml 修改集羣配置參數,並啓動項目觀察結果

指定集羣爲 beijing:

1......
2
3apollo:
4  cluster: beijing                      #指定使用 beijing 集羣
5
6......

啓動示例項目,而後接着輸入地址 http://localhost:8080/test 查看信息:

1test的值爲:Cluster-BeiJing

能夠看到用的是 beijing 集羣的配置

指定集羣爲 shanghai:

1......
2
3apollo:
4  cluster: shanghai                      #指定使用 shanghai 集羣
5
6......

啓動示例項目,而後接着輸入地址 http://localhost:8080/test 查看信息:

1test的值爲:Cluster-ShangHai

能夠看到用的是 shanghai 集羣的配置

三、不一樣命名空間下的配置

(1)、建立兩個命名空間

命名空間有兩種,一種是 public(公開),一種是 private 私有,公開命名空間全部項目都能讀取配置信息,而私有的只能 app.id 值屬於該應用的才能讀取配置。

這裏建立 dev-1 與 dev-2 兩個私有的命名空間,用於測試。

(2)、兩個集羣都配置一樣的參數不一樣的值

在兩個命名空間中,都統一配置參數 test,而且設置不一樣的值,設置完後發佈。

(3)、示例項目 application.yml 修改命名空間配置參數,並啓動項目觀察結果

指定命名空間爲 dev-1:

1......
2
3apollo:
4  bootstrap:
5    namespaces: dev-1                   #設置 dev-1 命名空間
6
7......

啓動示例項目,而後接着輸入地址 http://localhost:8080/test 查看信息:

1test的值爲:dev-1 Namespace

能夠看到用的是 dev-1 命名空間的配置

指定命名空間爲 dev-2:

1......
2
3apollo:
4  bootstrap:
5    namespaces: dev-2                   #設置 dev-1 命名空間
6
7......

啓動示例項目,而後接着輸入地址 http://localhost:8080/test 查看信息:

1test的值爲:dev-2 Namespace

能夠看到用的是 dev-2 命名空間的配置

6、Kubernetes 的 SpringBoot 應用使用 Apollo 配置中心

本人的 Apollo 和 SpringBoot 應用通常都是基於 Kubernetes 部署的,因此這裏簡單介紹下,如何在 Kubernetes 環境下部署 SpringBoot 應用且使用 Apollo 做爲配置中心。

這裏項目依舊使用上面的示例,不過首先要將其編譯成 Docker 鏡像,方便後續部署到 Kubernetes 環境下。

一、構建 Docker 鏡像

(1)、執行 Maven 編譯

首先執行 Maven 命令,將項目編譯成一個可執行 JAR。

1$ mvn clean install

(2)、準備 Dockerfile

建立構建 Docker 鏡像須要的 Dockerfile 文件,將 Maven 編譯的 JAR 複製到鏡像內部,而後設置兩個變量,分別是:

  • JAVA_OPTS: Java JVM 啓動參數變量,這裏須要在這裏加一個時區參數。

  • APP_OPTS: Spring 容器啓動參數變量,方便後續操做時能經過此變量配置 Spring 參數。

Dockerfile:

1FROM openjdk:8u222-jre-slim
2VOLUME /tmp
3ADD target/*.jar app.jar
4RUN sh -c 'touch /app.jar'
5ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
6ENV APP_OPTS=""
7ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS" ]

(3)、構建 Docker 鏡像

執行 Docker Build 命令構建 Docker 鏡像。

1$ docker build -t mydlqclub/springboot-apollo:0.0.1 .

二、Kubernetes 部署示例應用

(1)、建立 SpringBoot 且使用 Apollo 配置中心的 Kubernetes 部署文件

這裏建立 Kubernetes 下的 SpringBoot 部署文件 apollo-demo-example.yaml。在以前 Dockerfile 中設置了兩個環境變量,JAVA_OPTS 與 APP_OPTS。其中 JAVA_OPTS 變量的值將會做爲 JVM 啓動參數,APP_OPTS 變量的值將會做爲應用的配置參數。因此,這裏咱們將 Apollo 配置參數放置到變量中,這樣一來就能夠方便修改與維護 Apollo 的配置信息。

在下面配置的環境變量參數中,設置的配置中心地址爲 http://service-apollo-config-server-dev.mydlqclub:8080,這是由於 Apollo 部署在 K8S 環境中,且可使用域名方式訪問,service-apollo-config-server-dev 是應用的 Service 名稱,mydlqcloud 是 K8S 下的 Namespace 名稱。

springboot-apollo.yaml

 1 apiVersion: v1
 2 kind: Service
 3 metadata:
 4  name: springboot-apollo
 5 spec:
 6  type: NodePort
 7  ports:
 8    - name: server
 9      nodePort: 31080
10      port: 8080
11      targetPort: 8080
12    - name: management
13      nodePort: 31081
14      port: 8081
15      targetPort: 8081
16  selector:
17    app: springboot-apollo
18 ---
19 apiVersion: apps/v1
20 kind: Deployment
21 metadata:
22  name: springboot-apollo
23  labels:
24    app: springboot-apollo
25 spec:
26  replicas: 1
27  selector:
28    matchLabels:
29      app: springboot-apollo
30  template:
31    metadata:
32      name: springboot-apollo
33      labels:
34        app: springboot-apollo
35    spec:
36      restartPolicy: Always
37      containers:
38        - name: springboot-apollo
39          image: mydlqclub/springboot-apollo:0.0.1
40          imagePullPolicy: Always
41          ports:
42            - containerPort: 8080
43              name: server
44          env:
45            - name: JAVA_OPTS
46              value: "-Denv=DEV"
47              ##注意修改此處的 mydlqcloud 爲你本身的 Namespace 名稱
48            - name: APP_OPTS
49              value: "
50                     -- app.id=apollo-demo
51                     -- apollo.bootstrap.enabled=true
52                     -- apollo.bootstrap.eagerLoad.enabled=false
53                     -- apollo.cacheDir=/opt/data/
54                     -- apollo.cluster=default
55                     -- apollo.bootstrap.namespaces=application
56                     -- apollo.autoUpdateInjectedSpringProperties=true
57                     -- apollo.meta=http://service-apollo-config-server-dev.mydlqcloud:8080
58                     "
59          resources:
60            limits:
61              memory: 1000Mi
62              cpu: 1000m
63            requests:
64              memory: 500Mi
65              cpu: 500m

(2)、部署 SpringBoot 應用到 Kubernetes

-n:建立應用到指定的 Namespace 中。

1$ kubectl apply -f springboot-apollo.yaml -n mydlqcloud

三、測試部署的應用接口

上面的應用配置了 NodePort 端口,能夠經過此端口訪問 Kubernetes 集羣內的應用接口,本人 Kubernetes 集羣地址爲 192.168.2.11 且 NodePort 端口爲 31081,因此瀏覽器訪問地址 http://192.168.2.11:31081/test 來測試接口,顯示:

1test的值爲:123456

能夠看到能經過 Apollo 獲取參數值,此文章到此結束。

相關文章
相關標籤/搜索