1. 程式人生 > >Spring Cloud 系列之 Apollo 配置中心(一)

Spring Cloud 系列之 Apollo 配置中心(一)

背景

隨著程式功能的日益複雜,程式的配置日益增多:各種功能的開關、引數的配置、伺服器的地址等等。

對程式配置的期望值也越來越高:配置修改後實時生效,灰度釋出,分環境、分叢集管理配置,完善的許可權、稽核機制等等。

在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理的需求。

Apollo 配置中心應運而生!Apollo - 一個可靠的配置管理系統。

Apollo 介紹

Apollo(阿波羅)是攜程框架部門研發的分散式配置中心,能夠集中化管理應用不同環境、不同叢集的配置,配置修改後能夠實時推送到應用端,並且具備規範的許可權、流程治理等特性,適用於微服務配置管理場景。服務端基於 Spring Boot 和 Spring Cloud 開發,打包後可以直接執行,不需要額外安裝 Tomcat 等應用容器。

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

  1. application (應用)
  2. environment (環境)
  3. cluster (叢集)
  4. namespace (名稱空間 Namespace 是配置項的集合,類似於一個配置檔案的概念)

同時,Apollo 基於開源模式開發,開源地址:https://github.com/ctripcorp/apollo

官網文件:https://github.com/ctripcorp/apollo/wiki/Quick-Start

演示環境(Demo):

  • http://106.54.227.205/
  • 賬號/密碼:apollo/admin

上圖是Apollo配置中心中一個專案的配置首頁

  • 在頁面左上方的環境列表模組展示了所有的環境和叢集,使用者可以隨時切換。
  • 頁面中央展示了兩個namespace(application和FX.apollo)的配置資訊,預設按照表格模式展示、編輯。使用者也可以切換到文字模式,以檔案形式檢視、編輯。
  • 頁面上可以方便地進行釋出、回滾、灰度、授權、檢視更改歷史和釋出歷史等操作。

Apollo 核心概念

  1. 「application (應用)」
    • 這個很好理解,就是實際使用配置的應用,Apollo客戶端在執行時需要知道當前應用是誰,從而可以去獲取對應的配置
    • 每個應用都需要有唯一的身份標識 -- appId,我們認為應用身份是跟著程式碼走的,所以需要在程式碼中配置,具體資訊請參見Java客戶端使用指南。
  2. 「environment (環境)」
    • 配置對應的環境,Apollo客戶端在執行時需要知道當前應用處於哪個環境,從而可以去獲取應用的配置
    • 我們認為環境和程式碼無關,同一份程式碼部署在不同的環境就應該能夠獲取到不同環境的配置
    • 所以環境預設是通過讀取機器上的配置(server.properties中的env屬性)指定的,不過為了開發方便,我們也支援執行時通過System Property等指定,具體資訊請參見Java客戶端使用指南。
  3. 「cluster (叢集)」
    • 一個應用下不同例項的分組,比如典型的可以按照資料中心分,把上海機房的應用例項分為一個叢集,把北京機房的應用例項分為另一個叢集。
    • 對不同的cluster,同一個配置可以有不一樣的值,如zookeeper地址。
    • 叢集預設是通過讀取機器上的配置(server.properties中的idc屬性)指定的,不過也支援執行時通過System Property指定,具體資訊請參見Java客戶端使用指南。
  4. 「namespace (名稱空間)」
    • 一個應用下不同配置的分組,可以簡單地把namespace類比為檔案,不同型別的配置存放在不同的檔案中,如資料庫配置檔案,RPC配置檔案,應用自身的配置檔案等
    • 應用可以直接讀取到公共元件的配置namespace,如DAL,RPC等
    • 應用也可以通過繼承公共元件的配置namespace來對公共元件的配置做調整,如DAL的初始資料庫連線數

