若是微服務架構中沒有使用統一配置中心時,所存在的問題:java
在SpringCloud中咱們使用config組件來做爲統一:git
項目中父pom:github
<!-- 管理springboot版本和依賴 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!-- 主要spring-cloud的版本。Finchley.RELEASE適用於springboot2.0.3版本 -->
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<!-- 管理springcloud版本 -->
<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>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
在config服務添加application.yml文件:web
server: port: 7000 #服務名字 spring: application: name: config-server cloud: config: server: git: #git 倉庫的地址 uri: https://github.com/forgeorgeo/springcloud.git
#git 倉庫的帳號密碼;不寫也能夠 username: 466786065@qq.com password: java362430 #有下層目錄的話 esarch-paths: #加入註冊中心,實現高可用 eureka: client: service-url: defaultZone: http://localhost:8888/eureka/
固然咱們還要用git把代碼文件提交到在github:spring
config啓動類:bootstrap
package cm.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer @EnableDiscoveryClient public class ServiceConfigApplication { public static void main(String[] args) { SpringApplication.run(ServiceConfigApplication.class, args); System.out.println("------啓動成功!"); } }
此時能夠訪問:http://localhost:7000/config-info-dev.yml 緩存
結果:安全
二:客戶端:springboot
項目pom文件:架構
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<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>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<!--Spring Boot Actuator,感應服務端變化-->
<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.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
建立bootstrap.yml 文件:
spring: cloud: config: label: master uri: http://localhost:7000 #服務端路徑
name: config-info #git上文件名(如文件:config-info-dev.yml) profile: dev #文件後綴(開發,測試版本)
建立application.yml 文件:
server: port: 9091 #客戶端端口 spring: application: name: user-service #客戶端服務名
這裏的兩個配置文件中bootstrap 加載順序在application 以前。
到這裏 springcloud Config訪問github配置文件最簡單的配置就完成了,下面咱們在 config客戶端寫一個接口測試一下
package cn.demo.web; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope public class Controller { @Value("${spring.cloud}") private String config; @GetMapping("/test/config") public String test() { return config; } }
先啓動 config服務,在啓動 config客戶端,訪問http://localhost:9091/test/config
可是這樣就行了嗎?雖然服務沒有重啓,可是咱們要一個服務一個服務的發送post請求,咱們能受的了嗎?這比以前的沒配置中心好多了,那麼咱們如何繼續避免挨個挨個的向服務發送Post請求來告知服務,你的配置信息改變了,須要及時修改內存中的配置信息。
這時候咱們就不要忘記消息隊列的發佈訂閱模型。讓全部爲服務來訂閱這個事件,當這個事件發生改變了,就能夠通知全部微服務去更新它們的內存中的配置信息。這時Bus消息總線就能解決,這留到下一篇隨筆講解。
配置規則詳解
還記得最開始咱們建的那幾個測試文件的命名規則麼?
這裏的application能夠自定義爲其它的名稱,這裏能夠用應用的名稱,即應用名
,後邊的dev、stable、prod這些均可以視爲一個應用下多個不一樣的配置文件,能夠當作環境名,如下均用環境名
代稱。
Config支持咱們使用的請求的參數規則爲:
注意:
- 第一個規則的分支名是能夠省略的,默認是master分支
- 不管你的配置文件是properties,仍是yml,只要是應用名+環境名能匹配到這個配置文件,那麼就能取到
- 若是是想直接定位到沒有寫環境名的默認配置,那麼就可使用default去匹配沒有環境名的配置文件
- 使用第一個規則會匹配到默認配置
- 若是直接使用應用名來匹配,會出現404錯誤,此時能夠加上分支名匹配到默認配置文件
- 若是配置文件的命名很由多個-分隔,此時直接使用這個文件名去匹配的話,會出現直接將內容以源配置文件內容直接返回,內容前可能會有默認配置文件的內容(已測試)