日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Apollo,真香!

來源: 責編: 時間:2024-01-08 17:11:01 227觀看
導(dǎo)讀今天深入聊一聊攜程開源的一款分布式配置中心Apollo,在功能上和Nacos不相上下。1. 基本概念由于 Apollo 概念比較多,剛開始使用比較復(fù)雜,最好先過一遍概念再動手實踐嘗試使用。1、背景隨著程序功能的日益復(fù)雜,程序的配置

今天深入聊一聊攜程開源的一款分布式配置中心Apollo,在功能上和Nacos不相上下。rUB28資訊網(wǎng)——每日最新資訊28at.com

1. 基本概念

由于 Apollo 概念比較多,剛開始使用比較復(fù)雜,最好先過一遍概念再動手實踐嘗試使用。rUB28資訊網(wǎng)——每日最新資訊28at.com

1、背景

隨著程序功能的日益復(fù)雜,程序的配置日益增多,各種功能的開關(guān)、參數(shù)的配置、服務(wù)器的地址……對程序配置的期望值也越來越高,配置修改后實時生效,灰度發(fā)布,分環(huán)境、分集群管理配置,完善的權(quán)限、審核機制…… 在這樣的大環(huán)境下,傳統(tǒng)的通過配置文件、數(shù)據(jù)庫等方式已經(jīng)越來越無法滿足開發(fā)人員對配置管理的需求。因此 Apollo 配置中心應(yīng)運而生!rUB28資訊網(wǎng)——每日最新資訊28at.com

2、簡介

Apollo(阿波羅)是攜程框架部門研發(fā)的開源配置管理中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性。rUB28資訊網(wǎng)——每日最新資訊28at.com

3、特點

  • 部署簡單
  • 灰度發(fā)布
  • 版本發(fā)布管理
  • 提供開放平臺API
  • 客戶端配置信息監(jiān)控
  • 提供Java和.Net原生客戶端
  • 配置修改實時生效(熱發(fā)布)
  • 權(quán)限管理、發(fā)布審核、操作審計
  • 統(tǒng)一管理不同環(huán)境、不同集群的配置

4、基礎(chǔ)模型

如下即是 Apollo 的基礎(chǔ)模型:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • (1)、用戶在配置中心對配置進行修改并發(fā)布
  • (2)、配置中心通知Apollo客戶端有配置更新
  • (3)、Apollo客戶端從配置中心拉取最新的配置、更新本地配置并通知到應(yīng)用

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

5、Apollo 的四個維度

Apollo支持4個維度管理Key-Value格式的配置:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • application (應(yīng)用)
  • environment (環(huán)境)
  • cluster (集群)
  • namespace (命名空間)

(1)、applicationrUB28資訊網(wǎng)——每日最新資訊28at.com

  • Apollo 客戶端在運行時需要知道當前應(yīng)用是誰,從而可以根據(jù)不同的應(yīng)用來獲取對應(yīng)應(yīng)用的配置。
  • 每個應(yīng)用都需要有唯一的身份標識,可以在代碼中配置 app.id 參數(shù)來標識當前應(yīng)用,Apollo 會根據(jù)此指來辨別當前應(yīng)用。

(2)、environmentrUB28資訊網(wǎng)——每日最新資訊28at.com

在實際開發(fā)中,我們的應(yīng)用經(jīng)常要部署在不同的環(huán)境中,一般情況下分為開發(fā)、測試、生產(chǎn)等等不同環(huán)境,不同環(huán)境中的配置也是不同的,在 Apollo 中默認提供了四種環(huán)境:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • FAT(Feature Acceptance Test):功能測試環(huán)境
  • UAT(User Acceptance Test):集成測試環(huán)境
  • DEV(Develop):開發(fā)環(huán)境
  • PRO(Produce):生產(chǎn)環(huán)境

在程序中如果想指定使用哪個環(huán)境,可以配置變量 env 的值為對應(yīng)環(huán)境名稱即可。rUB28資訊網(wǎng)——每日最新資訊28at.com

(3)、clusterrUB28資訊網(wǎng)——每日最新資訊28at.com

  • 一個應(yīng)用下不同實例的分組,比如典型的可以按照數(shù)據(jù)中心分,把上海機房的應(yīng)用實例分為一個集群,把北京機房的應(yīng)用實例分為另一個集群。
  • 對不同的集群,同一個配置可以有不一樣的值,比如說上面所指的兩個北京、上海兩個機房設(shè)置兩個集群,兩個集群中都有 mysql 配置參數(shù),其中參數(shù)中配置的地址是不一樣的。

