天天看點

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

思維導圖

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨
文章已收錄Github精選,歡迎Star: https://github.com/yehongzhi/learningSummary

一、概述

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

目前Apollo在github有22.6k顆星,在官網登記的使用的公司有451家,算是很流行的配置中心的架構技術。是以接下來跟着我一起學習Apollo配置中心吧。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

二、為什麼使用配置中心

首先,沒有配置中心之前傳統的配置都是寫在配置檔案中,比如各種yml、perproties、xml檔案。

寫在各種檔案裡最大的問題在于如果需要改配置資訊,需要重新部署釋出應用才能生效,這是第一個問題。

後面為了做到動态讀取配置資訊,後面有人改進一下把配置資訊存儲在資料庫的一張表,程式讀取表中的配置資訊,這種方式很多公司都還在使用,因為簡單,而且靈活(修改配置隻需要執行個SQL語句,不需要重新部署釋出)。但是也不是最完美的,因為缺少了權限控制,沒有管理界面進行統一配置,沒有曆史版本的配置資訊,不支援復原(防止誤操作)。

實際上配置中心在市面上已經有很多,比如Nacos、Consul、spring-cloud-config、Apollo等等。

相對其他的,我覺得選擇Apollo的原因是,界面比較美觀,操作簡便,部署簡單,依賴較少,開箱即用。

三、安裝部署

首先要講一下Apollo部署三個服務apollo-configservice,apollo-adminservice,apollo-portal,後面我講架構設計時會講一下這三個服務是用來幹嘛的。

這裡部署建議不要用官網的Quick Start,我一開始使用QuickStart的方式,搞了幾個鐘頭搞不定,總是在Eureka上多了一個UNKONWN的服務,然後又無法通路8070的管理界面,心态直接崩潰。上github找了一下,如下:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

作者在下面的回答是這樣的。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

