全部產品
Search
文件中心

Application Configuration Management(Deprecated):使用ACM簡化Spring Cloud微服務環境組態管理

更新時間:Jul 06, 2024

在本文中,以測試和生產環境下串連不同的資料庫、配置不同的資料來源(包括串連池)參數為例,介紹了如何搭配使用阿里雲配置中心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的前提是開通該項服務,開通服務並登入後,即可進入ACM控制台建立命名空間及配置。
  • 在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

在瀏覽器裡訪問 Movie Service

查看ACM配置推送重新整理資訊

如果在movie service引入了spring-boot-starter-actuator依賴,並且在application.properties設定了 management.security.enabled=false,則可以通過端點http://<<ip:port>>/acm看到應用的配置消費及重新整理情況。

查看 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
說明 在本地運行該工程前,請務必在application.properties裡設定您自己的ACM accessKey和secretKey。