(4)、namespacerUB28資訊網(wǎng)——每日最新資訊28at.com

一個應(yīng)用中不同配置的分組,可以簡單地把 namespace 類比為不同的配置文件,不同類型的配置存放在不同的文件中,如數(shù)據(jù)庫配置文件,RPC 配置文件,應(yīng)用自身的配置文件等。rUB28資訊網(wǎng)——每日最新資訊28at.com

熟悉 SpringBoot 的都知道,SpringBoot 項目都有一個默認配置文件 application.yml,如果還想用多個配置,可以創(chuàng)建多個配置文件來存放不同的配置信息,通過指定 spring.profiles.active 參數(shù)指定應(yīng)用不同的配置文件。這里的 namespace 概念與其類似,將不同的配置放到不同的配置 namespace 中。rUB28資訊網(wǎng)——每日最新資訊28at.com

Namespace 分為兩種權(quán)限,分別為:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • public(公共的): public權(quán)限的 Namespace,能被任何應(yīng)用獲取。
  • private(私有的): 只能被所屬的應(yīng)用獲取到。一個應(yīng)用嘗試獲取其它應(yīng)用 private 的 Namespace,Apollo 會報 "404" 異常。

Namespace 分為三種類型,分別為:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 私有類型: 私有類型的 Namespace 具有 private 權(quán)限。例如 application Namespace 為私有類型。
  • 公共類型: 公共類型的 Namespace 具有 public 權(quán)限。公共類型的N amespace 相當于游離于應(yīng)用之外的配置,且通過 Namespace 的名稱去標識公共 Namespace,所以公共的 Namespace 的名稱必須全局唯一。
  • 關(guān)聯(lián)類型(繼承類型): 關(guān)聯(lián)類型又可稱為繼承類型,關(guān)聯(lián)類型具有 private 權(quán)限。關(guān)聯(lián)類型的 Namespace 繼承于公共類型的 Namespace,將里面的配置全部繼承,并且可以用于覆蓋公共 Namespace 的某些配置。

6、本地緩存

Apollo客戶端會把從服務(wù)端獲取到的配置在本地文件系統(tǒng)緩存一份,用于在遇到服務(wù)不可用,或網(wǎng)絡(luò)不通的時候,依然能從本地恢復(fù)配置,不影響應(yīng)用正常運行。rUB28資訊網(wǎng)——每日最新資訊28at.com

本地緩存路徑默認位于以下路徑,所以請確保/opt/data或C:/opt/data/目錄存在,且應(yīng)用有讀寫權(quán)限。rUB28資訊網(wǎng)——每日最新資訊28at.com

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

本地配置文件會以下面的文件名格式放置于本地緩存路徑下:rUB28資訊網(wǎng)——每日最新資訊28at.com

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

7、客戶端設(shè)計

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

上圖簡要描述了Apollo客戶端的實現(xiàn)原理rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 客戶端和服務(wù)端保持了一個長連接,從而能第一時間獲得配置更新的推送。
  • 客戶端還會定時從 Apollo 配置中心服務(wù)端拉取應(yīng)用的最新配置。

這是一個 fallback 機制,為了防止推送機制失效導(dǎo)致配置不更新rUB28資訊網(wǎng)——每日最新資訊28at.com

客戶端定時拉取會上報本地版本,所以一般情況下,對于定時拉取的操作,服務(wù)端都會返回 304 - Not ModifiedrUB28資訊網(wǎng)——每日最新資訊28at.com

定時頻率默認為每 5 分鐘拉取一次,客戶端也可以通過在運行時指定 apollo.refreshInterval 來覆蓋,單位為分鐘。rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 客戶端從 Apollo 配置中心服務(wù)端獲取到應(yīng)用的最新配置后,會保存在內(nèi)存中。
  • 客戶端會把從服務(wù)端獲取到的配置在本地文件系統(tǒng)緩存一份 在遇到服務(wù)不可用,或網(wǎng)絡(luò)不通的時候,依然能從本地恢復(fù)配置。
  • 應(yīng)用程序從 Apollo 客戶端獲取最新的配置、訂閱配置更新通知。

配置更新推送實現(xiàn)rUB28資訊網(wǎng)——每日最新資訊28at.com