這個問題發現不止有一個issue(#2931)反映了,但是沒有解決,作者建議使用标準部署。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

是以接下來就講标準部署,也就是分布式部署,有耐心的同學也可以直接去github看作者寫的

分布式部署指南

先介紹一下環境依賴,Linux伺服器(建議CentOS7),MySQL(版本要求:5.6.5+),部署的伺服器需要安裝JDK環境(java 1.8+)。

這裡有兩種安裝方式,一種是下載下傳安裝包,另一種是通過源碼建構。一般如果不需要對Apollo定制開發,直接用安裝包部署即可。我這裡示範的就是安裝包部署的方式。

3.1 擷取安裝包

先到

官網

下載下傳安裝包。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

下載下傳後解壓,如下:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

3.2 建立資料庫

使用MySQL資料庫(版本要求:5.6.5+)。

3.2.1 建立ApolloPortalDB資料庫

使用

github上面的sql腳本

建立ApolloPortalDB資料庫,導入相關的表以及資料。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

3.2.2 建立ApolloConfigDB資料庫

建立ApolloConfigDB資料庫,導入相關的表以及資料。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

3.3 修改配置

需要改一下資料庫連接配接資訊,路徑在/config下。

3.3.1 apollo-configservice配置

修改apollo-configservice的資料庫連接配接資訊application-github.properties,如下:

# DataSource
spring.datasource.url = jdbc:mysql://192.168.0.107:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = 賬号
spring.datasource.password = 密碼           

3.3.2 apollo-adminservice配置

修改apollo-adminservice的資料庫連接配接資訊application-github.properties,如下:

# DataSource
spring.datasource.url = jdbc:mysql://192.168.0.107:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = 賬号
spring.datasource.password = 密碼           

3.3.3 apollo-portal配置

修改apollo-portal的資料庫連接配接資訊application-github.properties,如下:

# DataSource
spring.datasource.url = jdbc:mysql://192.168.0.107:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = 賬号
spring.datasource.password = 密碼           

再修改apollo-env.properties配置,這是關于環境配置的,如下:

local.meta=http://localhost:8080
## 開發環境
dev.meta=http://192.168.0.107:8080
## 不需要配置的環境參考${lpt_meta}配置
fat.meta=${fat_meta}
uat.meta=${uat_meta}
lpt.meta=${lpt_meta}
pro.meta=${pro_meta}           

3.4 部署

然後把三個檔案夾都上傳到Linux伺服器。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

3.4.1 部署釋出apollo-configservice

部署釋出服務有順序,首先釋出apollo-configservice,直接執行scripts/startup.sh。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

有可能會出現這個錯誤(我就出現了),不用擔心,實際上程序還沒有結束,還在啟動,我們可以到日志記錄的檔案夾(下圖來源于startup.sh腳本)檢視日志。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

啟動時間比較長,因為這個服務包括啟動Eureka注冊中心,需要耐心等待。觀察apollo-configservice.log檔案,當看到如下資訊後,表示啟動成功。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

Eureka注冊中心啟動成功,可以打開

http://192.168.0.107:8080/

檢視:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

3.4.2 部署釋出apollo-adminservice

接着釋出apollo-adminservice,直接執行scripts/startup.sh。檢視日志的方式跟上面一樣。啟動成功後,可以看到Eureka的服務清單中多了一個服務。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

3.4.3 部署釋出apollo-portal

接着釋出apollo-portal,直接執行scripts/startup.sh。portal是提供Web界面的服務,是以啟動成功後,可以打開

http://192.168.0.107:8070/

登入web界面,預設賬号密碼是apollo/admin。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨
3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

到此,安裝就完成了!

四、SpringBoot整合Apollo

接下來,整一個Demo(相當于java用戶端),使用SpringBoot整合Apollo,實作動态讀取配置。

4.1 Mave依賴

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.1.0</version>
</dependency>           

4.2 AppId

在classpath路徑下,建立/META-INF/app.properties檔案。如下:

# 應用的唯一辨別,後面建立工程需要用到
app.id=apollo-demo           

4.3 Apollo Meta Server

其實就是配置Apollo伺服器的位址。官網提供的方式有很多,我這裡選其中一種比較簡單的方式。在classpath路徑下建立apollo-env.properties檔案,配置如下:

dev.meta=http://192.168.0.107:8080
# fat.meta=http://apollo.fat.xxx.com
# uat.meta=http://apollo.uat.xxx.com
# pro.meta=http://apollo.xxx.com           

4.4 Environment

其實是配置環境,因為上面可以配置四種環境,這裡配置具體選擇哪個環境。這裡介紹兩種方式:

第一種通過Java System Property。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

第二種通過配置檔案。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

到相對應的路徑下建立server.properties,配置如下:

env=DEV           

4.5 @EnableApolloConfig

在啟動類上加上注解@EnableApolloConfig。

@SpringBootApplication
//開啟apollo配置
@EnableApolloConfig
public class ApolloDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApolloDemoApplication.class, args);
    }
}           

4.6 測試類

這樣就完成了,接下來再建立一個Controller進行測試一下。

@RestController
public class ApolloController {

    //冒号後面的是預設值
    @Value("${configValue:default}")
    private String configValue;

    @RequestMapping("/apollo/getConfig")
    public String getConfig() {
        return configValue;
    }
}           

4.7 管理界面建立對應的配置

第一步,建立項目。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨
3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

第二步,建立配置。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

第三步,釋出。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

4.8 測試

啟動項目apollo-demo,然後請求路徑

http://localhost:8888/apollo/getConfig

,可以看到:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

控制台可以看到推送配置資訊的日志:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

五、架構設計

講完了安裝和SpringBoot整合的demo後,我們是時候探究一下原理,為什麼要有三個服務,又是如何做到配置資訊釋出後,用戶端實時擷取到最新的配置的。繼續往下看。

首先看一張官網的架構設計圖。

5.1 基礎模型

作者在官網上有個基礎模型的架構圖,忽略掉很多細節後實際上非常簡單:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨
  1. 使用者在配置中心對配置進行修改并釋出。
  2. 配置中心通知Apollo用戶端有配置更新。
  3. Apollo用戶端從配置中心拉取最新的配置、更新本地配置并通知到應用。

5.2 架構子產品

如果我們把Apollo配置中心服務端展開的話,架構圖如下:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

看到這裡,整個架構看起來就比較清晰了。接下來從上往下簡單介紹一下:

Portal服務:提供Web界面供使用者管理配置,通過MetaServer擷取AdminService服務清單(IP+Port),通過IP+Port通路AdminService服務。