Apollo 特性

  • 「統一管理不同環境、不同叢集的配置」
    • Apollo提供了一個統一介面集中式管理不同環境(environment)、不同叢集(cluster)、不同名稱空間(namespace)的配置。
    • 同一份程式碼部署在不同的叢集,可以有不同的配置,比如zk的地址等
    • 通過名稱空間(namespace)可以很方便的支援多個不同應用共享同一份配置,同時還允許應用對共享的配置進行覆蓋
    • 配置介面支援多語言(中文,English)
  • 「配置修改實時生效(熱釋出)」
    • 使用者在Apollo修改完配置併發布後,客戶端能實時(1秒)接收到最新的配置,並通知到應用程式。
  • 「版本釋出管理」
    • 所有的配置釋出都有版本概念,從而可以方便的支援配置的回滾。
  • 「灰度釋出」
    • 支援配置的灰度釋出,比如點了釋出後,只對部分應用例項生效,等觀察一段時間沒問題後再推給所有應用例項。
  • 「許可權管理、釋出稽核、操作審計」
    • 應用和配置的管理都有完善的許可權管理機制,對配置的管理還分為了編輯和釋出兩個環節,從而減少人為的錯誤。
    • 所有的操作都有審計日誌,可以方便的追蹤問題。
  • 「客戶端配置資訊監控」
    • 可以方便的看到配置在被哪些例項使用
  • 「提供Java和.Net原生客戶端」
    • 提供了Java和.Net的原生客戶端,方便應用整合
    • 支援Spring Placeholder,Annotation和Spring Boot的ConfigurationProperties,方便應用使用(需要Spring 3.1.1+)
    • 同時提供了Http介面,非Java和.Net應用也可以方便的使用
  • 「提供開放平臺API」
    • Apollo自身提供了比較完善的統一配置管理介面,支援多環境、多資料中心配置管理、許可權、流程治理等特性。
    • 不過Apollo出於通用性考慮,對配置的修改不會做過多限制,只要符合基本的格式就能夠儲存。
    • 在我們的調研中發現,對於有些使用方,它們的配置可能會有比較複雜的格式,如xml, json,需要對格式做校驗。
    • 還有一些使用方如DAL,不僅有特定的格式,而且對輸入的值也需要進行校驗後方可儲存,如檢查資料庫、使用者名稱和密碼是否匹配。
    • 對於這類應用,Apollo支援應用方通過開放介面在Apollo進行配置的修改和釋出,並且具備完善的授權和許可權控制
  • 「部署簡單」
    • 配置中心作為基礎服務,可用性要求非常高,這就要求Apollo對外部依賴儘可能地少
    • 目前唯一的外部依賴是MySQL,所以部署非常簡單,只要安裝好Java和MySQL就可以讓Apollo跑起來
    • Apollo還提供了打包指令碼,一鍵就可以生成所有需要的安裝包,並且支援自定義執行時引數

Apollo 總體設計

官方文件:https://github.com/ctripcorp/apollo/wiki/Apollo配置中心設計

架構模組

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

  • Config Service提供配置的讀取、推送等功能,服務物件是Apollo客戶端(我們自己的微服務應用)
  • Admin Service提供配置的修改、釋出等功能,服務物件是Apollo Portal(管理介面)
  • Config Service和Admin Service都是多例項、無狀態部署,所以需要將自己註冊到Eureka中並保持心跳
  • 在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.3 各模組概要介紹

1.3.1 Config Service

  • 提供配置獲取介面
  • 提供配置更新推送介面(基於Http long polling)
    • 服務端使用Spring DeferredResult實現非同步化,從而大大增加長連線數量
    • 目前使用的tomcat embed預設配置是最多10000個連線(可以調整),使用了4C8G的虛擬機器實測可以支撐10000個連線,所以滿足需求(一個應用例項只會發起一個長連線)。
  • 介面服務物件為Apollo客戶端

1.3.2 Admin Service

  • 提供配置管理介面
  • 提供配置修改、釋出等介面
  • 介面服務物件為Portal

1.3.3 Meta Server

  • Portal通過域名訪問Meta Server獲取Admin Service服務列表(IP+Port)
  • Client通過域名訪問Meta Server獲取Config Service服務列表(IP+Port)
  • Meta Server從Eureka獲取Config Service和Admin Service的服務資訊,相當於是一個Eureka Client
  • 增設一個Meta Server的角色主要是為了封裝服務發現的細節,對Portal和Client而言,永遠通過一個Http介面獲取Admin Service和Config Service的服務資訊,而不需要關心背後實際的服務註冊和發現元件
  • Meta Server只是一個邏輯角色,在部署時和Config Service是在一個JVM程序中的,所以IP、埠和Config Service一致