前面提到了 Apollo 客戶端和服務(wù)端保持了一個長連接,從而能第一時間獲得配置更新的推送。長連接實際上我們是通過 Http Long Polling 實現(xiàn)的,具體而言:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 客戶端發(fā)起一個 Http 請求到服務(wù)端
  • 服務(wù)端會保持住這個連接 60 秒

如果在 60 秒內(nèi)有客戶端關(guān)心的配置變化,被保持住的客戶端請求會立即返回,并告知客戶端有配置變化的 namespace 信息,客戶端會據(jù)此拉取對應(yīng) namespace 的最新配置rUB28資訊網(wǎng)——每日最新資訊28at.com

如果在 60 秒內(nèi)沒有客戶端關(guān)心的配置變化,那么會返回 Http 狀態(tài)碼 304 給客戶端rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 客戶端在收到服務(wù)端請求后會立即重新發(fā)起連接,回到第一步
  • 考慮到會有數(shù)萬客戶端向服務(wù)端發(fā)起長連,在服務(wù)端我們使用了 async servlet(Spring DeferredResult) 來服務(wù) Http Long Polling 請求。

8、總體設(shè)計

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

上圖簡要描述了Apollo的總體設(shè)計,我們可以從下往上看:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • Config Service 提供配置的讀取、推送等功能,服務(wù)對象是 Apollo 客戶端
  • Admin Service 提供配置的修改、發(fā)布等功能,服務(wù)對象是 Apollo Portal(管理界面)
  • Config Service 和 Admin Service 都是多實例、無狀態(tài)部署,所以需要將自己注冊到 Eureka 中并保持心跳
  • 在 Eureka 之上我們架了一層 Meta Server 用于封裝Eureka的服務(wù)發(fā)現(xiàn)接口
  • Client 通過域名訪問 Meta Server 獲取Config Service服務(wù)列表(IP+Port),而后直接通過 IP+Port 訪問服務(wù),同時在 Client 側(cè)會做 load balance 錯誤重試
  • Portal 通過域名訪問 Meta Server 獲取 Admin Service 服務(wù)列表(IP+Port),而后直接通過 IP+Port 訪問服務(wù),同時在 Portal 側(cè)會做 load balance、錯誤重試
  • 為了簡化部署,我們實際上會把 Config Service、Eureka 和 Meta Server 三個邏輯角色部署在同一個 JVM 進程中

9、可用性考慮

配置中心作為基礎(chǔ)服務(wù),可用性要求非常高,下面的表格描述了不同場景下Apollo的可用性:rUB28資訊網(wǎng)——每日最新資訊28at.com

場景rUB28資訊網(wǎng)——每日最新資訊28at.com

影響rUB28資訊網(wǎng)——每日最新資訊28at.com

降級rUB28資訊網(wǎng)——每日最新資訊28at.com

原因rUB28資訊網(wǎng)——每日最新資訊28at.com

某臺 config service 下線rUB28資訊網(wǎng)——每日最新資訊28at.com

無影響rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

Config service無狀態(tài),客戶端重連其它config servicerUB28資訊網(wǎng)——每日最新資訊28at.com

所有 config service 下線rUB28資訊網(wǎng)——每日最新資訊28at.com

客戶端無法讀取最新配置,Portal無影響rUB28資訊網(wǎng)——每日最新資訊28at.com

客戶端重啟時,可以讀取本地緩存配置文件rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

某臺 admin service 下線rUB28資訊網(wǎng)——每日最新資訊28at.com

無影響rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

Admin service無狀態(tài),Portal重連其它 admin servicerUB28資訊網(wǎng)——每日最新資訊28at.com

所有 admin service 下線rUB28資訊網(wǎng)——每日最新資訊28at.com

客戶端無影響,portal無法更新配置rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

某臺 portal 下線rUB28資訊網(wǎng)——每日最新資訊28at.com

無影響rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

Portal域名通過slb綁定多臺服務(wù)器,重試后指向可用的服務(wù)器rUB28資訊網(wǎng)——每日最新資訊28at.com

全部 portal 下線rUB28資訊網(wǎng)——每日最新資訊28at.com

客戶端無影響,portal無法更新配置rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

某個數(shù)據(jù)中心下線rUB28資訊網(wǎng)——每日最新資訊28at.com

無影響rUB28資訊網(wǎng)——每日最新資訊28at.com


rUB28資訊網(wǎng)——每日最新資訊28at.com

多數(shù)據(jù)中心部署,數(shù)據(jù)完全同步,Meta Server/Portal 域名通過 slb 自動切換到其它存活的數(shù)據(jù)中心rUB28資訊網(wǎng)——每日最新資訊28at.com

