精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Nacos 之外,配置中心不可忽視的另一款 “神器”

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

“配置”的本質是什么呢?

  • 配置的表象,一個配置項可能是key-value,value可能是一個有限值的集合。
  • 從我的理解來說,本質上是因為我們人類沒有辦法掌控和預知一切,所以我們需要人為的預留一些線頭,以便撥弄這些線頭調整系統的飛行狀態。

所以我覺得配置中心是程序運行時動態調整行為能力的一種手段,而且這個是上到生產,在運行時想調整行為的幾乎唯一的一個手段。

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

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                            #是否開啟 Apollo
    namespaces: application                  #設置 Namespace
    eagerLoad:
      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.cnotallow=http://192.168.2.11:30002 -Denv=DEV

圖片 

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

$ java -Dapollo.cnotallow=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.cnotallow=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.cnotallow=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)創建兩個集群

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

圖片圖片

圖片圖片

圖片圖片

(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.timeznotallow=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: NodePort
  ports:
    - name: server
      nodePort: 31080
      port: 8080
      targetPort: 8080
    - name: management
      nodePort: 31081
      port: 8081
      targetPort: 8081
  selector:
    app: springboot-apollo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-apollo
  labels:
    app: springboot-apollo
spec:
  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 應用到 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

可以看到能通過 Apollo 獲取參數值,此文章到此結束。

責任編輯:武曉燕 來源: 架構精進之路
相關推薦

2022-10-09 10:11:30

Python爬蟲神器

2019-02-25 10:18:43

工具代碼測試

2021-04-27 09:00:59

PythonAidLearning編程神器

2014-01-13 15:00:51

InxiLinux硬件

2022-04-20 09:26:08

Mock前端開發工具

2017-08-09 08:18:51

數據中心模型設計

2016-10-20 23:47:21

數據中心節能

2010-10-14 10:25:41

數據中心災難

2023-09-06 08:19:53

2023-06-08 08:46:37

Motrix下載工具

2023-10-06 14:27:10

Linux系統監控

2015-08-21 10:55:52

2025-03-17 09:19:45

2022-06-28 22:13:33

Polars數據處理與分析

2011-09-05 15:20:59

2012-06-15 10:33:06

JavaScript

2022-07-12 09:35:59

JSON可視化工具

2022-09-28 14:33:49

終端工具Linux

2023-11-08 16:18:21

Fedora 39Linux

2022-08-30 22:12:19

Nacos組件服務注冊
點贊
收藏

51CTO技術棧公眾號

日韩精品在线视频观看| 国产欧美一区二区三区在线看蜜臀 | 国精产品一区一区三区视频| 天天操天天操天天干| 免费在线成人网| 色综合久久88色综合天天看泰| 久久久久久久无码| 天堂综合在线播放| 精品国产999| 中文字幕一区二区三区有限公司| 日韩中文字幕影院| 日本欧美一区二区| 97国产真实伦对白精彩视频8| 欧洲美熟女乱又伦| 国产精品18hdxxxⅹ在线| 在线观看中文字幕不卡| 日韩视频 中文字幕| 国产黄色在线播放| 国产成人综合自拍| 国产精品一区二区三区久久久| 九九热这里有精品视频| 日韩精品2区| 日韩av在线直播| 日韩av福利在线观看| 国模套图日韩精品一区二区| 一区二区在线免费| 偷拍盗摄高潮叫床对白清晰| 国产精品一区二区三区四区色| 成人av影院在线| 91在线国产电影| 久久人人爽人人爽人人片av免费| 伊人影院久久| 欧美精品一区二区免费| 91制片厂在线| 日韩电影免费网站| 国产亚洲精品久久久久久| 日本少妇毛茸茸| 国产精品15p| 欧美成人精品福利| 香蕉视频xxxx| 久久av网站| 在线观看91av| 日韩视频在线观看一区二区三区| 精品欧美日韩精品| 欧美日韩中国免费专区在线看| 国产一线二线三线女| free性欧美hd另类精品| 亚洲人成亚洲人成在线观看图片 | 91福利视频免费观看| 亚洲精品乱码日韩| 欧美色视频在线观看| 中文字幕视频在线免费观看| 日本美女久久| 欧美三级视频在线播放| 天天干天天爽天天射| 成人在线黄色| 欧美精品久久99久久在免费线| 黄大色黄女片18第一次| 欧美成人黄色| 91精品国产综合久久久久久久| 邪恶网站在线观看| 超碰国产精品一区二页| 欧美一区二区福利视频| 色综合久久久无码中文字幕波多| 8x国产一区二区三区精品推荐| 欧美精品一区二区三区四区 | 国产日产欧美一区| 天堂av一区二区| 麻豆视频网站在线观看| 亚洲精品成a人| av女优在线播放| 在线黄色的网站 | av网站在线免费看| 国产成人av一区| 精品不卡在线| 国产在线自天天| 亚洲私人影院在线观看| 日b视频免费观看| 都市激情亚洲综合| 欧美日精品一区视频| 日本一二三区在线| 欧美韩一区二区| 中文字幕久久久av一区| 破处女黄色一级片| 一本色道久久综合亚洲精品高清 | 中国a一片一级一片| 精品亚洲免费视频| 国产精品视频500部| 国产在线视频网| 亚洲美腿欧美偷拍| 草草久久久无码国产专区| 日本一区免费网站| 欧美精品一区二区在线观看| 亚洲精品视频网址| 在线成人h网| 国产精品人人做人人爽| 丰满少妇一级片| 日本一区二区在线不卡| 亚洲色欲久久久综合网东京热| 二吊插入一穴一区二区| 欧美一二三在线| 日韩毛片无码永久免费看| 国产精品videosex极品| 国产精品久在线观看| 风流老熟女一区二区三区| 国产精品色在线观看| 国产亚洲黄色片| 电影一区中文字幕| 精品呦交小u女在线| 青青草成人免费| 日本aⅴ亚洲精品中文乱码| 国产精品免费一区二区三区四区| 在线免费观看黄色av| 欧美日韩亚洲一区二区| 日本wwwxx| 久久理论电影| 日本最新高清不卡中文字幕| 国产综合在线播放| 亚洲丝袜自拍清纯另类| 污污视频网站免费观看| 欧美成人午夜77777| 久久av资源网站| 伊人精品在线视频| 国产日韩欧美在线一区| 人妻少妇精品无码专区二区 | 欧美大胆人体bbbb| 婷婷激情四射网| 奇米777欧美一区二区| 免费看成人午夜电影| av电影在线地址| 日韩免费高清av| 午夜精品一区二区三区视频| 国产成人亚洲综合91精品| 日韩欧美精品在线观看视频| 精品国产一区二区三区性色av| 一个色综合导航| 亚洲大片免费观看| www.欧美.com| www插插插无码视频网站| 麻豆精品国产| 欧美超级乱淫片喷水| 国产欧美久久久| 亚洲欧洲精品天堂一级| 天堂一区在线观看| 欧美先锋资源| 国产精品中文字幕在线| 中文字幕在线播放| 欧美亚洲国产一区在线观看网站| 色婷婷av777| 久久精品道一区二区三区| 久久久亚洲综合网站| 电影一区二区三| 中日韩午夜理伦电影免费| 日批视频免费观看| 国产精品免费久久久久| av在线网址导航| 希岛爱理一区二区三区| 亚洲综合在线做性| 国产白丝在线观看| 亚洲精品mp4| 欧美精品亚洲精品日韩精品| 91蜜桃在线免费视频| 久久久精品在线视频| 精品国产乱码久久久久久蜜坠欲下| 日韩av黄色在线观看| 国产福利在线| 91麻豆精品国产自产在线| 欧美成人免费看| 不卡一区二区在线| 韩国一区二区av| 日韩av在线播放网址| 亚洲va欧美va在线观看| 欧美videosex性欧美黑吊| 精品久久久久久久久久久久包黑料 | 亚洲性猛交富婆| 国产精品久久久久影院色老大| 一级黄色片在线免费观看| 亚洲午夜一区| 日本一区二区三区免费看| 91麻豆精品| 97视频在线观看视频免费视频| 国产最新视频在线观看| 欧美精品777| 日本一区二区三区四区五区| 久久久高清一区二区三区| 国产精品自在自线| 亚洲精品在线二区| 亚洲欧洲久久| 美女午夜精品| 成人高h视频在线| 国产激情视频在线看| 日韩中文av在线| 午夜小视频免费| 在线成人午夜影院| 久久99精品波多结衣一区| 中文字幕在线播放不卡一区| 中文字幕一区二区人妻电影丶| 久久国产日韩欧美精品| 奇米精品一区二区三区| 亚洲精品一区二区妖精| 农村寡妇一区二区三区| 日韩中文字幕无砖| 国产成人+综合亚洲+天堂| 性国产高清在线观看| 伊人激情综合网| 五月婷在线视频| 欧美一区二区三区四区视频| 天天射天天干天天| 亚洲成av人片在线| 成人在线观看免费完整| 国产婷婷色一区二区三区| 9.1在线观看免费| 久久黄色级2电影| 久久婷婷国产91天堂综合精品| 黄色在线成人| 亚洲欧美一二三| 91麻豆国产自产在线观看亚洲| 久久伊人一区二区| 福利片一区二区| www.成人av| 国产欧美日韩电影| 国产啪精品视频网站| 欧美国产大片| 青青在线视频一区二区三区| 爱看av在线| 欧美国产精品va在线观看| 黄色网址视频在线观看| 中文字幕少妇一区二区三区| 男人天堂网在线观看| 日韩av在线不卡| 人妻少妇精品无码专区| 日韩欧美综合在线| 国产人妖在线播放| 欧美一区二区三区免费观看视频| 中文字幕在线观看免费| 欧美性一二三区| 中文字幕乱码人妻无码久久 | 亚洲无码久久久久| 在线精品亚洲一区二区不卡| 秋霞av一区二区三区| 欧美性猛交xxxx黑人猛交| 午夜精品三级久久久有码| 黄色成人在线免费| av黄色在线看| 精品国产电影一区| 久久亚洲精品石原莉奈 | 国产又粗又黄又爽的视频| 欧美午夜片在线观看| 成人一二三四区| 欧美系列在线观看| 又骚又黄的视频| 在线播放91灌醉迷j高跟美女| 亚洲一级在线播放| 欧美电影一区二区三区| va婷婷在线免费观看| 精品国产亚洲在线| 香蕉视频国产在线| 亚洲日本成人女熟在线观看| av电影在线观看网址| 日韩在线视频中文字幕| 色呦呦呦在线观看| 午夜免费日韩视频| 国产成人精品123区免费视频| 国产精品美女久久| 国产一区二区三区免费观看在线| 999日本视频| 国产伦乱精品| 欧美一级二级三级| 先锋资源久久| 69sex久久精品国产麻豆| 久久精品女人| 欧美一级小视频| av亚洲精华国产精华| 99久久精品免费视频| 亚洲欧美在线高清| 日本熟妇色xxxxx日本免费看| 欧美性猛交xxxx久久久| 国产一区二区在线视频观看| 精品久久国产字幕高潮| 精品视频一二区| 久久久国产成人精品| 91在线三级| 国产精品无av码在线观看| 伊人www22综合色| 欧美12av| 午夜精品av| 久草精品在线播放| 国产精品一区在线观看你懂的| 国产精品探花一区二区在线观看| 国产欧美视频一区二区| 久久网中文字幕| 欧美视频自拍偷拍| 日韩一级中文字幕| 日韩三级影视基地| 亚洲女同志freevdieo| 成人两性免费视频| 五月综合久久| 色哟哟免费网站| 日韩在线a电影| 在线观看一区二区三区四区| 中文久久乱码一区二区| 日韩成人免费在线视频| 欧美卡1卡2卡| 噜噜噜噜噜在线视频| 欧美精品久久久久a| 婷婷激情成人| 久久99精品久久久久久久青青日本| 日韩片欧美片| 欧美 激情 在线| 北条麻妃国产九九精品视频| 小向美奈子av| 在线观看不卡视频| 天天干,夜夜操| 欧美精品在线网站| 天天综合在线观看| 日韩欧美亚洲在线| 亚洲欧美清纯在线制服| 欧美熟妇另类久久久久久多毛| 日本一区二区三区在线不卡| 欧美三日本三级少妇99| 亚洲大胆美女视频| 手机在线免费看av| 亚洲综合在线做性| 91精品国产自产拍在线观看蜜| 簧片在线免费看| 久久精品免费在线观看| 国产精品乱子伦| 亚洲福利在线播放| av丝袜在线| 国产一区二区三区四区hd| 欧美日韩四区| 人妻少妇偷人精品久久久任期| 国产精品免费aⅴ片在线观看| 无码人妻丰满熟妇精品| 亚洲另类激情图| 伊人久久综合一区二区| 久久久久久久有限公司| 在线午夜精品| 三级黄色片网站| 好吊成人免视频| 日本亚洲一区| 奇米成人av国产一区二区三区| 色天天色综合| 亚洲精品无码久久久久久| 久久久午夜精品理论片中文字幕| 日韩免费视频一区二区视频在线观看| 亚洲精品黄网在线观看| 九色porny丨首页入口在线| 久久99影院| 老司机久久99久久精品播放免费| 美女爆乳18禁www久久久久久 | 国产精品区一区二区三区| 亚洲中文无码av在线| 自拍视频国产精品| 国产精品日本一区二区不卡视频 | 四季久久免费一区二区三区四区| 91亚洲精品久久久| 欧美日韩第一区| 久久久久亚洲AV成人无码国产| 懂色av中文一区二区三区天美| 精品视频一二三| 91精品国产自产在线观看永久| 中文字幕日韩一区二区不卡| 少妇搡bbbb搡bbb搡打电话| 粉嫩av一区二区三区免费野| 麻豆av电影在线观看| 国产中文日韩欧美| 欧美激情91| 黄色a一级视频| 欧美日韩中文一区| 99自拍视频在线观看| 国产自产在线视频一区| 久久综合九色| 加勒比婷婷色综合久久| 亚洲电影在线观看| 91精品xxx在线观看| 欧美与动交zoz0z| bt欧美亚洲午夜电影天堂| 久久精品偷拍视频| 久久国产精品久久精品| 日韩av网址大全| 日本不卡一区二区在线观看| 亚洲一区欧美一区| 国产无套粉嫩白浆在线2022年| 91天堂在线视频| 亚洲欧美成人综合| 小泽玛利亚一区| 亚洲免费电影一区| 精品精品视频| 欧美精品成人网| 亚洲一区二区美女| 成人午夜影视| 国产日韩在线一区二区三区| 青椒成人免费视频| 日本三级片在线观看| 久久九九热免费视频| 伊人成综合网yiren22| 国产成人av免费观看| 欧美性大战久久久久久久蜜臀| 国产91足控脚交在线观看|