1.3.4 Eureka

  • 基於Eureka和Spring Cloud Netflix提供服務註冊和發現
  • Config Service和Admin Service會向Eureka註冊服務,並保持心跳
  • 為了簡單起見,目前Eureka在部署時和Config Service是在一個JVM程序中的(通過Spring Cloud Netflix)

1.3.5 Portal

  • 提供Web介面供使用者管理配置
  • 通過Meta Server獲取Admin Service服務列表(IP+Port),通過IP+Port訪問服務
  • 在Portal側做load balance、錯誤重試

1.3.6 Client

  • Apollo提供的客戶端程式,為應用提供配置獲取、實時更新等功能
  • 通過Meta Server獲取Config Service服務列表(IP+Port),通過IP+Port訪問服務
  • 在Client側做load balance、錯誤重試

服務端

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

  1. 使用者在Portal操作配置釋出
  2. Portal呼叫Admin Service的介面操作釋出
  3. Admin Service釋出配置後,傳送ReleaseMessage給各個Config Service
  4. Config Service收到ReleaseMessage後,通知對應的客戶端

客戶端

上圖簡要描述了Apollo客戶端的實現原理:

  1. 客戶端和服務端保持了一個長連線,從而能第一時間獲得配置更新的推送。(通過Http Long Polling實現)
  2. 客戶端還會定時從Apollo配置中心服務端拉取應用的最新配置。
    • 這是一個fallback機制,為了防止推送機制失效導致配置不更新
    • 客戶端定時拉取會上報本地版本,所以一般情況下,對於定時拉取的操作,服務端都會返回304 - Not Modified
    • 定時頻率預設為每5分鐘拉取一次,客戶端也可以通過在執行時指定System Property: apollo.refreshInterval來覆蓋,單位為分鐘。
  3. 客戶端從Apollo配置中心服務端獲取到應用的最新配置後,會儲存在記憶體中
  4. 客戶端會把從服務端獲取到的配置在本地檔案系統快取一份
    • 在遇到服務不可用,或網路不通的時候,依然能從本地恢復配置
  5. 應用程式可以從Apollo客戶端獲取最新的配置、訂閱配置更新通知

環境準備

點選連結觀看:Apollo 搭建服務端視訊(獲取更多請關注公眾號「哈嘍沃德先生」)

Java

  • Apollo 服務端:1.8+
  • Apollo 客戶端:1.7+

由於需要同時啟動服務端和客戶端,所以建議安裝Java 1.8+。

MySQL

  • 版本要求:5.6.5+

Apollo的表結構對timestamp使用了多個default宣告,所以需要5.6.5以上版本。

下載Quick Start安裝包

Apollo 給我們準備好了一個Quick Start安裝包,大家只需要下載到本地,就可以直接使用,免去了編譯、打包過程。

安裝包共50M,如果訪問github網速不給力的話,可以從百度網盤下載。

  1. 從Github下載
    • checkout或下載apollo-build-scripts專案
    • 由於Quick Start專案比較大,所以放在了另外的repository,請注意專案地址
      • https://github.com/nobodyiam/apollo-build-scripts
  2. 從百度網盤下載
    • 通過https://github.com/ctripcorp/apollo/wiki/Quick-Start#13-下載quick-start安裝包頁面的網盤連結下載
    • 下載到本地後,在本地解壓apollo-quick-start.zip
  3. 為啥安裝包要58M這麼大?
    • 因為這是一個可以自啟動的jar包,裡面包含了所有依賴jar包以及一個內建的tomcat容器

安裝 Apollo

建立資料庫

Apollo 服務端共需要兩個資料庫:ApolloPortalDBApolloConfigDB,我們把資料庫、表的建立和樣例資料都分別準備了 sql 檔案,只需要匯入資料庫即可。

注意:如果你本地已經建立過Apollo資料庫,請注意備份資料。我們準備的sql檔案會清空Apollo相關的表。

建立 ApolloPortalDB 資料庫

通過各種MySQL客戶端匯入sql/apolloportaldb.sql即可。

建立 ApolloConfigDB 資料庫

通過各種MySQL客戶端匯入sql/apolloconfigdb.sql即可。

配置資料庫連線資訊

Apollo 服務端需要知道如何連線到你前面建立的資料庫,所以需要編輯demo.sh,修改 ApolloPortalDB 和 ApolloConfigDB 相關的資料庫連線串資訊。

