隨着業務的發展,應用系統中的配置會越來越多,配置之間也有不同的業務特點,比如業務依賴的數據庫配置、緩存信息配置、索引存儲配置等。這類配置一般比較穩定,不會頻繁更改,通常會放在工程中作為配置文件隨應用一起發布。
除了這些配置,還有一部分配置會經常發生修改,比如限流降級開關配置、業務中的白名單配置等。這些配置項除了變更頻繁,還要求實時性,如果采取和應用一起發布的方式,那么每次變更都要重新發布服務,非常不方便。
為了解決這類配置問題,出現了分布式配置管理平台。
配置管理的應用場景
在項目開發中,數據庫信息等配置管理,一般是隨着工程一起上線的,比如 Java 的 Web 系統,習慣把數據庫的配置信息放到 jdbc.properties 這個配置文件中。
在分布式場景下,配置管理的應用范圍更加廣泛。比如上面說的限流和降級配置,電商網站在舉行大型促銷活動時,由於訪問人數暴增,為了保證核心交易鏈路的穩定性,會把一些不太重要的業務做降級處理,那么如何關閉非核心服務呢?就需要分布式配置管理系統,能夠實時管理被降級的業務,保證系統安全。
在一些異步業務場景中,配置管理也廣泛應用,比如工作中經常會有數據同步,需要控制同步的速度;在一些定時任務中,需要控制定時任務觸發的時機,以及執行的時長等,這些都可以通過配置管理來實現。
配置管理如何實現
分布式配置管理的本質就是一種推送-訂閱模式的運用。配置的應用方是訂閱者,配置管理服務則是推送方,客戶端發布數據到配置中心,配置中心把配置數據推送到訂閱者。
配置管理服務往往會封裝一個客戶端,應用方則是基於該客戶端與配置管理服務進行交互。在實際實現時,客戶端可以主動拉取數據,也可以基於事件通知實現。
Apollo介紹
Apollo(阿波羅)是攜程框架部門研發的分布式配置中心,能夠集中化管理應用不同環境、不同集群的配置,配置修改后能夠實時推送到應用端,並且具備規范的權限、流程治理等特性,適用於微服務配置管理場景。 Apollo已經支持了多種語言,並且提供了open API。其他不支持的語言,Apollo的接入成本相對較低。
Apollo安裝
內容如下
version: '2' services: apollo-quick-start: image: nobodyiam/apollo-quick-start container_name: apollo-quick-start depends_on: - apollo-db ports: - "8080:8080" - "8070:8070" links: - apollo-db apollo-db: image: mysql:5.7 container_name: apollo-db environment: TZ: Asia/Shanghai MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' depends_on: - apollo-dbdata ports: - "13306:3306" volumes: - ./sql:/docker-entrypoint-initdb.d volumes_from: - apollo-dbdata apollo-dbdata: image: alpine:latest container_name: apollo-dbdata volumes: - /var/lib/mysql
Apollo 服務需要兩個數據庫:ApolloPortalDB 和 ApolloConfigDB,相關腳本在 sql 文件夾下,自行導入 MySQL 即可:
進入docker-quick-start目錄,並在當前目錄執行命令 docker-compose up
成功后,在瀏覽器輸入地址,登陸,用戶名密碼分別是 apollo admin。
Apollo內置模塊Eureka(下圖是Eureka 提供的ui控制台)
Eureka是spring cloud中的一個負責服務注冊與發現的組件。
Apollo模塊
Apollo分為MySQL,Config Service,Admin Service,Portal四個模塊:
1. MySQL存儲Apollo元數據和用戶配置數據;
2. Config Service提供配置的讀取、推送等功能,客戶端請求都是落到Config Service上;
3. Admin Service提供配置的修改、發布等功能,Portal操作的服務就是Admin Service;
4. Portal提供給用戶配置管理界面;
Apollo的架構圖
Apollo配置推送是基於HTTP長輪詢,客戶端和配置中心建立HTTP長聯接,當配置變更的的時候,配置中心把配置推送到客戶端。