隨着程序功能的日益複雜,程序的配置日益增多:各類功能的開關、參數的配置、服務器的地址等等。html
對程序配置的指望值也愈來愈高:配置修改後實時生效,灰度發佈,分環境、分集羣管理配置,完善的權限、審覈機制等等。java
在這樣的大環境下,傳統的經過配置文件、數據庫等方式已經愈來愈沒法知足開發人員對配置管理的需求。mysql
Apollo 配置中心應運而生!Apollo - 一個可靠的配置管理系統。git
Apollo(阿波羅)是攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。服務端基於 Spring Boot 和 Spring Cloud 開發,打包後能夠直接運行,不須要額外安裝 Tomcat 等應用容器。github
Apollo 支持 4 個維度管理 Key-Value 格式的配置:web
同時,Apollo 基於開源模式開發,開源地址:https://github.com/ctripcorp/...spring
官網文檔:https://github.com/ctripcorp/...sql
演示環境(Demo):shell
上圖是Apollo配置中心中一個項目的配置首頁數據庫
application (應用)
environment (環境)
cluster (集羣)
namespace (命名空間)
統一管理不一樣環境、不一樣集羣的配置
配置修改實時生效(熱發佈)
版本發佈管理
灰度發佈
權限管理、發佈審覈、操做審計
客戶端配置信息監控
提供Java和.Net原生客戶端
提供開放平臺API
部署簡單
官方文檔:https://github.com/ctripcorp/apollo/wiki/Apollo配置中心設計
上圖簡要描述了 Apollo 的整體設計,咱們能夠從下往上看:
提供配置更新推送接口(基於Http long polling)
上圖簡要描述了配置發佈的大體過程:
上圖簡要描述了Apollo客戶端的實現原理:
客戶端還會定時從Apollo配置中心服務端拉取應用的最新配置。
apollo.refreshInterval
來覆蓋,單位爲分鐘。客戶端會把從服務端獲取到的配置在本地文件系統緩存一份
點擊連接觀看:Apollo 搭建服務端視頻(獲取更多請關注公衆號「哈嘍沃德先生」)
因爲須要同時啓動服務端和客戶端,因此建議安裝Java 1.8+。
Apollo的表結構對timestamp
使用了多個default聲明,因此須要5.6.5以上版本。
Apollo 給咱們準備好了一個Quick Start安裝包,你們只須要下載到本地,就能夠直接使用,免去了編譯、打包過程。
安裝包共50M,若是訪問github網速不給力的話,能夠從百度網盤下載。
從Github下載
因爲Quick Start項目比較大,因此放在了另外的repository,請注意項目地址
從百度網盤下載
爲啥安裝包要58M這麼大?
Apollo 服務端共須要兩個數據庫:ApolloPortalDB
和ApolloConfigDB
,咱們把數據庫、表的建立和樣例數據都分別準備了 sql 文件,只須要導入數據庫便可。
注意:若是你本地已經建立過Apollo數據庫,請注意備份數據。咱們準備的sql文件會清空Apollo相關的表。
經過各類MySQL客戶端導入sql/apolloportaldb.sql便可。
經過各類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!
若是啓動遇到了異常,能夠分別查看 service 和 portal 目錄下的 log 文件排查問題。
注:在啓動 apollo-configservice 的過程當中會在日誌中輸出 eureka 註冊失敗的信息,如
com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused
。須要注意的是,這個是預期的狀況,由於 apollo-configservice 須要向 Meta Server(它本身)註冊服務,可是由於在啓動過程當中,本身還沒起來,因此會報這個錯。後面會進行重試的動做,因此等本身服務起來後就會註冊正常了。
訪問:http://localhost:8070/ Quick Start 集成了 Spring Security,輸入用戶名 apollo,密碼 admin 後登陸。
登陸成功後,首頁以下,Apollo 還提供了一個 SampleApp
樣本案例供咱們學習使用。
點擊對應按鈕建立項目。
這裏先經過默認的樣例部門演示(後面我會講如何添加部門),AppId 對應客戶端配置文件中 app.id。
建立成功以下圖。
點擊連接觀看:Apollo 客戶端接入服務端視頻(獲取更多請關注公衆號「哈嘍沃德先生」)
下面經過最經常使用、便捷的方式,即基於 Spring Boot 的集成方式來接入服務端。
apollo-demo
聚合工程。Spring Boot 2.2.4.RELEASE
order-service
:訂單服務,端口 9090
order-service02
:訂單服務,端口 9091
<!-- https://mvnrepository.com/artifact/com.ctrip.framework.apollo/apollo-client --> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.6.0</version> </dependency>
order-service
和 order-service02
的配置信息除端口外一致。
server: port: 9090 # 端口 spring: application: name: order-service # 應用名稱 # apollo 相關配置 app: id: order-service # 與 Apollo 配置中心中的 AppId 一致 apollo: meta: http://localhost:8080 # Apollo 中的 Eureka 註冊中心地址 #cluster: # 指定 Apollo 集羣,相同集羣實例使用對應集羣的配置 #cacheDir: # 配置緩存目錄,網絡不可用時任然可提供配置服務 bootstrap: enable: true # 啓用 apollo env: DEV # 指定環境 # 自定義配置 name: order-service-dev mysql: host: localhost port: 3306 username: root password: root
order-service
和 order-service02
的配置文件實體類代碼一致。
package com.example.config; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component @Data @NoArgsConstructor @AllArgsConstructor public class ConfigProperties { @Value("${name}") private String name; @Value("${mysql.host}") private String mysqlHost; @Value("${mysql.port}") private Integer mysqlPort; @Value("${mysql.username}") private String mysqlUsername; @Value("${mysql.password}") private String mysqlPassword; }
order-service
和 order-service02
的控制層代碼一致。
package com.example.controller; import com.example.config.ConfigProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class ConfigController { @Autowired private ConfigProperties configProperties; @Value("${name}") private String name; @GetMapping("/name") public String getName() { return configProperties.getName(); } @GetMapping("/mysql") public Map<Object, Object> getMySQLProperties() { // JDK9中的新特性,快速建立只讀集合。 return Map.of("host", configProperties.getMysqlHost(), "port", configProperties.getMysqlPort(), "username", configProperties.getMysqlUsername(), "password", configProperties.getMysqlPassword()); } }
啓動類須要添加 @EnableApolloConfig
註解。
order-service
和 order-service02
的啓動類代碼一致。
package com.example; import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableApolloConfig @SpringBootApplication public class OrderServiceApplication { public static void main(String[] args) { SpringApplication.run(OrderServiceApplication.class, args); } }
訪問:http://localhost:9090/name 和 http://localhost:9091/name 結果以下:
訪問:http://localhost:9090/mysql 和 http://localhost:9091/mysql 結果以下:
進入項目後點擊右上角的 新增配置
。
添加配置項 name
、mysql.username
、mysql.password
。
將剛纔添加的配置信息批量發佈至應用。
控制檯打印信息以下:
c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: order-service-dev-2.0, key: name, beanName: configController, field: com.example.controller.ConfigController.name c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: root123, key: mysql.password, beanName: configProperties, field: com.example.config.ConfigProperties.mysqlPassword c.f.a.s.p.AutoUpdateConfigChangeListener : Auto update apollo changed value successfully, new value: root123, key: mysql.username, beanName: configProperties, field: com.example.config.ConfigProperties.mysqlUsername
訪問:http://localhost:9090/name 和 http://localhost:9091/name 結果以下:
訪問:http://localhost:9090/mysql 和 http://localhost:9091/mysql 結果以下:
以上只是 Apollo 的入門教程,後面咱們會學習 Apollo 的更多高級玩法,好比多環境部署,高可用環境搭建等等。下一篇咱們講解 Apollo 部門管理、用戶管理、配置管理、集羣管理,記得關注噢~
本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議
。
你們能夠經過 分類
查看更多關於 Spring Cloud
的文章。
? 您的點贊
和轉發
是對我最大的支持。
? 掃碼關注 哈嘍沃德先生
「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~