目錄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
因爲 Apollo 概念比較多,剛開始使用比較複雜,最好先過一遍概念再動手實踐嘗試使用。
隨着程序功能的日益複雜,程序的配置日益增多,各類功能的開關、參數的配置、服務器的地址……對程序配置的指望值也愈來愈高,配置修改後實時生效,灰度發佈,分環境、分集羣管理配置,完善的權限、審覈機制…… 在這樣的大環境下,傳統的經過配置文件、數據庫等方式已經愈來愈沒法知足開發人員對配置管理的需求。所以 Apollo 配置中心應運而生!
Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。
部署簡單
灰度發佈
版本發佈管理
提供開放平臺API
客戶端配置信息監控
提供Java和.Net原生客戶端
配置修改實時生效(熱發佈)
權限管理、發佈審覈、操做審計
統一管理不一樣環境、不一樣集羣的配置
以下便是 Apollo 的基礎模型:
(1)、用戶在配置中心對配置進行修改併發布
(2)、配置中心通知Apollo客戶端有配置更新
(3)、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 自動切換到其它存活的數據中心 |
接下來咱們將建立一個 Apollo 的客戶端項目,引用 Apollo 來實現配置動態更新,不過在此以前咱們須要提早進入 Apollo Portal 界面,在裏面提早建立一個項目並在其配置一個參數,方便後續客戶端引入該配置參數,測試是否能動態變化。
我這裏是部署到 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
而後設置一個備註,保存。
建立完成後能夠看到配置管理節目新增了一條配置。
接下來咱們將此配置經過發佈按鈕,進行發佈。
這裏建立一個 SpringBoot 項目,引入 Apollo 客戶端來來實現與 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 類來輸出 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}
因爲本人的 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 或者其它環境下的配置中心。
啓動上面的測試用例,而後輸入地址 http://localhost:8080/test 查看:
1test的值爲:123456
能夠看到使用的是 Apollo 中配置的 test
參數的值 123456
,而不是默認的值。
修改 Apollo 配置中心參數 test
值爲 666666
,而後再次發佈。
發佈完成後再次輸入地址 http://localhost:8080/test 查看:
1test的值爲:666666
能夠看到示例應用中的值已經改變爲最新的值。
回滾完成後狀態將變爲未發佈狀態,則時候輸入地址 http://localhost:8080/test 查看:
1test的值爲:123456
能夠看到已經回滾到以前的 test
配置的值了。
這裏咱們將 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 配置中心,刪除以前建立的 test
參數,而後發佈。
而後再次打開地址 http://localhost:8080/test 查看:
1test的值爲:默認值
能夠看到顯示的是應用程序中設置的默認值。
在 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)、建立兩個集羣
例如在開發過程當中,常常要將應用部署到不一樣的機房,這裏分別建立 beijing
、shanghai
兩個集羣。
(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 命名空間的配置
本人的 Apollo 和 SpringBoot 應用通常都是基於 Kubernetes 部署的,因此這裏簡單介紹下,如何在 Kubernetes 環境下部署 SpringBoot 應用且使用 Apollo 做爲配置中心。
這裏項目依舊使用上面的示例,不過首先要將其編譯成 Docker 鏡像,方便後續部署到 Kubernetes 環境下。
(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 .
(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 獲取參數值,此文章到此結束。