2. Apollo 配置中心創(chuàng)建項目與配置

接下來我們將創(chuàng)建一個 Apollo 的客戶端項目,引用 Apollo 來實現(xiàn)配置動態(tài)更新,不過在此之前我們需要提前進入 Apollo Portal 界面,在里面提前創(chuàng)建一個項目并在其配置一個參數(shù),方便后續(xù)客戶端引入該配置參數(shù),測試是否能動態(tài)變化。rUB28資訊網(wǎng)——每日最新資訊28at.com

1、登錄 Apollo

我這里是部署到 Kubernetes 中,通過 NodePort 方式暴露出一個端口,打開這個地址登錄 Apollo:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 用戶名:apollo
  • 密  碼:admin

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

2、修改與增加部門數(shù)據(jù)

在登錄后創(chuàng)建項目時,選擇部門默認只能選擇 Apollo 自帶的 測試部門1與測試部門2兩個選項。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

開始這真讓人迷糊,原來 Apoloo 沒有修改或新增部門信息的管理節(jié)目,只能通過修改數(shù)據(jù)庫,來新增或者修改數(shù)據(jù),這里打開 Portal 對月的數(shù)據(jù)庫中的表 ApolloPortalDB 修改 key 為 organizations 的 value 的 json 數(shù)據(jù),改成自己對于的部門信息。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

3、創(chuàng)建一個項目

修改完數(shù)據(jù)庫部門信息后,重新登錄 Apollo Portal,然后創(chuàng)建項目,這時候選擇部門可以看到已經(jīng)變成我們自己修改后的部門信息了,選擇我們自定義部門,然后設(shè)置應(yīng)用 ID 為 apollo-test,應(yīng)用名為 apollo-demo 。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建完成后進入配置管理界面rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

4、創(chuàng)建一個配置參數(shù)

創(chuàng)建一個配置參數(shù),方便后續(xù) Apollo 客戶端項目引入該參數(shù),進行動態(tài)配置測試。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

設(shè)置 key 為 test value 為 123456 然后設(shè)置一個備注,保存。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建完成后可以看到配置管理節(jié)目新增了一條配置。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

接下來我們將此配置通過發(fā)布按鈕,進行發(fā)布。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

3. 創(chuàng)建 Apollo 客戶端測試項目

這里創(chuàng)建一個 SpringBoot 項目,引入 Apollo 客戶端來來實現(xiàn)與 Apollo 配置中心服務(wù)端交互。rUB28資訊網(wǎng)——每日最新資訊28at.com

1)Mavne 添加 Apollo 依賴

<?xml versinotallow="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>

2)配置文件添加參數(shù)

在 application.yml 配置文件中添加下面參數(shù),這里簡單介紹下 Apollo 參數(shù)作用:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • 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應(yīng)用通常會使用 Placeholder 來注入配置,如${someKey:someDefaultValue},冒號前面的是 key,冒號后面的是默認值。如果想關(guān)閉 placeholder 在運行時自動更新功能,可以設(shè)置為 false。
  • apollo.bootstrap.eagerLoad.enabled : 將 Apollo 加載提到初始化日志系統(tǒng)之前,如果設(shè)置為 false,那么將打印出 Apollo 的日志信息,但是由于打印 Apollo 日志信息需要日志先啟動,啟動后無法對日志配置進行修改,所以 Apollo 不能管理應(yīng)用的日志配置,如果設(shè)置為 true,那么 Apollo 可以管理日志的配置,但是不能打印出 Apollo 的日志信息。
#應(yīng)用配置server:  port: 8080spring:  application:    name: apollo-demo#Apollo 配置app:  id: apollo-test                            #應(yīng)用IDapollo:  cacheDir: /opt/data/                       #配置本地配置緩存目錄  cluster: default                           #指定使用哪個集群的配置  meta: http://192.168.2.11:30002            #DEV環(huán)境配置中心地址  autoUpdateInjectedSpringProperties: true   #是否開啟 Spring 參數(shù)自動更新  bootstrap:                                    enabled: true                            #是否開啟 Apollo    namespaces: application                  #設(shè)置 Namespace    eagerLoad:      enabled: false                         #將 Apollo 加載提到初始化日志系統(tǒng)之前

3)創(chuàng)建測試 Controller 類

