1、配置中心的做用:能夠將多種應用的配置進行集中式的管理,將這些配置統一存放到git或svn裏面存儲;java
2、搭建SpringCloud-Config-Servergit
2.1如圖後續步驟勾選Config Server便可;github
建立好後的pom.xml文件以下:web
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>me.silentdoer</groupId> <artifactId>springcloud-config-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-config-server</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
2.2建立好後在Application上加上@EnableConfigServer註解,而且修改application.properties文件(貌似SpringCloud的標準文件是bootstrap.properties|yml,可是我用application.properties也能夠,若是同時存在聽說bootstrap.properties優先於application.properties)爲:spring
# config-server服務的端口
server.port=8888
# 服務名 spring.application.name=config-server #表示這個是config-server不須要去發現服務,它不依賴其餘服務 spring.cloud.config.discovery.enabled=false # 配置git倉庫地址 spring.cloud.config.server.git.uri=https://github.com/Silentdoer/config-server-repo.git # 配置倉庫的搜索目錄,必須配置(相對於根目錄),若是要填寫多種應用的配置能夠用英文逗號分隔 spring.cloud.config.server.git.search-paths=qq-api,wechat-api # 配置倉庫的分支 spring.cloud.config.label=master # 訪問git倉庫的用戶名,若是是私密倉庫須要填這兩個 #spring.cloud.config.server.git.username=xxxx # 訪問git倉庫的用戶密碼 #spring.cloud.config.server.git.password=xxxx
到這裏,SpringCloud的Config-Server就建立好了;apache
能夠啓動Config-Server,而後訪問http:localhost:8888/qq-prod.properties來看server是否啓動成功;(若是用的是properties格式的配置還須要添加額外的轉換器不然消費者看到的是中文亂碼【瀏覽器看到是亂碼能夠不用管】)bootstrap
我這邊訪問後是這樣子:api
注意,這裏的訪問方式有不少種:(這裏用的是第二種,第一種的label是能夠省略的)瀏覽器
3、接着咱們來建立Config-Server的消費服務,這裏好比就叫qq-api;(注意這是個普通的Webapp,只不過添加了Config-Client的功能)app
步驟和上面差很少,不過勾選時要勾選Ops裏的Actuator和Config Client和以及Web應用相關的東西(根據本身需求);
建立好後的pom.xml以下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>me.silentdoer</groupId> <artifactId>springcloud-qq-api</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springcloud-qq-api</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> </project>
接着將qq-api的application.properties內容改成:
#application.properties能夠認爲是application-default.properties server.port=8080 # 和git裏的文件名對應 spring.application.name=qq-prod # 遠程倉庫的分支 spring.cloud.config.label=master # 和git裏的文件名對應 spring.cloud.config.profile=prod # 指明配置服務中心的網址 spring.cloud.config.uri=http://localhost:8888/ # 暴露刷新配置的接口,而後調用curl -X POST http://localhost:8080/actuator/refresh便可刷新配置,可是相關的bean仍然須要@RefreshScope # 不然雖然這個config-client程序裏的某個properties屬性刷新了,可是它的老的值已經賦值給了這個bean的對應的屬性,因此仍是用的老的bean值; management.endpoints.web.exposure.include=health,info,refresh
而後再添加一個Controller用於測試:
@RestController @RequestMapping("/api/backstage/test") @RefreshScope public class TestController { @Value("${country:瓜瓜國}") private String country; @GetMapping("test1") public String test1() { System.out.println(this.country); return this.country; } }
這裏的@RefreshScope是爲了調用curl -X POST http://localhost:8080/actuator/refresh是可以將這個bean刷新從而應用最新的配置值;
調用該接口獲取的配置就是在Git倉庫裏的配置,若是commit更新了該key的value值,那麼調用refresh後這裏再調用接口獲取的會是最新的配置值;
4、健康監測
經過GET請求調用http://localhost:8080/actuator/health,而後能夠看到{"status":"UP"},這裏UP表示Config-Server是好的,若是是DOWN那麼表示沒法鏈接到Config-Server;
5、到此就結束了,SpringCloud的配置中心仍是比較簡單是實現的,後續還能夠結合MQ和消息總線來實現更新配置文件後自動通知應用來刷新配置;
6、一些有問題的地方:
1.通過測試,若是經過spring.cloud.config.name來讀取多配置(必需在指定的搜索目錄的根目錄【Git根目錄也默認會搜索】,網上的searchPaths的*不是指同時搜索子目錄,而是如xxx*表示xxx開頭的目錄,但內部的子目錄不會搜索),那麼qq-api是可以讀取到wechat-api裏的配置的,因此這裏的配置中心其實不是爲多種應用準備的?