注意:填入的使用者需要具備對 ApolloPortalDB 和 ApolloConfigDB 資料的讀寫許可權。

#apollo config db info
apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=使用者名稱
apollo_config_db_password=密碼(如果沒有密碼,留空即可)

# apollo portal db info
apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=使用者名稱
apollo_portal_db_password=密碼(如果沒有密碼,留空即可)

注意:不要修改 demo.sh 的其它部分

搭建服務端

確保埠未被佔用

Quick Start指令碼會在本地啟動3個服務,分別使用8070, 8080, 8090埠,請確保這3個埠當前沒有被使用。

執行啟動指令碼

./demo.sh start

Apollo 提供的指令碼檔案為 .sh 檔案,如果你的安裝環境是在 Linux 系統下直接執行以上命令即可,如果你想在 Windows 環境下執行該指令碼,先安裝 Git 然後在 demo.sh 所在目錄下滑鼠右鍵點選 Git Bash Here,然後再通過以上命令執行指令碼即可。

當看到如下輸出後,就說明啟動成功了!

==== starting service ====
Service logging file is ./service/apollo-service.log
Started [10768]
Waiting for config service startup.......
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup....
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Started [10846]
Waiting for portal startup......
Portal started. You can visit http://localhost:8070 now!

相關推薦

Spring Cloud 系列 Apollo 配置中心

背景 隨著程式功能的日益複雜,程式的配置日益增多:各種功能的開關、引數的配置、伺服器的地址等等。 對程式配置的期望值也越來越高:配置修改後實時生效,灰度釋出,分環境、分叢集管理配置,完善的許可權、稽核機制等等。 在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理

Spring Cloud 系列 Apollo 配置中心

本篇文章為系列文章,未讀第一集的同學請猛戳這裡:Spring Cloud 系列之 Apollo 配置中心(一) 本篇文章講解 Apollo 部門管理、使用者管理、配置管理、叢集管理。 點選連結觀看:Apollo 部門管理、使用者管理、配置管理、叢集管理視訊(獲取更多請關注公眾號「哈嘍沃德先生」) 部門及使

Spring Cloud 系列 Apollo 配置中心

本篇文章為系列文章,未讀前幾集的同學請猛戳這裡: Spring Cloud 系列之 Apollo 配置中心(一)Spring Cloud 系列之 Apollo 配置中心(二)Spring Cloud 系列之 Apollo 配置中心(三) 本篇文章講解 Apollo 高可用環境搭建,灰度釋出,教大家搭建企業中

Spring Cloud 系列 Config 配置中心

## 服務配置現狀      配置檔案是我們再熟悉不過的,在微服務系統中,每個微服務不僅僅只有程式碼,還需要**連線其他資源**,例如資料庫的配置或功能性的開關 MySQL、Redis 、Security 等相關的配置。除了專案執行的基礎配置之外,還有一些配置是與我們業務有關係的,比如說七牛儲存、簡訊和郵

Spring Cloud 系列 Config 配置中心

本篇文章為系列文章,未讀第一集的同學請猛戳這裡:Spring Cloud 系列之 Config 配置中心(一) 本篇文章講解 Config 如何實現配置中心自動重新整理。 配置中心自動重新整理 點選連結觀看:配置中心自動重新整理視訊(獲取更多請關注公眾號「哈嘍沃德先生」) Spring Cloud Con

Spring Cloud 系列 Config 配置中心

本篇文章為系列文章,未讀前幾集的同學請猛戳這裡: Spring Cloud 系列之 Config 配置中心(一)Spring Cloud 系列之 Config 配置中心(二) 本篇文章講解 Config 如何實現配置中心加解密,配置中心使用者安全認證。 配置中心加解密 考慮這樣一個問題:所有的配置檔案都

Spring Cloud 系列 Consul 配置中心

前面我們已經學習過 Spring Cloud Config 了: Spring Cloud 系列之 Config 配置中心(一)Spring Cloud 系列之 Config 配置中心(二)Spring Cloud 系列之 Config 配置中心(三) 它提供了配置中心的功能,但是需要配合 git、svn

Spring Cloud微服架構分散式配置中心