寫一個 Controller 類來輸出 test 變量的值,使用了 Spring 的 @Value 注解,用于讀取配置文件中的變量的值,這里來測試該值,項目啟動后讀取到的變量的值是設(shè)置在 application 配置文件中的默認值,還是遠程 Apollo 中的值,如果是 Apollo 中配置的值,那么再測試在 Apollo 配置中心中改變該變量的值后,這里是否會產(chǎn)生變化。rUB28資訊網(wǎng)——每日最新資訊28at.com

import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class TestController {    @Value("${test:默認值}")    private String test;    @GetMapping("/test")    public String test(){        return "test的值為:" + test;    }}

4)創(chuàng)建啟動類

SpringBoot 項目啟動類。rUB28資訊網(wǎng)——每日最新資訊28at.com

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

5)JVM 啟動參數(shù)添加啟動參數(shù)

由于本人的 Apollo 是部署在 Kubernetes 環(huán)境中的,JVM 參數(shù)中必須添加兩個變量:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • env: 應(yīng)用使用 Apollo 哪個環(huán)境,例如設(shè)置為 DEV 就是指定使用開發(fā)環(huán)境,如果設(shè)置為 PRO 就是制定使用生產(chǎn)環(huán)境。
  • apollo.configService: 指定配置中心的地址,跳過 meta 的配置,在測試時指定 meta 地址無效果。如果 Apollo 是部署在 Kubernetes 中,則必須設(shè)置該參數(shù)為配置中心地址,如果 Apollo 不是在 Kubernetes 環(huán)境中,可以不設(shè)置此參數(shù),只設(shè)置 meta 參數(shù)即可。一般情況下,configService 和 meta 值一致。

如果是在 Idea 中啟動,可以配置啟動參數(shù),加上:rUB28資訊網(wǎng)——每日最新資訊28at.com

-Dapollo.cnotallow=http://192.168.2.11:30002 -Denv=DEV

圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

如果是 java 命令啟動程序,需要 JVM 加上:rUB28資訊網(wǎng)——每日最新資訊28at.com

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

rUB28資訊網(wǎng)——每日最新資訊28at.com

注意:上面 env 指定的環(huán)境,要和 apollo.meta 指定 Config 地址的環(huán)境一致,例如 -Denv=DEV 即使用開發(fā)環(huán)境,那么 apollo.meta=http://xxx.xxx.xxx:8080 這個url 的 Config 也是開發(fā)環(huán)境下的配置中心服務(wù),而不能是 PRO 或者其它環(huán)境下的配置中心。rUB28資訊網(wǎng)——每日最新資訊28at.com

rUB28資訊網(wǎng)——每日最新資訊28at.com

4. 啟動項目進行測試

1)測試是否能夠獲取 Apollo 中設(shè)置的值

啟動上面的測試用例,然后輸入地址 http://localhost:8080/test 查看:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:123456

可以看到使用的是 Apollo 中配置的 test 參數(shù)的值 123456,而不是默認的值。rUB28資訊網(wǎng)——每日最新資訊28at.com

2)測試當 Apollo 中修改參數(shù)值后客戶端是否能及時刷新

修改 Apollo 配置中心參數(shù) test 值為 666666 ,然后再次發(fā)布。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

發(fā)布完成后再次輸入地址 http://localhost:8080/test 查看:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:666666

可以看到示例應(yīng)用中的值已經(jīng)改變?yōu)樽钚碌闹怠?span style="display:none">rUB28資訊網(wǎng)——每日最新資訊28at.com

3、測試當 Apollo 執(zhí)行配置回滾操作時客戶端是否能及時改變

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

回滾完成后狀態(tài)將變?yōu)槲窗l(fā)布狀態(tài),則時候輸入地址 http://localhost:8080/test 查看:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:123456

可以看到已經(jīng)回滾到之前的 test 配置的值了。rUB28資訊網(wǎng)——每日最新資訊28at.com

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

這里我們將 JVM 參數(shù)中 Apollo 配置中心地址故意改錯:rUB28資訊網(wǎng)——每日最新資訊28at.com

-Dapollo.cnotallow=http://192.168.2.100:30002 -Denv=DEV

然后輸入地址 http://localhost:8080/test 可以看到值為:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:123456

可以看到顯示的值并不是我們定義的默認值,而還是 Apollo 配置中心配置的 test 參數(shù)的值。考慮到由于 Apollo 會在本地將配置緩存一份,出現(xiàn)上面原因,估計是緩存生效。當客戶端不能連接到 Apollo 配置中心時候,默認使用本地緩存文件中的配置。rUB28資訊網(wǎng)——每日最新資訊28at.com

