科普文:微服務之Apollo配置中心

1. 基本概念

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

1.1、背景

隨著程序功能的日益復雜,程序的配置日益增多,各種功能的開關、參數的配置、服務器的地址……對程序配置的期望值也越來越高,配置修改后實時生效,灰度發布,分環境、分集群管理配置,完善的權限、審核機制…… 在這樣的大環境下,傳統的通過配置文件、數據庫等方式已經越來越無法滿足開發人員對配置管理的需求。因此 Apollo 配置中心應運而生!

1.2、簡介

Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,并且具備規范的權限、流程治理等特性。

1.3、特點

  • 部署簡單

  • 灰度發布

  • 版本發布管理

  • 提供開放平臺API

  • 客戶端配置信息監控

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

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

  • 權限管理、發布審核、操作審計

  • 統一管理不同環境、不同集群的配置

1.4、基礎模型

如下即是 Apollo 的基礎模型:

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

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

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

圖片

?

1.5、Apollo 的四個維度

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

  • application (應用)

  • environment (環境)

  • cluster (集群)

  • namespace (命名空間)

(1)、application

  • Apollo 客戶端在運行時需要知道當前應用是誰,從而可以根據不同的應用來獲取對應應用的配置。

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

  • 如果你近期準備面試跳槽,建議在ddkk.com在線刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供。?

