Apollo配置中心,配置也能夠「智能」

思惟導圖

文章已收錄Github精選,歡迎Star:https://github.com/yehongzhi/learningSummaryjava

1、概述

Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。mysql

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

2、爲何使用配置中心

首先,沒有配置中心以前傳統的配置都是寫在配置文件中,好比各類yml、perproties、xml文件。程序員

寫在各類文件裏最大的問題在於若是須要改配置信息,須要從新部署發佈應用才能生效,這是第一個問題。github

後面爲了作到動態讀取配置信息,後面有人改進一下把配置信息存儲在數據庫的一張表,程序讀取表中的配置信息,這種方式不少公司都還在使用,由於簡單,並且靈活(修改配置只須要執行個SQL語句,不須要從新部署發佈)。可是也不是最完美的,由於缺乏了權限控制,沒有管理界面進行統一配置,沒有歷史版本的配置信息,不支持回滾(防止誤操做)web

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

相對其餘的,我以爲選擇Apollo的緣由是,界面比較美觀,操做簡便,部署簡單,依賴較少,開箱即用。sql

3、安裝部署

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

這裏部署建議不要用官網的Quick Start,我一開始使用QuickStart的方式,搞了幾個鐘頭搞不定,老是在Eureka上多了一個UNKONWN的服務,而後又沒法訪問8070的管理界面,心態直接崩潰。上github找了一下,以下:緩存

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

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

因此接下來就講標準部署,也就是分佈式部署,有耐心的同窗也能夠直接去github看做者寫的分佈式部署指南。

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

這裏有兩種安裝方式,一種是下載安裝包,另外一種是經過源碼構建。通常若是不須要對Apollo定製開發,直接用安裝包部署便可。我這裏演示的就是安裝包部署的方式。

3.1 獲取安裝包

先到官網下載安裝包。

下載後解壓,以下:

3.2 建立數據庫

使用MySQL數據庫(版本要求:5.6.5+)。

3.2.1 建立ApolloPortalDB數據庫

使用github上面的sql腳本建立ApolloPortalDB數據庫,導入相關的表以及數據。

3.2.2 建立ApolloConfigDB數據庫

使用github上面的sql腳本建立ApolloConfigDB數據庫,導入相關的表以及數據。

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.4.1 部署發佈apollo-configservice

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

有可能會出現這個錯誤(我就出現了),不用擔憂,實際上進程尚未結束,還在啓動,咱們能夠到日誌記錄的文件夾(下圖來源於startup.sh腳本)查看日誌。

啓動時間比較長,由於這個服務包括啓動Eureka註冊中心,須要耐心等待。觀察apollo-configservice.log文件,當看到以下信息後,表示啓動成功。

Eureka註冊中心啓動成功,能夠打開http://192.168.0.107:8080/查看:

3.4.2 部署發佈apollo-adminservice

接着發佈apollo-adminservice,直接執行scripts/startup.sh。查看日誌的方式跟上面同樣。啓動成功後,能夠看到Eureka的服務列表中多了一個服務。

3.4.3 部署發佈apollo-portal

接着發佈apollo-portal,直接執行scripts/startup.sh。portal是提供Web界面的服務,因此啓動成功後,能夠打開http://192.168.0.107:8070/登陸web界面,默認帳號密碼是apollo/admin。

到此,安裝就完成了!

4、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。

第二種經過配置文件。

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

env=DEV

4.5 @EnableApolloConfig

在啓動類上加上註解@EnableApolloConfig。

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

4.6 測試類

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

@RestController
public class ApolloController {

    //冒號後面的是默認值
    @Value("${configValue:default}")
    private String configValue;

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

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

第一步,建立項目。

第二步,建立配置。

第三步,發佈。

4.8 測試

啓動項目apollo-demo,而後請求路徑http://localhost:8888/apollo/getConfig,能夠看到:

控制檯能夠看到推送配置信息的日誌:

5、架構設計

講完了安裝和SpringBoot整合的demo後,咱們是時候探究一下原理,爲何要有三個服務,又是如何作到配置信息發佈後,客戶端實時獲取到最新的配置的。繼續往下看。

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

5.1 基礎模型

做者在官網上有個基礎模型的架構圖,忽略掉不少細節後實際上很是簡單:

  1. 用戶在配置中心對配置進行修改併發布。
  2. 配置中心通知Apollo客戶端有配置更新。
  3. Apollo客戶端從配置中心拉取最新的配置、更新本地配置並通知到應用。

5.2 架構模塊

若是咱們把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 配置發佈後的實時推送設計

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

上圖簡要描述了配置發佈的大體過程:

  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後,會通知對應的客戶端。

在實現上,考慮到Apollo的實際使用場景,以及爲了儘量減小外部依賴,咱們沒有采用外部的消息中間件,而是經過數據庫實現了一個簡單的消息隊列。----來自官網

5.4 高可用

Apollo爲了實現高可用,服務端使用了Eureka做爲註冊中心,這一點在官網也有談到。

除此以外,客戶端也作了高可用的一些架構設計,好比本地文件緩存。

這個緩存文件默認就放在C:\opt\data\apollo-demo\config-cache路徑下:

這個文件的做用是,在遇到服務不可用,或網絡不通的時候,依然能從本地恢復配置。

6、絮叨

這篇文章就講到這裏。其實Apollo配置中心算是一個比較容易上手,架構相對比較清晰的開源項目。目前不少互聯網公司都在推行微服務架構,在使用微服務的架構時,配置信息就會成倍數增長,由於配置實際上表明的是「控制」,不少時候程序的運行是靠配置去決定行爲的,並且要能實時生效的,因此就必需要有個配置中心。

有些公司體量大一些會本身公司開發一套配置中心,其實實現起來也不是特別難,我上一間公司就本身實現,使用MQ消息隊列+數據庫,再本身簡單地搭了一個增刪改查、刷新配置的web頁面,就完成了一個配置中心。

可是我以爲若是有現成的開源的會更加舒服,不用本身造輪子耗費時間,精力,並且選一些像Apollo這種比較大衆主流的技術框架,學習成本也比較低,網上有不少資料。

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

https://github.com/yehongzhi/mall

以爲有用就點個贊吧,你的點贊是我創做的最大動力~

拒絕作一條鹹魚,我是一個努力讓你們記住的程序員。咱們下期再見!!!

能力有限,若是有什麼錯誤或者不當之處,請你們批評指正,一塊兒學習交流!

本文分享自微信公衆號 - java技術愛好者(yehongzhi_java)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索