本文接之前的《Spring Cloud微服架構之分散式配置中心》,繼續來說說Spring Cloud Config的使用。 先來回顧一下,在前文中我們完成了什麼: 構建了config-server,連線到Git倉庫 在Git上建立了一個config-repo目錄,用來儲

Spring Cloud入門:分散式配置中心Spring Cloud Config

文章例項使用的Spring Cloud版本為Finchley.SR1,Spring Boot版本為2.0.4。 1 Spring Cloud Config Spring Cloud Config是Spring Cloud團隊建立的一個全新專案,用來為分散式系統中的基礎設

spring cloud系列教程(13)---配置中心初步

給大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油 ​  1.微服務面臨的問題,配置檔案 微服務意味著要將單體應用中的業務拆分成一個個子服務,每個子服務的粒度相對較小,因此係統中會出現大量的服務。由於每個服務都需要必要的配置資訊才能執行,所以一套集中式的,動態的配置管理設

spring cloud config 配置中心

微服務的基礎服務之一,可以使用Apollo 代替,後續補充,也可以自己搭建 https://github.com/ctr

Spring Cloud 系列 ZooKeeper 註冊中心

## 什麼是註冊中心      服務註冊中心是服務實現服務化管理的核心元件,類似於目錄服務的作用,主要用來儲存服務資訊,譬如提供者 url 串、路由資訊等。服務註冊中心是微服務架構中最基礎的設施之一。   註冊中心可以說是微服務架構中的“通訊錄”,它記錄了服務和服務地址的對映關係。在分散式架構中,服務會

spring-cloud學習筆記Eureka註冊中心修改成IP顯示

修改配置類 eureka: instance: #使用IP訪問註冊中心 prefer-ip-address: true #在註冊中心status的時候顯示的格式,這裡是 ip:埠 instance-id: ${spring.cloud.c

Spring Cloud Zuul中路由配置細節14

轉自 https://blog.csdn.net/u012702547/article/details/77823434 這個系列我感覺真的太好了,可以一步一步的瞭解spring cloud 的搭建以及更深層次的東西,對想學這門技術的朋友真的入門特別的快,感謝這位大哥的分享,我也會持續

Spring MVC系列模型繫結SpringBoot

前言 上一節我們在SpringBoot中啟用了Spring MVC最終輸出了HelloWorld,本節我們來講講Spring MVC中的模型繫結,這個名稱來源於.NET或.NET Core,不知是否恰當,我們暫且這樣理解吧。 @RequestParam VS  @PathVariable &n

Spring Cloud 入門Eureka -Consumer服務消費

ppi package AR con .so 1.8 Coding ng- int 這裏介紹:LoadBalancerClient接口,它是一個負載均衡客戶端的抽象定義,下面我們就看看如何使用Spring Cloud提供的負載均衡器客戶端接口來實現服務的消費。 引用之前的文

Docker系列CentOS7安裝Docker

add 程序 發布 更新 介紹 entos star alt ice 0、前言 整體架構目錄:ASP.NET Core分布式項目實戰-目錄 一、瞎扯淡(只講有用的) 感興趣的同學可以上網搜索一下docker具體的介紹。我這邊主要介紹偏實戰的內容,不喜勿噴,有問題也請

spring原始碼學習路---IOC初探

首先把spring原始碼匯入,怎麼匯入百度下。 首先我們來說一下IOC,IOC是spring最核心的理念,包括AOP也要屈居第二,那麼IOC到底是什麼呢,四個字,控制反轉。 網上有不少是這麼解釋IOC的,說IOC是將物件的建立和依賴關係交給容器,這句話我相信不少人都知道,在我個人的理解

Spring Cloud---Zuul閘道器篇 -----Zuul請求流程解析簡化

前述:Spring Zuul是Spring微服務的閘道器,作為微服務的入口,用來統一管理請求。Zuul不是把閘道器的所有事情都做了,而是暴露了當前請求的整個過程生命週期的處理。實際閘道器的實現邏輯還是需要我們自己處理,在解析完Zuul後我會提供一個閘道器限流的方案例項,並對其做擴充套件,以為

Spring Boot開發明月千城

D:\soft\Java\jdk1.7.0_04\bin\java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\idea\ideainstall\IntelliJ IDEA 14.0.2\bin" -Dfile.encoding=UTF-8 -