上面我們配置了本地緩存配置文件存放地址為 "/opt/data/" ,接下來進入緩存目錄,找到對應(yīng)的緩存配置文件,刪除緩存配置文件后,重啟應(yīng)用,再次輸入地址查看:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:默認值

刪除緩存配置文件后,可以看到輸出的值為自己定義的默認值。rUB28資訊網(wǎng)——每日最新資訊28at.com

5、測試當 Apollo 中將參數(shù)刪除后客戶端的變化

這里我們進入 Apollo 配置中心,刪除之前創(chuàng)建的 test 參數(shù),然后發(fā)布。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

然后再次打開地址 http://localhost:8080/test 查看:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:默認值

可以看到顯示的是應(yīng)用程序中設(shè)置的默認值。rUB28資訊網(wǎng)——每日最新資訊28at.com

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

在 Apollo 中,配置可以根據(jù)不同的環(huán)境劃分為 Dev(開發(fā))、Prod(生產(chǎn)) 等環(huán)境,又能根據(jù)區(qū)域劃分為不同的 Cluster(集群),還能根據(jù)配置參數(shù)作用功能的不同劃分為不同的 Namespace(命名空間),這里探究下,如何使用上述能力。rUB28資訊網(wǎng)——每日最新資訊28at.com

1)不同環(huán)境下的配置

(1)、Apollo 配置中心 PRO 環(huán)境添加參數(shù)rUB28資訊網(wǎng)——每日最新資訊28at.com

打開 Apollo 配置中心,環(huán)境列表點擊 PRO 環(huán)境,然后新增一條配置,和之前例子中參數(shù)保持一致,都為 test 參數(shù),創(chuàng)建完成后發(fā)布。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

然后修改上面的示例項目,將配置參數(shù)指定為 PRO 環(huán)境:rUB28資訊網(wǎng)——每日最新資訊28at.com

(2)、示例項目修改 application.yml 配置文件rUB28資訊網(wǎng)——每日最新資訊28at.com

把 apollo.meta 參數(shù)改成 RPO 的配置中心地址rUB28資訊網(wǎng)——每日最新資訊28at.com

......apollo:  meta: http://192.168.2.11:30005            #RPO環(huán)境配置中心地址  ......

(3)、示例項目修改 JVM 參數(shù)rUB28資訊網(wǎng)——每日最新資訊28at.com

把 apollo.configService 參數(shù)改成 PRO 配置中心地址,env 參數(shù)的值改為 PRO。rUB28資訊網(wǎng)——每日最新資訊28at.com

-Dapollo.cnotallow=http://192.168.2.11:30005 -Denv=PRO

(4)、啟動示例項目觀察結(jié)果rUB28資訊網(wǎng)——每日最新資訊28at.com

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:abcdefg

可以看到已經(jīng)改成生成環(huán)境配置,所以在實際項目中,如果要更換環(huán)境,需要修改 JVM 參數(shù) env(如果 Apollo 部署在 Kubernetes 環(huán)境中,還需要修改 apollo.configService 參數(shù)),和修改 application.yml 配置文件的參數(shù) apollo.meta 值。rUB28資訊網(wǎng)——每日最新資訊28at.com

2)不同集群下的配置

(1)、創(chuàng)建兩個集群rUB28資訊網(wǎng)——每日最新資訊28at.com

例如在開發(fā)過程中,經(jīng)常要將應(yīng)用部署到不同的機房,這里分別創(chuàng)建 beijing、shanghai 兩個集群。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

(2)、兩個集群都配置同樣的參數(shù)不同的值rUB28資訊網(wǎng)——每日最新資訊28at.com

在兩個集群 beijing 與 shanghai 中,都統(tǒng)一配置參數(shù) test,并且設(shè)置不同的值。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

(3)、示例項目 application.yml 修改集群配置參數(shù),并啟動項目觀察結(jié)果rUB28資訊網(wǎng)——每日最新資訊28at.com

指定集群為 beijing:rUB28資訊網(wǎng)——每日最新資訊28at.com

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

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:Cluster-BeiJing

可以看到用的是 beijing 集群的配置rUB28資訊網(wǎng)——每日最新資訊28at.com

指定集群為 shanghai:rUB28資訊網(wǎng)——每日最新資訊28at.com

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

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:Cluster-ShangHai

