1. 概要
- 項目採用微服務架構,將原有的單一web項目拆分成若干個微服務;每個微服務裏,都有自己的springboot配置;
- 微服務上線後,開始現場部署,悲劇了開始了。。。實施人員需要將20幾個微服務jar包逐個解壓,然後修改裏面的配置信息,比如:數據庫地址,redis地址,RabbitMQ地址等;如果數據庫地址等有改動,還是將這20幾個jar包,逐一改動;實在是不方便;開發經理強烈要求:必須優化微服務配置管理;
- 於是,我便開始了優化微服務配置的任務;
2. 教程
springboot是支持配置集中管理的,下面具體介紹一下集成方法。
2.1 搭建配置中心服務端
- 既然想實現統一管理各個微服務的配置,那麼就得有一個集中管理配置的服務。
- 搭建一個新的springboot項目,然後引入相應的springboot依賴就可以了,比較簡單。
- 我是直接將配置中心集成到Euraka服務裏了,因爲我們項目的微服務jar目前就已經20幾個了,太多了,索性直接將配置中心集成到Euraka裏,減少維護成本。
2.1.1 POM.xml依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.1.2 修改啓動類
給啓動類添加 @EnableConfigServer 註釋,聲明該項目作爲配置中心服務端:
@EnableConfigServer
@EnableEurekaServer
@SpringBootApplication
public class WsfyCenterApplication {
public static void main(String[] args) {
SpringApplication.run(WsfyCenterApplication.class, args);
}
}
2.1.3 修改配置文件
配置中心服務端的配置文件 application.yml,需要增加如下配置:
server:
port: 8761
spring:
profiles:
active: native #配置中心-配置文件倉庫-本地(除了本地,還有svn,git等配置)
cloud:
config:
server:
native:
search-locations: E:/WsfyConfigResporties #配置中心-配置文件倉庫-地址
- 配置中心需要一個地方來存儲各個微服務的配置文件;可以通過spring.profiles.active配置項指定配置倉庫的類型;倉庫存儲類型通常有:本地存儲、svn、git等。
- 通過配置項spring.cloud.config.server.native.search-locations指定本地存儲路徑。我是將本地的e盤下的WsfyConfigResporties文件夾作爲配置中心存儲路徑。
- 我們項目採用的本地存儲。也就是說將各個微服務的配置文件,存儲到配置中心所在的服務器上某個路徑下。因爲用戶現場是沒有git和svn的。
2.1.4 提取出各個微服務的配置文件到配置中心
-
將各個微服務的配置文件application.yml放到配置項spring.cloud.config.server.native.search-locations指定的路徑下。
-
各個微服務的配置文件,在配置中心存儲路徑下的命名規則,springboot是有要求的。規則如下:
{微服務名稱} - {運行環境的標識}.yml -
微服務名稱,對應各個微服務的配置文件裏的spring.application.name屬性;
spring:
application:
name: wsfy-api
每個微服務就是通過自己的服務名稱,在配置中心讀取自己對應的配置文件的。
- 運行環境的標識,是指微服務指定運行環境的標識。比如某個微服務A,它有多個環境的配置文件:
環境名稱 | 對應的配置文件 | 運行環境的標識 |
---|---|---|
開發環境 | application-dev.yml | dev |
測試環境 | application-test.yml | test |
生產環境 | application-prod.yml | prod |
配置文件名稱裏的dev、test、prod就是運行環境的標識。
- 既然將各個微服務的配置文件提取到了jar包之外,那麼各個微服務項目裏的配置文件application.yml裏就沒必要再保留這些冗餘的配置了,避免增加維護成本,可以清除了。每個微服務的配置文件裏,我只保留了項目名配置項:
2.1.5 提取公共配置文件
-
每個微服務的配置文件裏,都有數據庫地址、redis地址、RabbitMQ地址等公共配置。爲了減少維護成本,我將這些公共配置提取到一個公共配置文件裏:wsfy-master-config.yml,文件名稱自己隨便定義哈。
-
我的配置中心的存儲路徑下,各個微服務文件列表示例如下:
wsfy-master-config.yml
wsfy-api-dev.yml
wsfy-api-prod.yml
wsfy-user-dev.yml
wsfy-user-prod.yml
wsfy-cache-dev.yml
wsfy-cache-prod.yml -
至此,配置中心服務端搭建完畢。啓動項目,瀏覽器訪問http://{配置ip}:{prot}/配置文件名,可以查看該配置文件:
2.2 各個微服務連接配置中心
2.2.1 pom.xml依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2.2.2 連接配置中心
- 在每個微服務的src/main/resources路徑下新建bootstrap.yml配置文件,在這裏配置一些與配置中心有關的信息,從而使微服務可以訪問配置中心裏的配置文件。
- 注意:新建的配置文件名,必須爲bootstrap.yml。在springboot裏,bootstrap.yml的優先級比application.yml高。如果將配置中心的相關配置寫到application.yml是不會生效的,只有寫在bootstrap.yml裏纔會生效。讀者可以網上搜索application.yml與bootstrap.yml的區別。
- bootstrap.yml配置如下:
spring:
application:
name: wsfy-api (3)
config:
location: http://{配置中心IP地址}:{配置中心服務端口}/wsfy-master-config.yml (2)
cloud:
config:
uri: http://{配置中心IP地址}:{配置中心服務端口} (1)
profile: prod (4)
(1)spring.cloud.config.uri:對應配置中心服務端地址。告訴當前微服務,去哪裏拿配置。
(2)spring.config.location:對應配置中心服務端,公共文件的訪問地址。如果在瀏覽器,這個地址打不開,說明你的配置中心服務端啓動有問題,需要排查一下。
(3)spring.application.name:告訴配置中心,哪個文件是我的。別給我讀取別的微服務的配置文件。
(4)spring.cloud.config.profile:告訴配置中心,我要讀取哪個運行環境的配置文件。
- 至此微服務客戶端訪問配置中心完畢。可以啓動了。
筆記
1.同一配置,公共文件和jar自己的文件,哪個優先級高?
同一個配置在公共配置文件和jar自己的配置文件裏,都進行了配置,那麼jar自己的文件裏的配置優先級高,會覆蓋公共文件裏的配置;
比如配置項test.string在配置中心裏的公共文件wsfy-master-config.yml 和 wsfy-api-dev.yml 都進行了配置,那麼啓動wsfy-api項目,哪個配置會生效呢,本地測試了一下,是wsfy-api-dev.yml裏的配置生效了。
2.相對於公共文件,或相對於個jar自己的文件,新增的配置是否有效?
在公共配置文件,或者jar自己的文件裏新增的配置,都會生效;項目讀取的兩個配置文件的合集;並且公共配置文件裏的配置信息,是全局的,可以被其他jar讀取;