1、分佈式系統面臨的--配置問題git
微服務意味着要將單體應用中的業務拆分紅一個個子服務,每一個服務的力度相對較小,所以系統中會出現大量的服務。因爲每一個服務都須要必要的配置信息才能運行,因此一套集中式的、動態配置管理設施是必不可少的。SpringCloud提供了ConfigServer來解決這個問題。咱們一個微服務本身帶着一個application.yml,上百個項目,上百個配置文件管理。。。。。。~~/(ToT)/~~github
2、SpringCloud Config 是什麼?web
SpringCloud Config 爲微服務架構中的微服務提供集中化的外部配置支持,配置服務器爲各個不一樣微服務應用的全部環境提供了一個中心化的外部配置。spring
SpringCloud Config 分爲服務端和客戶端兩部分apache
一、服務端也稱爲分佈式配置中心,它是一個獨立的微服務應用,用來鏈接配置服務器併爲客戶端提供獲取配置信息,加密/解密信息等訪問接口。bootstrap
二、客戶端則是經過指定的配置中心來管理應用資源,以及與業務相關的配置內容,並在啓動的時候從配置中心獲取和加載配置信息api
三、配置服務器默認採用Git來存儲配置信息。這樣有助於對環境配置進行版本管理,而且能夠經過Git客戶端工具來方便地管理和訪問配置內容服務器
3、SpringCloud Config 能幹嗎架構
一、集中管理配置文件app
二、不一樣環境不一樣配置,動態化的配置更新,分環境部署好比dev/test/prod/beta/release
三、運行期間動態調整配置,再也不須要在每一個服務部署的機器上編寫配置文件,服務會向配置中心統一拉取配置本身的信息
四、當配置發生變更是,服務不須要重啓便可感知到配置文件的變化並應用新的配置
五、將配置信息以REST接口的形式暴露
六、 因爲SpringCloud Config默認使用Git來存儲配置文件(也有其餘方式,好比支持SVN和本地文件),但最推薦的仍是Git,並且使用的是http/https訪問的形式
4、SpringCloud Config 服務端使用步驟
application.yml
spring: profiles: active: - dev --- spring: profiles: dev #開發環境 application: name: microservicecloud-config-everjiankang-dev --- spring: profiles: test #測試環境 application: name: microservicecloud-config-everjiankang-test #請保存爲UTF-8編碼格式
*注意*:profiles 和application是平級,一開始把application寫在了profiles下面,結果一直報錯
將yml文件推送到git上
git add . git commit -m "init yml" git push origin master
新建項目microservicecloud-config-3344
pom.xml
<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>com.atguigu.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-config-3344</artifactId> <dependencies> <!-- springCloud Config --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <!-- 避免Config的Git插件報錯:org/eclipse/jgit/api/TransportConfigCallback --> <dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit</artifactId> <version>4.10.0.201712302008-r</version> </dependency> <!-- 圖形化監控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 熔斷 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</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> </dependency> <!-- 熱部署插件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
application.yml
server: port: 3344 spring: application: name: microservicecloud-config cloud: config: server: git: uri: git@github.com:ChaoYiJueChen/microservicecloud-config.git #GitHub上面的git倉庫名字
主啓動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer public class Config_3344_StartSpringCloudApp { public static void main(String[] args) { SpringApplication.run(Config_3344_StartSpringCloudApp.class, args); } }
修改host文件:
127.0.0.1 config-3344.com
測試經過config微服務是否能夠從github上獲取配置內容
1)啓動3344項目
2)http://config-3344.com:3344/application-dev.yml
3)http://config-3344.com:3344/application-test.yml
4)http://config-3344.com:3344/application-xxx.yml (不存在的配置)
官網
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
http://localhost:3344/application/dev/master
http://localhost:3344/application/test/master
http://localhost:3344/application/dev/master
http://localhost:3344/master/application-dev.yml
5、SpringCloud Config 客戶端使用步驟
一、新建microservicecloud-config-client.yml並提交到github
spring: profiles: active: 一 dev --- server: port: 8201 sprlng : profiles: dev application: name: microservicecloudconfig-client eureka: client: service一url: defaultZone: http://eureka-dev.com:7001/eureka/ --- server: port: 8202 spring: profiles: test application: name: microservicecloud-config-client eureka: client: service一url: defaultZone : http://eureka-dev.com:7001/eureka/
二、新建項目microservicecloud-config-config-3355
設置pom.xml
<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>com.atguigu.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-config-client-3355</artifactId> <dependencies> <!-- SpringCloud Config客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</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> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
applicaiton.yml是用戶級的資源配置項
bootstrap.yml是系統級的,優先級更高
Spring Cloud會建立一個`Bootstrap Context` 做爲Spring應用的`Application Context`的父上下文。初始化的時候,
'Bootstrap Context'負責從外部源加載配置屬性並解析配置。這兩個上下文共享個從外部獲取的'Environment'。
'Bootstrap'屬性有高優先級,默認狀況下,它們不會被本地配置覆蓋。'Bootstrap context'和'Application Context'有着不一樣的 約定,
因此新增了一個'bootstrap.yml'文件,保證'Bootstrap Context'和'Application Context'配置的分離。
bootstrap.yml
spring: cloud: config: name: microservicecloud-config-client #須要從github上讀取的資源名稱,注意沒有yml後綴名 profile: test #本次訪問的配置項 label: master uri: http://config-3344.com:3344 #本微服務啓動後先去找3344號服務,經過SpringCloudConfig獲取GitHub的服務地址
application.yml
spring: application: name: microservicecloud-config-client
配置host映射
127.0.0.1 client-config.com
建立Controller,從gitHub的配置文件中獲取信息
package com.everjiankang.springcloud.rest; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConfigClientRest { @Value("${spring.application.name}") private String applicationName; @Value("${eureka.client.service-url.defaultZone}") private String eurekaServers; @Value("${server.port}") private String port; @RequestMapping("/config") public String getConfig() { String str = "applicationName: " + applicationName + "\t eurekaServers:" + eurekaServers + "\t port: " + port; System.out.println("******str: " + str); return "applicationName: " + applicationName + "\t eurekaServers:" + eurekaServers + "\t port: " + port; } }
主啓動類
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConfigClient_3355_StartSpringCloudApp { public static void main(String[] args) { SpringApplication.run(ConfigClient_3355_StartSpringCloudApp.class, args); } }
啓動配置中心3344微服務
啓動3355微服務做爲client訪問3344微服務
3355微服務的bootstrap.yml裏的profile的值是什麼,決定github上讀取什麼
3355微服務做爲client訪問3344微服務經過github獲取配置信息