可以看到用的是 shanghai 集群的配置rUB28資訊網(wǎng)——每日最新資訊28at.com

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

(1)、創(chuàng)建兩個命名空間rUB28資訊網(wǎng)——每日最新資訊28at.com

命名空間有兩種,一種是 public(公開),一種是 private 私有,公開命名空間所有項目都能讀取配置信息,而私有的只能 app.id 值屬于該應(yīng)用的才能讀取配置。rUB28資訊網(wǎng)——每日最新資訊28at.com

這里創(chuàng)建 dev-1 與 dev-2 兩個私有的命名空間,用于測試。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

(2)、兩個集群都配置同樣的參數(shù)不同的值rUB28資訊網(wǎng)——每日最新資訊28at.com

在兩個命名空間中,都統(tǒng)一配置參數(shù) test,并且設(shè)置不同的值,設(shè)置完后發(fā)布。rUB28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片rUB28資訊網(wǎng)——每日最新資訊28at.com

(3)、示例項目 application.yml 修改命名空間配置參數(shù),并啟動項目觀察結(jié)果rUB28資訊網(wǎng)——每日最新資訊28at.com

指定命名空間為 dev-1:rUB28資訊網(wǎng)——每日最新資訊28at.com

......apollo:  bootstrap:    namespaces: dev-1                   #設(shè)置 dev-1 命名空間......

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:dev-1 Namespace

可以看到用的是 dev-1 命名空間的配置rUB28資訊網(wǎng)——每日最新資訊28at.com

指定命名空間為 dev-2:rUB28資訊網(wǎng)——每日最新資訊28at.com

......apollo:  bootstrap:    namespaces: dev-2                   #設(shè)置 dev-1 命名空間......

YAMLrUB28資訊網(wǎng)——每日最新資訊28at.com

啟動示例項目,然后接著輸入地址 http://localhost:8080/test 查看信息:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:dev-2 Namespace

HTMLrUB28資訊網(wǎng)——每日最新資訊28at.com

可以看到用的是 dev-2 命名空間的配置rUB28資訊網(wǎng)——每日最新資訊28at.com

6. Kubernetes 的 SpringBoot 應(yīng)用使用 Apollo 配置中心

本人的 Apollo 和 SpringBoot 應(yīng)用一般都是基于 Kubernetes 部署的,所以這里簡單介紹下,如何在 Kubernetes 環(huán)境下部署 SpringBoot 應(yīng)用且使用 Apollo 作為配置中心。rUB28資訊網(wǎng)——每日最新資訊28at.com

這里項目依舊使用上面的示例,不過首先要將其編譯成 Docker 鏡像,方便后續(xù)部署到 Kubernetes 環(huán)境下。rUB28資訊網(wǎng)——每日最新資訊28at.com

1、構(gòu)建 Docker 鏡像

(1)、執(zhí)行 Maven 編譯rUB28資訊網(wǎng)——每日最新資訊28at.com

首先執(zhí)行 Maven 命令,將項目編譯成一個可執(zhí)行 JAR。rUB28資訊網(wǎng)——每日最新資訊28at.com

$ mvn clean install

BASHrUB28資訊網(wǎng)——每日最新資訊28at.com

(2)、準備 DockerfilerUB28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建構(gòu)建 Docker 鏡像需要的 Dockerfile 文件,將 Maven 編譯的 JAR 復(fù)制到鏡像內(nèi)部,然后設(shè)置兩個變量,分別是:rUB28資訊網(wǎng)——每日最新資訊28at.com

  • JAVA_OPTS: Java JVM 啟動參數(shù)變量,這里需要在這里加一個時區(qū)參數(shù)。
  • APP_OPTS: Spring 容器啟動參數(shù)變量,方便后續(xù)操作時能通過此變量配置 Spring 參數(shù)。

Dockerfile:rUB28資訊網(wǎng)——每日最新資訊28at.com

