java
分佈式系統面臨的問題 --- 配置問題mysql
git
SpringCloud Config是什麼github
web
spring
SpringCloud Config分爲服務端和客戶端兩部分。sql
服務端也稱爲分佈式配置中心,它是一個獨立的微服務應用,用來鏈接配置服務器併爲客戶端提供獲取配置信息,加密/解密信息等訪問接口。數據庫
apache
bootstrap
1.集中管理配置文件
3.運行期間動態調整配置,再也不須要每一個服務部署的機器上編寫配置文件,服務會向配置中心統一拉取配置本身的信息。
4.當配置發生變更時,服務不須要重啓便可感知到配置的變化並應用新的配置
5.將配置信息以REST接口的形式暴露
因爲SpringCloud Config默認使用GIT來存儲配置文件(也支持SVN和本地文件),但最推薦的仍是git,並且使用http/https訪問的形式。
2.在本地拉取該項目,使用 git clone git@github.com:SillyBoy007/microservice-config.git
3.在該項目裏新建一個application.yml
4.編寫yml文件,並保存爲UTF-8格式
spring: profiles: active: - dev --- spring: profiles: dev #開發環境 application: name: microservice-config-wang-dev --- spring: profiles: test #測試環境 application: name: microservice-config-wang-test
5.上傳yml文件到github
查看github的Code發現上面已經有了該文件。那麼咱們該如何讀取github上的文件配置信息呢?
建立一個模塊microservice-config-3344。
pom文件
<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.wang.springcloud</groupId> <artifactId>microservice</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>microservice-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>
server:
port: 3344
spring:
application:
name: microservice-config
cloud:
config:
server:
git:
uri: git@github.com:SillyBoy007/microservice-config.git #git倉庫地址
search-paths: microservice-config-learn #git項目的目錄
@SpringBootApplication @EnableConfigServer public class SpringCloudConfig3344 { public static void main(String[] args) { SpringApplication.run(SpringCloudConfig3344.class,args); } }
127.0.0.1 config3344.com
啓動microservice-config-3344項目,分別訪問下列的地址
http://config3344.com:3344/application-dev.yml
http://config3344.com:3344/application-test.yml
http://config3344.com:3344/application-dasdd.yml
配置讀取規則
1./{application}-{profile}.yml
http://config3344.com:3344/application-dev.yml
2./{application}/{profile}[/{label}]
http://config3344.com:3344/applicaiton/test/master
3./label/{application}-{profile}.yml
http://config3344.com:3344/master/application-test.yml
spring: profiles: active: - dev --- server: port: 8201 spring: profiles: dev application: name: microservice-config-client eureka: client: service-url: defaultZone: http://eureka-dev.com:7001/eureka/ --- server: port: 8202 spring: profiles: test application: name: microservice-config-client eureka: client: service-url: defaultZone: http://eureka-test.com:7001/eureka/
2.將上述的文件上傳到github上。
pom文件:
<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.wang.springcloud</groupId> <artifactId>microservice</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>microservice-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>
新建bootstrap.yml
application.yml是用戶級的資源配置項
bootstrap.yml是系統級的,優先級更高
SpringCloud會建立一個‘BootStrap Context’,做爲Spring應用的Application Context
spring:
cloud:
config:
name: microservice-config-client #須要從github上讀取的資源名稱,沒有yml後綴名
profile: dev
label: master
uri: http://config3344.com:3344 #本微服務啓動後先去找3344號服務,經過SpringCloud Config獲取GitHub的服務地址
spring:
application:
name: microservice-config-client
127.0.0.1 client-config.com
主啓動類
package com.wang.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ConfigClient3355 { public static void main(String[] args) { SpringApplication.run(ConfigClient3355.class,args); } }
package com.wang.springcloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class ConfigClientRestController { @Value("${spring.application.name}") private String applicationName; @Value("${eureka.client.service-url.defaultZone}") private String eurekaServers; @Value("${server.port}") private String port; @RequestMapping public String getConfig(){ return "applicationName:"+applicationName+"\t eurekaServers:"+eurekaServers+"\t port:"+port; } }
1.先啓動microservice-config-3344項目,再啓動microservice-config-client-3355項目。
2.訪問http://client-config.com:8201/,http://client-config.com:8201/config
3.修改bootstrap.yml,將環境profile切換爲test
4.訪問http://client-config.com:8202/ , http://client-config.com:8202/config
六.SpringCloud Config 實際應用
修改microservice-config項目
spring: profiles: active: - dev --- server: port: 7001 spring: profiles: dev application: name: microservice-config-eureka-client eureka: instance: hostname: eureka7001.com #eureka實例的主機名 client: register-with-eureka: false #不把本身註冊到eureka上 fetch-registry: false #不從eureka上來獲取服務的註冊信息 service-url: defaultZone: http://eureka7001.com:7001/eureka/ --- server: port: 7001 spring: profiles: test application: name: microservice-config-eureka-client eureka: instance: hostname: eureka7001.com #eureka實例的主機名 client: register-with-eureka: false #不把本身註冊到eureka上 fetch-registry: false #不從eureka上來獲取服務的註冊信息 service-url: defaultZone: http://eureka7001.com:7001/eureka/
spring: profiles: active: - dev --- server: port: 8001 spring: profiles: dev application: name: microservice-config-dept-client datasource: type: com.alibaba.druid.pool.DruidDataSource #數據源類型 driver-class-name: org.gjt.mm.mysql.Driver #數據庫驅動 url: jdbc:mysql://localhost:3306/cloudDB01 #數據庫url username: root password: 123456 dbcp2: min-idle: 5 #數據庫鏈接池的最小維持鏈接數 initial-size: 5 #初始化鏈接數 max-total: 5 #最大鏈接數 max-wait-millis: 200 #等待鏈接獲取的最大超時時間 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路徑 type-aliases-package: com.wang.springcloud.entities #全部entity別名類所在包 mapper-locations: classpath:mybatis/mapper/**/*.xml #mapper映射文件 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka --- server: port: 8002 spring: profiles: test application: name: microservice-config-dept-client datasource: type: com.alibaba.druid.pool.DruidDataSource #數據源類型 driver-class-name: org.gjt.mm.mysql.Driver #數據庫驅動 url: jdbc:mysql://localhost:3306/cloudDB02 #數據庫url username: root password: 123456 dbcp2: min-idle: 5 #數據庫鏈接池的最小維持鏈接數 initial-size: 5 #初始化鏈接數 max-total: 5 #最大鏈接數 max-wait-millis: 200 #等待鏈接獲取的最大超時時間 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路徑 type-aliases-package: com.wang.springcloud.entities #全部entity別名類所在包 mapper-locations: classpath:mybatis/mapper/**/*.xml #mapper映射文件 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka
3.上傳上述兩個新文件到github
4.新建microservice-config-eureka-server-7001項目
<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.wang.springcloud</groupId> <artifactId>microservice</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>microservice-config-eureka-server-7001</artifactId> <dependencies> <!-- SpringCloudConfig配置 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</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>
bootstrap.yml
spring:
cloud:
config:
name: microservice-config-eureka-server
profile: dev
label: master
uri: http://config3344.com:3344 #本微服務啓動後先去找3344號服務,經過SpringCloud Config獲取GitHub的服務地址
spring:
application:
name: microservice-config-eureka-server
主啓動類
package com.wang.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class ConfigEurekaServer7001 { public static void main(String[] args) { SpringApplication.run(ConfigEurekaServer7001.class,args); } }
4.新建microservice-config-dept-client-8001項目
pom文件
<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.wang.springcloud</groupId> <artifactId>microservice</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>microservice-config-dept-client-8001</artifactId> <dependencies> <!-- SpringCloudConfig配置 --> <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-eureka</artifactId> </dependency> <dependency> <groupId>com.wang.springcloud</groupId> <artifactId>microservice-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</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>
spring: cloud: config: name: microservice-config-dept-client #須要從github上讀取的資源名稱,注意沒有yml後綴名 #profile配置是什麼就取什麼配置dev or test profile: dev #配置環境 #profile: test label: master uri: http://config3344.com:3344 #SpringCloudConfig獲取的服務地址
application.yml
spring:
application:
name: microservice-config-dept-client
4.拷貝microservice-provider-dept-8001項目的mybatis資源文件以及mapper、service業務代碼
5.啓動測試