《7天學會spring cloud系列》之創建配置管理服務器及實現分布式配置管理應用。
本文涉及到的項目:
- 開源項目:http://git.oschina.net/zhou666/spring-cloud-7simple
- cloud-config-repo:配置文件存放的文件夾
- cloud-simple-service:一個使用mybatis的數據庫應用
分布式配置管理應該是分布式系統和微服務應用的第一步。想象一下如果你有幾十個服務或應用需要配置,而且每個服務還分為開發、測試、生產等不同維度的配置,那工作量是相當大的,而且還容易出錯。如果能把各個應用的配置信息集中管理起來,使用一套機制或系統來管理,那么將極大的提高系統開發的生產效率,同時也會提高系統開發環境和生產環境運行的一致性。

在傳統開發中我們往往需要自己開發“配置管理服務器”,你可以使用redis、ldap、zookeeper、db等來存放統一配置信息,然后開發一個管理界面來進行管理。傳統的做法沒什么問題,和spring cloud所提供的配置管理方案相比,就是前者需要自己開發,而后者直接簡單使用現成的組件即可。當然還有很重要的一點,spring 配置管理模塊由於是spring boot核心來實現的,因此做了大量的工作,可以把一些啟動參數進行外部配置,這在傳統的方案中是很難辦到的,因為涉及到要改寫第三方組件的問題,難度很大。比如web應用的綁定端口,傳統應用只能在tomcat配置文件里改,而spring cloud卻可以放到遠程,類似的還有數據庫連接、安全框架配置等。
要使用spring cloud分布式配置文件總體上分為3個大的步驟,首選你需要創建存放配置文件的倉庫,然后創建一個配置文件服務器,該服務器將配置文件信息轉化為rest接口數據,然后創建一個應用服務,該服務演示使用分布式配置文件信息。
1)創建配置文件存放倉庫
Spring cloud使用git或svn存放配置文件,默認情況下使用git,因此你需要安裝git私服或者直接使用互聯網上的github或者git.oschina,這里推薦使用git.oschina。本文示例使用的是git.oschina,創建好git工程后,也就是文章開頭所提到的工程,在此工程再創建一個文件夾cloud-config-repo來存放配置文件。然后創建兩個配置文件:
- cloud-config-dev.properties
- cloud-config-test.properties
這兩個文件分別對應開發環境和測試環境所需要的配置信息,配置信息如下:
mysqldb.datasource.url=jdbc\:mysql\://10.0.12.170\:3306/test?useUnicode\=true&characterEncoding\=utf-8
mysqldb.datasource.username=csst
mysqldb.datasource.password=csst
logging.level.org.springframework.web:DEBUG
配置信息提供了數據庫連接參數等,這是因為后面的應用服務中使用到了數據庫。
2)創建spring cloud配置服務器
配置文件倉庫創建好了后,就需要創建配置管理服務器,如前所述該服務器只是將配置文件轉換為rest接口服務,不做其它用途。這個服務器的功能也是spring cloud提供的,所以我們只需要引入相關jar包,稍微設置一下即可。創建該服務應用,你需要首選創建一個空的maven工程:

然后在這個工程中增加一個類,命名為:ConfigServerApplication,代碼如下:
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
可以看到,我們只需要用@EnableConfigServer激活該應用為配置文件服務器即可。如此以來該應用啟動后就會完成前面提到的功能,即:讀取遠程配置文件,轉換為rest接口服務。
當然,需要配置遠程配置文件讀取路徑,在application.properties中:
server.port=8888
spring.cloud.config.server.git.uri=https://git.oschina.net/zhou666/spring-cloud-7simple.git
spring.cloud.config.server.git.searchPaths=cloud-config-repo
其中server.port是配置當前web應用綁定8888端口,git.uri指定配置文件所在的git工程路徑,searchPaths表示將搜索該文件夾下的配置文件(我們的配置文件放在spring-cloud-7simple這個工程的cloud-config-repo文件夾下)。
最后,還需要在pom文件中增加配置服務器的相關依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
如此以來,配置文件服務器就建立好了,可以直接啟動了,服務端口是8888,應用只需要綁定改服務器的uri和端口號就可以拿到配置信息了。
3) 創建一個服務使用該遠程配置
現在可以創建一個服務使用該遠程配置了,你可以在遠程配置中定義一個簡單的自定義信息,比如:
my.message=helloword
然后使用前面我們提到的spring boot helloworld應用來讀取這個信息。當然,限於篇幅我們直接使用比較復雜的一個服務來演示這個配置管理器的使用,這個服務需要用到數據庫訪問,數據庫訪問層我們使用的是mybaits,數據表只有一個,DDL如下:
CREATE TABLE `user` (
`id` varchar(50) NOT NULL DEFAULT '',
`username` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
創建好數據表后,回到我們的應用服務:

該服務使用DataSourceProperties封裝了mybatis加載配置信息。要拿到遠程配置信息,需要設置配置管理服務器地址,該配置設置在:
bootstrap.properties
該配置文件信息如下:
spring.cloud.config.uri=http://127.0.0.1:${config.port:8888}
spring.cloud.config.name=cloud-config
spring.cloud.config.profile=${config.profile:dev}
其中config.uri指定遠程加載配置信息的地址,就是前面我們剛建立的配置管理服務器的地址,綁定端口8888,其中config.port:8888,表示如果在命令行提供了config.port參數,我們就用這個端口,否則就用8888端口。config.name表示配置文件名稱,查看我們前面創建配置文件,是這個名稱:
cloud-config-dev.properties
可以分成兩部分: {application}- {profile}.properties
所以我們配置config.name為cloud-config,config.profile為dev,其中dev表示開發配置文件,配置文件倉庫里還有一個測試環境的配置文件,切換該配置文件只需要將dev改為test即可,當然這個參數也可以由啟動時命令行傳入,如:
java -jar cloud-simple-service-1.0.0.jar --config.profile =test
此時應用就會加載測試環境下的配置信息。