FROM openjdk:8u222-jre-slimVOLUME /tmpADD target/*.jar app.jarRUN sh -c 'touch /app.jar'ENV JAVA_OPTS="-XX:MaxRAMPercentage=80.0 -Duser.timeznotallow=Asia/Shanghai"ENV APP_OPTS=""ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS" ]

(3)、構(gòu)建 Docker 鏡像rUB28資訊網(wǎng)——每日最新資訊28at.com

執(zhí)行 Docker Build 命令構(gòu)建 Docker 鏡像。rUB28資訊網(wǎng)——每日最新資訊28at.com

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

BASHrUB28資訊網(wǎng)——每日最新資訊28at.com

2、Kubernetes 部署示例應(yīng)用

(1)、創(chuàng)建 SpringBoot 且使用 Apollo 配置中心的 Kubernetes 部署文件rUB28資訊網(wǎng)——每日最新資訊28at.com

這里創(chuàng)建 Kubernetes 下的 SpringBoot 部署文件 apollo-demo-example.yaml。在之前 Dockerfile 中設(shè)置了兩個環(huán)境變量,JAVA_OPTS 與 APP_OPTS。其中 JAVA_OPTS 變量的值將會作為 JVM 啟動參數(shù),APP_OPTS 變量的值將會作為應(yīng)用的配置參數(shù)。所以,這里我們將 Apollo 配置參數(shù)放置到變量中,這樣一來就可以方便修改與維護 Apollo 的配置信息。rUB28資訊網(wǎng)——每日最新資訊28at.com

rUB28資訊網(wǎng)——每日最新資訊28at.com

在下面配置的環(huán)境變量參數(shù)中,設(shè)置的配置中心地址為 http://service-apollo-config-server-dev.mydlqclub:8080,這是因為 Apollo 部署在 K8S 環(huán)境中,且可以使用域名方式訪問,service-apollo-config-server-dev 是應(yīng)用的 Service 名稱,mydlqcloud 是 K8S 下的 Namespace 名稱。rUB28資訊網(wǎng)——每日最新資訊28at.com

rUB28資訊網(wǎng)——每日最新資訊28at.com

springboot-apollo.yamlrUB28資訊網(wǎng)——每日最新資訊28at.com

apiVersion: v1kind: Servicemetadata:  name: springboot-apollospec:  type: NodePort  ports:    - name: server      nodePort: 31080      port: 8080      targetPort: 8080    - name: management      nodePort: 31081      port: 8081      targetPort: 8081  selector:    app: springboot-apollo---apiVersion: apps/v1kind: Deploymentmetadata:  name: springboot-apollo  labels:    app: springboot-apollospec:  replicas: 1  selector:    matchLabels:      app: springboot-apollo  template:    metadata:      name: springboot-apollo      labels:        app: springboot-apollo    spec:      restartPolicy: Always      containers:        - name: springboot-apollo          image: mydlqclub/springboot-apollo:0.0.1          imagePullPolicy: Always          ports:            - containerPort: 8080              name: server          env:            - name: JAVA_OPTS              value: "-Denv=DEV"              ##注意修改此處的 mydlqcloud 為你自己的 Namespace 名稱            - name: APP_OPTS              value: "                     --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: 1000Mi              cpu: 1000m            requests:              memory: 500Mi              cpu: 500m

(2)、部署 SpringBoot 應(yīng)用到 KubernetesrUB28資訊網(wǎng)——每日最新資訊28at.com

-n:創(chuàng)建應(yīng)用到指定的 Namespace 中。rUB28資訊網(wǎng)——每日最新資訊28at.com

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

BASHrUB28資訊網(wǎng)——每日最新資訊28at.com

3、測試部署的應(yīng)用接口

上面的應(yīng)用配置了 NodePort 端口,可以通過此端口訪問 Kubernetes 集群內(nèi)的應(yīng)用接口,本人 Kubernetes 集群地址為 192.168.2.11 且 NodePort 端口為 31081,所以瀏覽器訪問地址 http://192.168.2.11:31081/test 來測試接口,顯示:rUB28資訊網(wǎng)——每日最新資訊28at.com

test的值為:123456

可以看到能通過 Apollo 獲取參數(shù)值,此文章到此結(jié)束。rUB28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-58931-0.htmlApollo,真香!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 歐洲的編程語言三巨頭,只剩下一位了!

下一篇: 您不知道的 JS with 語句,讓我來告訴您!

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 库尔勒市| 翁牛特旗| 井陉县| 霍州市| 伊宁市| 格尔木市| 怀化市| 乐昌市| 乌拉特中旗| 康定县| 毕节市| 连山| 青阳县| 祥云县| 汕头市| 义乌市| 云浮市| 开平市| 郯城县| 始兴县| 句容市| 永州市| 若羌县| 浙江省| 绥化市| 临漳县| 内乡县| 贡嘎县| 磐石市| 图木舒克市| 清流县| 武清区| 略阳县| 莆田市| 金乡县| 峨眉山市| 十堰市| 青浦区| 酒泉市| 新宾| 即墨市|