在本文中,以測試和生產環境下連接不同的數據庫、配置不同的數據源(包括連接池)參數為例,介紹了如何搭配使用阿里云配置中心ACM與Spring Cloud,幫助您在微服務架構中簡化環境配置管理。
遷移到MSE Nacos
ACM進入下線狀態,所有配置管理相關的需求由MSE中的Nacos承接(ACM獨享版,更好的安全和穩定性)。您需要在ACM控制臺導出配置,然后在MSE控制臺導入之前導出的配置即可完成遷移。具體操作,請參見將應用配置從ACM遷移到MSE Nacos。
配置的環境屬性
在系統持續交付的過程中,運行環境的多樣性和復雜性增加了配置管理工作的負擔。這一點在Eugen Paraschiv的博文Configuration Must Be Environment Specific里有簡單的闡述。
環境配置的差異導致了應用的構建物(artifact)在各個環境不能保持一致,而且有時候Docker無法輕易達成只搭建一次即可在所有環境運行的效果。以下列舉一些簡單的例子來幫助您理解:
- 在開發環境中logLevel應設置為DEBUG,在預發環境中為INFO,在生產環境中為WARNING。
- 在開發環境中使用4核8G的機器運行數據庫,而在生產中用32核96G的機器運行數據庫。
- 在日常環境執行線程池的最大線程數應該設置為15,而生產環境上該值應該大一些,默認設為150。
- 在線上環境中,中心機房內應用數據源需要連接A庫,而深圳機房,應用應該就近連接B庫。
- 新的特性僅在線上的杭州單元開放,其他單元環境暫緩。
下文中,簡要介紹了使用阿里ACM配置管理產品在Spring Cloud中替代Spring Cloud Config的方法,幫助您理解基于ACM簡化微服務環境配置管理的方案。此外,下文還將簡要比較說明ACM與Spring Cloud Config方案的優劣。
場景故事
為幫助您理解需求和場景,我們一般會以用戶故事(User Story)的方式預設一個簡單的場景,以此來做闡釋和交流。下面是一張早期的布道圖。
以Movie Service為例,假設需要從關系數據庫MySQL(RDS) 檢索所有電影信息列表,但是只有生產庫需要頂配的機器,測試、預發和生產環境需要使用不同的數據庫,因此應用需要在不同的環境下具備不同的數據源配置、連接池配置、數據庫安全配置等。
下圖介紹了如何基于阿里云ACM的Namespace映射不同環境,為Movie Service在不同運行環境下設置不同的數據源配置。
創建微服務Movie Service
新建Spring Boot Starter微服務應用movie service
movie service的業務邏輯很簡單——列出MySQL(RDS)中所有的movie:
這里我們創建了一個標準的JPA應用(類似于Spring官網的樣例工程Accessing data with MySQL)。工程結構如圖所示:
引入JPA、MySQL、連接池HikariCP以及Web依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>2.7.6</version> </dependency>
創建MySQL(RDS) 數據庫及用戶
mysql> create database db_example; -- Create the new database mysql> create user 'springuser'@'localhost' identified by 'ThePassword'; -- Creates the user mysql> grant all on db_example.* to 'springuser'@'localhost'; -- Gives all the privileges to the new user on the newly created database
詳細步驟可參見Accessing data with MySQL中的“Create the database”小節。
創建WEB Controller
package com.alibaba.demo.microsvc.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.alibaba.demo.microsvc.dao.MovieRepository; import com.alibaba.demo.microsvc.model.Movie; @RestController public class MovieController { @Autowired MovieRepository movieRepository; @RequestMapping("/list-movies") public @ResponseBody Iterable<Movie> listMovies() { return movieRepository.findAll(); } }
在ACM中使用Namespace創建隔離的環境配置
在ACM中創建3個環境(dev、stage、prod)
為dev、stage、prod環境分別創建配置
在上一步中,我們為相同配置項針對不同環境設置了不同的值,例如 spring.datasource.url
這個配置項,我們通過設置不同的URL來為各環境連接不同的數據庫,并且僅在生產環境開啟SSL (useSSL=true)。
dev:
spring.datasource.url=jdbc:mysql://localhost:3306/db_example?useSSL=false
prod:
spring.datasource.url=jdbc:mysql://{IP:Port}/db_example?useSSL=true
同時,我們也為生產環境(prod)設置了更大的數據庫連接池和更小的連接超時時間。
dev:
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.maximum-pool-size=10
prod:
spring.datasource.hikari.connection-timeout=15000
spring.datasource.hikari.maximum-pool-size=200
而為了方便開發調試,我們僅在開發環境打開了SQL Trace。
dev:
spring.jpa.show-sql=true
Movie Service與配置中心ACM集成
現在我們將集成Movie Service與ACM,以便從ACM中獲取對應環境的配置。關于如何在Spring Cloud中使用ACM,請參見Spring Cloud ACM:
為movie service引入ACM依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-acm</artifactId> <version>1.0.1</version> </dependency>
在application.properties配置ACM連接信息、namespace、accessKey、secretKey等信息
spring.application.name=movie-service spring.application.group=com.alibaba.cloud.acm alibaba.acm.endpoint=acm.aliyun.com alibaba.acm.namespace=<your_namespace_id> alibaba.acm.accessKey=<your_ak> alibaba.acm.secretKey=<your_sk>
您可以在ACM的“命名空間詳情”或者“配置的示例代碼”里找到您的namespace_id、accessKey、secretKey等信息。
在瀏覽器里訪問Movie Service
查看ACM配置推送刷新信息
如果在movie service引入了spring-boot-starter-actuator依賴,并且在application.properties設置了 management.security.enabled=false
,則可以通過端點http://<<ip:port>>/acm
看到應用的配置消費及刷新情況。
也可以在 ACM控制臺上查看配置的推送軌跡、配置版本等信息,詳情請參見查看歷史版本和回滾配置以及查詢推送軌跡。
ACM與Spring Cloud Config的簡單對比
對比項 | Spring Cloud Config | 阿里云ACM |
---|---|---|
Spring Cloud無縫集成 | 支持 | 支持 |
源碼分發方式 | 開源 | 即將開源 |
收費模式 | 免費 | 免費 |
大規模(超10萬配置)生產驗證 | 無公開的大規模生產驗證案例 | 阿里巴巴數據中心生產環境超百萬級配置,每天超億級配置變更推送,雙11等嚴苛場景驗證。 |
配置管控UI控制臺 | 無控制臺,依賴IDE、GIT等第三方工具 | 專業的配置管理UI控制臺 |
多語言支持 | 主要支持Java生態,無其他語言的原生客戶端 | 支持nodejs、c++等原生多語言客戶端。 |
多機房、同城雙活、異地多活、多可用區等架構 | 依賴GIT、ZooKeeper等能力支持,官方無明確說明 | 支持 |
配置變更推送 | 依賴RabbitMQ/KAFKA | 內置的推送機制,無外部依賴 |
大規模推送時效 | 依賴GIT Web Hook等SLA、WEB HOOK在企業級大規模生產能力待驗證 | 工業級、毫秒級 |
配置變更審計能力 | 弱 | 內置的審計機制(審計能力符合國家安全等保三級標準)。 |
推送軌跡 | 無法查看配置推送到客戶端的實時監測 | 有配置變更推送軌跡幫助監控配置變更推送狀況。 |
數據隔離 | application、profile、label、git repo等隔離策略 | 除Spring Cloud提供的隔離級別,還提供多租戶、app、data_id、group等多級隔離策略。 |
生產運維成本 | 高(必須對GIT/RabbitMQ等有足夠的知識儲備和人才儲備) | 低(無三方組件依賴) |
高可用 | N/A(客戶自行承擔風險) | 99.99%(阿里云承擔風險) |
安全通信 | 支持SSL | 支持SSL |
容災 | 2級(存儲,服務器緩存) | 3級,另有客戶端本地容災能力 |
工程下載
本文的樣例工程可以從 movie-service.tar.gz 下載。
該工程在以下版本環境測試通過:
- Spring Cloud Edgware.RELEASE
- Spring Boot 1.5.9.RELEASE
- HikariCP 2.7.6
- MySQL 5.7.11
- ACM 4.2.0
- ACM Spring Cloud SDK 1.0.1