(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 的名稱必須全局唯一。

  • 如果你近期準備面試跳槽,建議在ddkk.com在線刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供。?

  • 關聯類型(繼承類型): 關聯類型又可稱為繼承類型,關聯類型具有 private 權限。關聯類型的 Namespace 繼承于公共類型的 Namespace,將里面的配置全部繼承,并且可以用于覆蓋公共 Namespace 的某些配置。

1.6、本地緩存

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

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

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

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

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

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

1.7、客戶端設計

圖片

?

上圖簡要描述了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 請求。

1.8、總體設計

圖片

?

上圖簡要描述了Apollo的總體設計,我們可以從下往上看:

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

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

  • Config Service 和 Admin Service 都是多實例、無狀態部署,所以需要將自己注冊到 Eureka 中并保持心跳

  • 如果你近期準備面試跳槽,建議在ddkk.com在線刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供。?

  • 在 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 進程中

1.9、可用性考慮

配置中心作為基礎服務,可用性要求非常高,下面的表格描述了不同場景下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 界面,在里面提前創建一個項目并在其配置一個參數,方便后續客戶端引入該配置參數,測試是否能動態變化。

2.1、登錄 Apollo

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

  • 用戶名:apollo

  • 密 碼:admin

圖片

?

2.2、修改與增加部門數據

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

圖片

?

開始這真讓人迷糊,原來 Apoloo 沒有修改或新增部門信息的管理節目,只能通過修改數據庫,來新增或者修改數據,這里打開?Portal?對月的數據庫中的表?ApolloPortalDB?修改?key?為?organizations?的?value?的 json 數據,改成自己對于的部門信息。

圖片

?

2.3、創建一個項目

修改完數據庫部門信息后,重新登錄 Apollo Portal,然后創建項目,這時候選擇部門可以看到已經變成我們自己修改后的部門信息了,選擇我們自定義部門,然后設置應用 ID 為 apollo-test,應用名為 apollo-demo 。

圖片

?

創建完成后進入配置管理界面

圖片

?

2.4、創建一個配置參數

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

圖片

?

設置key 為?test?value 為?123456?然后設置一個備注,保存。

圖片

?

創建完成后可以看到配置管理節目新增了一條配置。

圖片

?

接下來我們將此配置通過發布按鈕,進行發布。

圖片

?

3. 創建 Apollo 客戶端測試項目

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

3.1、Mavne 添加 Apollo 依賴

<?xml?version="1.0"?encoding="UTF-8"?>
<project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version></parent><groupId>club.mydlq</groupId><artifactId>apollo-demo</artifactId><version>0.0.1</version><name>apollo-demo</name><description>Apollo?Demo</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.4.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3.2、配置文件添加參數

在 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 的日志信息。

#應用配置
server:port:?8080
spring:application:name:?apollo-demo#Apollo?配置
app:id:?apollo-test????????????????????????????#應用ID
apollo:cacheDir:?/opt/data/???????????????????????#配置本地配置緩存目錄cluster:?default???????????????????????????#指定使用哪個集群的配置meta:?http://192.168.2.11:30002????????????#DEV環境配置中心地址autoUpdateInjectedSpringProperties:?true???#是否開啟?Spring?參數自動更新bootstrap:????????????????????????????????enabled:?true????????????????????????????#是否開啟?Apollonamespaces:?application??????????????????#設置?NamespaceeagerLoad:enabled:?false?????????????????????????#將?Apollo?加載提到初始化日志系統之前

3.3、創建測試 Controller 類

寫一個 Controller 類來輸出 test 變量的值,使用了 Spring 的 @Value 注解,用于讀取配置文件中的變量的值,這里來測試該值,項目啟動后讀取到的變量的值是設置在 application 配置文件中的默認值,還是遠程 Apollo 中的值,如果是 Apollo 中配置的值,那么再測試在 Apollo 配置中心中改變該變量的值后,這里是否會產生變化。

@RestController
public?class?TestController?{@Value("${test:默認值}")private?String?test;@GetMapping("/test")public?String?test(){return?"test的值為:"?+?test;}
}

3.4、創建啟動類

SpringBoot 項目啟動類。

@SpringBootApplication
public?class?Application?{public?static?void?main(String[]?args)?{SpringApplication.run(Application.class,?args);}}

3.5、JVM 啟動參數添加啟動參數

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

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

  • apollo.configService: 指定配置中心的地址,跳過 meta 的配置,在測試時指定 meta 地址無效果。如果 Apollo 是部署在 Kubernetes 中,則必須設置該參數為配置中心地址,如果 Apollo 不是在 Kubernetes 環境中,可以不設置此參數,只設置 meta 參數即可。一般情況下,configService 和 meta 值一致。

如果是在 Idea 中啟動,可以配置啟動參數,加上:

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

圖片

?

如果是java 命令啟動程序,需要 JVM 加上:

$?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. 啟動項目進行測試

4.1、測試是否能夠獲取 Apollo 中設置的值

啟動上面的測試用例,然后輸入地址 http://localhost:8080/test 查看:

test的值為:123456

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

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

修改Apollo 配置中心參數?test?值為?666666?,然后再次發布。

圖片

?

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

test的值為:666666

可以看到示例應用中的值已經改變為最新的值。

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

圖片

?

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

test的值為:123456

可以看到已經回滾到之前的?test?配置的值了。

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

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

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

然后輸入地址 http://localhost:8080/test 可以看到值為:

test的值為:123456

可以看到顯示的值并不是我們定義的默認值,而還是 Apollo 配置中心配置的?test?參數的值。考慮到由于 Apollo 會在本地將配置緩存一份,出現上面原因,估計是緩存生效。當客戶端不能連接到 Apollo 配置中心時候,默認使用本地緩存文件中的配置。

如果你近期準備面試跳槽,建議在ddkk.com在線刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供。?

上面我們配置了本地緩存配置文件存放地址為 "/opt/data/" ,接下來進入緩存目錄,找到對應的緩存配置文件,刪除緩存配置文件后,重啟應用,再次輸入地址查看:

test的值為:默認值

刪除緩存配置文件后,可以看到輸出的值為自己定義的默認值。

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

這里我們進入 Apollo 配置中心,刪除之前創建的?test?參數,然后發布。

圖片

?

然后再次打開地址 http://localhost:8080/test 查看:

test的值為:默認值

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

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

在Apollo 中,配置可以根據不同的環境劃分為 Dev(開發)、Prod(生產) 等環境,又能根據區域劃分為不同的 Cluster(集群),還能根據配置參數作用功能的不同劃分為不同的 Namespace(命名空間),這里探究下,如何使用上述能力。

5.1、不同環境下的配置

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

打開Apollo 配置中心,環境列表點擊 PRO 環境,然后新增一條配置,和之前例子中參數保持一致,都為?test?參數,創建完成后發布。

圖片

?

然后修改上面的示例項目,將配置參數指定為 PRO 環境:

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

apollo.meta?參數改成 RPO 的配置中心地址

......apollo:meta:?http://192.168.2.11:30005????????????#RPO環境配置中心地址......

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

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

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

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

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:

test的值為:abcdefg

可以看到已經改成生成環境配置,所以在實際項目中,如果要更換環境,需要修改 JVM 參數?env(如果 Apollo 部署在 Kubernetes 環境中,還需要修改?apollo.configService?參數),和修改 application.yml 配置文件的參數?apollo.meta?值。

5.2、不同集群下的配置

(1)、創建兩個集群

例如在開發過程中,經常要將應用部署到不同的機房,這里分別創建?beijingshanghai?兩個集群。

圖片

圖片

圖片

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

在兩個集群?beijing?與?shanghai?中,都統一配置參數?test,并且設置不同的值。

圖片

圖片

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

指定集群為 beijing:

......apollo:cluster:?beijing??????????????????????#指定使用?beijing?集群......

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:

test的值為:Cluster-BeiJing

可以看到用的是 beijing 集群的配置

指定集群為 shanghai:

......apollo:cluster:?shanghai??????????????????????#指定使用?shanghai?集群......

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:

test的值為:Cluster-ShangHai

可以看到用的是 shanghai 集群的配置

5.3、不同命名空間下的配置

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

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

這里創建?dev-1?與?dev-2?兩個私有的命名空間,用于測試。

圖片

圖片

圖片

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

在兩個命名空間中,都統一配置參數?test,并且設置不同的值,設置完后發布。

圖片

?

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

指定命名空間為 dev-1:

......apollo:bootstrap:namespaces:?dev-1???????????????????#設置?dev-1?命名空間......

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:

test的值為:dev-1?Namespace

可以看到用的是 dev-1 命名空間的配置

指定命名空間為 dev-2:

......apollo:bootstrap:namespaces:?dev-2???????????????????#設置?dev-1?命名空間......

YAML

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:

test的值為:dev-2?Namespace

HTML

可以看到用的是 dev-2 命名空間的配置

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

本人的Apollo 和 SpringBoot 應用一般都是基于 Kubernetes 部署的,所以這里簡單介紹下,如何在 Kubernetes 環境下部署 SpringBoot 應用且使用 Apollo 作為配置中心。

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

6.1、構建 Docker 鏡像

(1)、執行 Maven 編譯

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

$?mvn?clean?install

BASH

(2)、準備 Dockerfile

創建構建 Docker 鏡像需要的 Dockerfile 文件,將 Maven 編譯的 JAR 復制到鏡像內部,然后設置兩個變量,分別是:

如果你近期準備面試跳槽,建議在ddkk.com在線刷題,涵蓋 一萬+ 道 Java 面試題,幾乎覆蓋了所有主流技術面試題,還有市面上最全的技術五百套,精品系列教程,免費提供。?

  • JAVA_OPTS: Java JVM 啟動參數變量,這里需要在這里加一個時區參數。

  • APP_OPTS: Spring 容器啟動參數變量,方便后續操作時能通過此變量配置 Spring 參數。

Dockerfile:

FROM?openjdk:8u222-jre-slim
VOLUME?/tmp
ADD?target/*.jar?app.jar
RUN?sh?-c?'touch?/app.jar'
ENV?JAVA_OPTS="-XX:MaxRAMPercentage=80.0?-Duser.timezone=Asia/Shanghai"
ENV?APP_OPTS=""
ENTRYPOINT?[?"sh",?"-c",?"java?$JAVA_OPTS?-Djava.security.egd=file:/dev/./urandom?-jar?/app.jar?$APP_OPTS"?]

(3)、構建 Docker 鏡像

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

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

BASH

6.2、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

apiVersion:?v1
kind:?Service
metadata:name:?springboot-apollo
spec:type:?NodePortports:-?name:?servernodePort:?31080port:?8080targetPort:?8080-?name:?managementnodePort:?31081port:?8081targetPort:?8081selector:app:?springboot-apollo
---
apiVersion:?apps/v1
kind:?Deployment
metadata:name:?springboot-apollolabels:app:?springboot-apollo
spec:replicas:?1selector:matchLabels:app:?springboot-apollotemplate:metadata:name:?springboot-apollolabels:app:?springboot-apollospec:restartPolicy:?Alwayscontainers:-?name:?springboot-apolloimage:?mydlqclub/springboot-apollo:0.0.1imagePullPolicy:?Alwaysports:-?containerPort:?8080name:?serverenv:-?name:?JAVA_OPTSvalue:?"-Denv=DEV"##注意修改此處的?mydlqcloud?為你自己的?Namespace?名稱-?name:?APP_OPTSvalue:?"--app.id=apollo-demo--apollo.bootstrap.enabled=true--apollo.bootstrap.eagerLoad.enabled=false--apollo.cacheDir=/opt/data/--apollo.cluster=default--apollo.bootstrap.namespaces=application--apollo.autoUpdateInjectedSpringProperties=true--apollo.meta=http://service-apollo-config-server-dev.mydlqcloud:8080????"resources:limits:memory:?1000Micpu:?1000mrequests:memory:?500Micpu:?500m

(2)、部署 SpringBoot 應用到 Kubernetes

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

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

BASH

6.3、測試部署的應用接口

上面的應用配置了 NodePort 端口,可以通過此端口訪問 Kubernetes 集群內的應用接口,本人 Kubernetes 集群地址為 192.168.2.11 且 NodePort 端口為 31081,所以瀏覽器訪問地址 http://192.168.2.11:31081/test 來測試接口,顯示:

test的值為:123456

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45139.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 C++中,如何使用智能指針來有效地管理動態分配的內存,并避免內存泄漏的問題?

在C中&#xff0c;可以使用智能指針來有效地管理動態分配的內存&#xff0c;避免內存泄漏的問題。下面是一些常用的智能指針類型和操作&#xff1a; std::unique_ptr&#xff1a; std::unique_ptr是C11引入的一種獨占式智能指針&#xff0c;它擁有對分配的內存的唯一所有權。當…

026-GeoGebra中級篇-曲線(2)_極坐標曲線、參數化曲面、分段函數曲線、分形曲線、復數平面上的曲線、隨機曲線、非線性動力系統的軌跡

除了參數曲線、隱式曲線和顯式曲線之外&#xff0c;還有其他類型的曲線表示方法。本篇主要概述一下極坐標曲線、參數化曲面、分段函數曲線、分形曲線、復數平面上的曲線、隨機曲線、和非線性動力系統的軌跡&#xff0c;可能沒有那么深&#xff0c;可以先了解下。 目錄 1. 極坐…

「網絡通信」HTTP 協議

HTTP &#x1f349;簡介&#x1f349;抓包工具&#x1f349;報文結構&#x1f34c;請求&#x1f34c;響應&#x1f34c;URL&#x1f95d;URL encode &#x1f34c;方法&#x1f34c;報文字段&#x1f95d;Host&#x1f95d;Content-Length & Content-Type&#x1f95d;User…

運動控制問題

第一類運動控制問題是指被控制對象的空間位置或軌跡運動發生改變的運動控制系統的控制問題。這類運動控制問題在理論上完全遵循牛頓力學定律和運動學原則。 1、運動控制問題 第1類運動控制的核心是研究被控對象的運動軌跡 、分析運動路徑、運動速度、加速度與時間的關系,常用…

深入解析PHP框架:Symfony框架詳解與應用

文章目錄 深入解析PHP框架&#xff1a;Symfony框架詳解與應用一、什么是Symfony&#xff1f;Symfony的優勢 二、Symfony的核心概念1. 控制器2. 路由3. 模板4. 服務容器5. 事件調度器 三、Symfony的主要功能1. 表單處理2. 數據庫集成3. 安全性4. 國際化5. 調試與日志 四、開發流…

記一次docker容器安裝MySQL,navicat無法連接報錯(10060錯誤)

今天在云服務器上使用docker部署mysql 8.0.11時&#xff0c;遇到了一個詭異的問題&#xff0c;在云服務器的docker容器內可以連接上mysql&#xff0c;然而在自己電腦上連接mysql時報錯&#xff1a;Can‘t connect to MySQL server on localhost (10060) 下面是網上搜尋的幾種可…

SpringMVC框架--個人筆記步驟總結

一、步驟 1.創建工程 2.加入springmvc依賴--pom.xml <!--springmvc依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </depend…

Camunda如何通過外部任務與其他系統自動交互

文章目錄 簡介流程圖外部系統pom.xmllogback.xml監聽類 啟動流程實例常見問題Public Key Retrieval is not allowed的解決方法java.lang.reflect.InaccessibleObjectException 流程圖xml 簡介 前面我們已經介紹了Camunda的基本操作、任務、表&#xff1a; Camunda組件與服務與…

Linux命令更新-Vim 編輯器

簡介 Vim 是 Linux 系統中常用的文本編輯器&#xff0c;功能強大、可擴展性強&#xff0c;支持多種編輯模式和操作命令&#xff0c;被廣泛應用于程序開發、系統管理等領域。 1. Vim 命令模式 Vim 啟動后默認進入命令模式&#xff0c;此時鍵盤輸入的命令將用于控制編輯器本身&…

Android ImageDecoder把瘦高/扁平大圖相當于fitCenter模式decode成目標小尺寸Bitmap,Kotlin

Android ImageDecoder把瘦高/扁平大圖相當于fitCenter模式decode成目標小尺寸Bitmap&#xff0c;Kotlin val sz Size(MainActivity.SIZE, MainActivity.SIZE)val src ImageDecoder.createSource(mContext?.contentResolver!!, uri)val bitmap ImageDecoder.decodeBitmap(sr…

【Playwright+Python】系列 Pytest 插件在Playwright中的使用

一、命令行使用詳解 使用 Pytest 插件在Playwright 中來編寫端到端的測試。 1、命令行執行測試 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 內容如下&#xff1a; [pytest] # Run firefox with UIaddopts --headed --browser firefox效果&#xff1…

云計算【第一階段(31)】PXE高效批量網絡裝機

一、系統安裝 1.1、系統裝機的三種引導方式 1. 硬盤 2. 光驅&#xff08; u 盤&#xff09; 3. 網絡啟動 pxe 1.2、系統安裝過程 加載boot loader Boot Loader 是在操作系統內核運行之前運行的一段小程序。通過這段小程序&#xff0c;我們可以初始化硬件設備、建立內存空間的映…

【CSS in Depth 2 精譯】3.1.2 邏輯屬性 + 3.1.3 用好邏輯屬性的簡寫形式

當前內容所在位置&#xff08;可進入專欄查看其他譯好的章節內容&#xff09; 第一章 層疊、優先級與繼承&#xff08;已完結&#xff09; 1.1 層疊1.2 繼承1.3 特殊值1.4 簡寫屬性1.5 CSS 漸進式增強技術1.6 本章小結 第二章 相對單位&#xff08;已完結&#xff09; 2.1 相對…

深入探討:CPU問題的深度分析與調優

引言 你是否曾經遇到過這樣的情況:系統運行突然變慢,用戶抱怨不斷,檢查后發現CPU使用率居高不下?這時候,你會如何解決?本文將詳細解析CPU問題的分析與調優方法,幫助你在面對類似問題時游刃有余。 案例分析:一次CPU性能瓶頸的解決過程 某知名互聯網公司在一次促銷活動…

《Python數據科學之一:初見數據科學與環境》

《Python數據科學之一&#xff1a;初見數據科學與環境》 歡迎來到“Python數據科學”系列的第一篇文章。在這個系列中&#xff0c;我們將通過Python的鏡頭&#xff0c;深入探索數據科學的豐富世界。首先&#xff0c;讓我們設置和理解數據科學的基本概念以及在開始任何數據科學項…

實變函數精解【4】

文章目錄 說明點集與測度可數集定義性質示例與有限集的關系應用 可列集定義種類不可列集性質應用與意義 有限集性質示例與無限集的區別應用 可數集&#xff08;Countable set&#xff09;和可列集&#xff08;Countably infinite set 或 Enumerable set&#xff09;可數集可列集…

怎樣把pptx課件轉換成word文檔

如果你還沒有安裝python-pptx和python-docx&#xff0c;請先運行以下命令&#xff1a; pip install python-pptx python-docx from pptx import Presentation from docx import Document import re# 函數&#xff1a;清理文本&#xff0c;移除特殊字符和控制字符 def clean…

每日Attention學習11——Lightweight Dilated Bottleneck

模塊出處 [TITS 23] [link] [code] Lightweight Real-Time Semantic Segmentation Network With Efficient Transformer and CNN 模塊名稱 Lightweight Dilated Bottleneck (LDB) 模塊作用 改進的編碼器塊 模塊結構 模塊代碼 import torch import torch.nn as nn import to…

qt 添加一個圖片控件

在Qt中&#xff0c;要添加一個圖片控件&#xff0c;你通常會使用QLabel或者QGraphicsView來顯示圖片。下面是使用QLabel來顯示圖片的一種方法&#xff1a; 使用 QLabel 顯示圖片 在Qt Designer中添加QLabel 打開你的Qt Designer。從工具箱中找到QLabel控件&#xff0c;并將其拖…

C#如何進行深度學習對行人進行識別?

C#通常不是用于深度學習的主要語言,但是通過一些庫和框架,你可以輕松地在C#中實現深度學習。以下是使用C#進行深度學習的一些更詳細的步驟: 選擇合適的庫: ML.NET:這是微軟推出的一個機器學習庫,它很容易集成到.NET應用程序中。ML.NET支持廣泛的機器學習任務,包括深度學…