Client:實際上就是我們建立的SpringBoot項目,引入ApolloClient的maven依賴,為應用提供配置擷取、實時更新等功能。

Meta Server:從Eureka擷取Config Service和Admin Service的服務資訊,相當于是一個Eureka Client。主要是為了封裝服務發現的細節,對Portal和Client而言,永遠通過一個Http接口擷取Admin Service和Config Service的服務資訊,而不需要關心背後實際的服務注冊和發現元件。Meta Server隻是一個邏輯角色,在部署時和Config Service是在一個JVM程序中的,是以IP、端口和Config Service一緻。

Eureka:注冊中心。Config Service和Admin Service會向Eureka注冊服務。為了簡單起見,目前Eureka在部署時和Config Service是在一個JVM程序中的。

Config Service:提供配置擷取接口。提供配置更新推送接口(基于Http long polling)。服務對象為Apollo用戶端(Client)。

Admin Service:提供配置管理接口。提供配置釋出、修改等接口。服務對象為Portal。

5.3 配置釋出後的實時推送設計

上面講完各個角色的用途,那這些角色是怎麼配合一起工作的呢,我們來看一張圖:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

上圖簡要描述了配置釋出的大緻過程:

  1. 使用者在Portal操作配置釋出。
  2. Portal調用Admin Service的接口操作釋出。
  3. Admin Service釋出配置後,發送ReleaseMessage給各個Config Service。
  4. Config Service收到ReleaseMessage後,通知對應的用戶端(Client)。

關鍵點在于AdminService發送ReleaseMessage給ConfigService,這一步是如何異步發送的呢,一般異步發送我們很容易想到消息隊列,但是實際上我們在安裝部署時并沒有使用到消息隊列。

答案在于:

  • Admin Service在配置釋出後會往ReleaseMessage表插入一條消息記錄,消息内容就是配置釋出的AppId+Cluster+Namespace。
  • 然後Config Service有一個線程會每秒掃描一次ReleaseMessage表,看看是否有新的消息記錄。
  • Config Service如果發現有新的消息記錄,那麼就會通知到所有的消息監聽器,監聽器得到配置釋出的AppId+Cluster+Namespace後,會通知對應的用戶端。
    3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨
在實作上,考慮到Apollo的實際使用場景,以及為了盡可能減少外部依賴,我們沒有采用外部的消息中間件,而是通過資料庫實作了一個簡單的消息隊列。----來自官網

5.4 高可用

Apollo為了實作高可用,服務端使用了Eureka作為注冊中心,這一點在官網也有談到。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

除此之外,用戶端也做了高可用的一些架構設計,比如本地檔案緩存。

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

這個緩存檔案預設就放在C:optdataapollo-democonfig-cache路徑下:

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨

這個檔案的作用是,在遇到服務不可用,或網絡不通的時候,依然能從本地恢複配置。

六、絮叨

這篇文章就講到這裡。其實Apollo配置中心算是一個比較容易上手,架構相對比較清晰的開源項目。目前很多網際網路公司都在推行微服務架構,在使用微服務的架構時,配置資訊就會成倍數增加,因為配置實際上代表的是“控制”,很多時候程式的運作是靠配置去決定行為的,而且要能實時生效的,是以就必須要有個配置中心。

有些公司體量大一些會自己公司開發一套配置中心,其實實作起來也不是特别難,我上一間公司就自己實作,使用MQ消息隊列+資料庫,再自己簡單地搭了一個增删改查、重新整理配置的web頁面,就完成了一個配置中心。

但是我覺得如果有現成的開源的會更加舒服,不用自己造輪子耗費時間,精力,而且選一些像Apollo這種比較大衆主流的技術架構,學習成本也比較低,網上有很多資料。

那麼Apollo配置中心就講到這裡了,上面所有例子的代碼都上傳Github了:

https://github.com/yehongzhi/mall

覺得有用就點個贊吧,你的點贊是我創作的最大動力~

拒絕做一條鹹魚,我是一個努力讓大家記住的程式員。我們下期再見!!!

3千字Apollo配置中心的總結,讓配置“智能”起來思維導圖一、概述二、為什麼使用配置中心三、安裝部署四、SpringBoot整合Apollo五、架構設計六、絮叨
能力有限,如果有什麼錯誤或者不當之處,請大家批評指正,一起學習交流!