SpringCloud之Config分布式配置中心
分布式系統面臨的配置問題
微服務意味着要将機關應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,是以系統中将會出現大量的服務。由于每個服務都需要必要的配置資訊才能運作,是以一套集中式的、動态的配置管理設施是必不可少的。SpringCloud提供了ConfigServer來解決這個問題,我們每一個微服務自己帶着一個application.yml,上百個配置檔案的管理。。。、/T o T/~~
SpringCloud Config為微服務架構中的微服務提供集中化的外部配置支援,配置伺服器為各個不同微服務應用的所有環境提供了一個中心化的外部配置。
SpringCloud Config分為服務端和用戶端兩個部分。
服務端也稱為分布式配置中心,它是一個獨立的微服務應用, 用來連接配接配置伺服器并為用戶端提供擷取配置資訊,加密/解密資訊等通路接口
用戶端則是通過指定的配置中心來管理應用資源,以及與業務相關的配置内容,并在啟動的時候從配置中心擷取和加載配置資訊。配置伺服器預設采用git來存儲配置資訊,這樣就有助于對環境配置進行版本管理,并且可以通過git用戶端工具來友善的管理和通路配置内容。
SpringCloud Config服務端的配置
使用自己的github賬戶,添加一個倉庫microservicecloud-config
複制https路徑:
https://github.com/yjp245/microservicecloud-config.git
在本地建立一個目錄将github上工程克隆下來
克隆後,建立一個yml配置檔案并且用utf-8的形式儲存
spring:
profiles:
active:
- dev
---
spring:
profiles: dev #開發環境
application:
name: microservicecloud-config-dev
---
spring:
profiles: test #測試環境
application:
name: microservicecloud-config-test
然後在目前目錄下 右鍵打開Git Bash Here指令行面闆
輸入指令:
git status
git add .
git commit -m "init file" #送出添加注釋
git push origin master # 将本地master分支推送到origin主機
這時檢視github 便可以看到上傳的檔案
建立微服務項目與git相關聯 microservicecloud-config-3344,并添加依賴
<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>
yml配置
server:
port: 3344
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: https://github.com/yjp245/microservicecloud-config.git #GitHub上面的git倉庫名字
啟動類添加@EnableConfigServer注解就可以通路到github上面的配置了
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer #config服務端
public class Config_3344_StartSpringCloudApp
{
public static void main(String[] args)
{
SpringApplication.run(Config_3344_StartSpringCloudApp.class, args);
}
}
配置本地服務域名:
添加:
127.0.0.1 config-3344.com
啟動測試:
http://config-3344.com:3344/master/application-test.yml
http://config-3344.com:3344/master/application-dev.yml
SpringCloud Config用戶端的配置
建立Spring Cloud Config用戶端,通過服務端從git擷取配置檔案資訊,首先建立一個往git上面建立一個microservicecloud-config-client.yml配置檔案
填寫
spring:
profiles:
active:
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: microservicec loud-config-client
eureka:
client:
serviceUrl:
defaultZone: http://eureka7001:7001/eureka/
---
server:
port: 8202
spring:
profiles: test
application:
name: microservicec loud-config-client
eureka:
client:
serviceUrl:
defaultZone: http://eureka7001:7001/eureka/
然後在目前目錄下 右鍵打開Git Bash Here指令行面闆
輸入指令:
git status
git add .
git commit -m "test file" #送出添加注釋
git push origin master # 将本地master分支推送到origin主機
送出到github
建立一個microservicecloud-config-client-3355微服務,添加依賴
<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>
新増了一個bootstrap.yml檔案
spring:
cloud:
config:
name: microservicecloud-config-client #需要從github上讀取的資源名稱,注意沒有yml字尾名
profile: test #本次通路的配置項
label: master
uri: http://config-3344.com:3344 #本微服務啟動後先去找3344号服務,通過SpringCloudConfig擷取GitHub的服務位址
配置bootstrap.yml的原因
https://blog.csdn.net/dulabing/article/details/80183662
https://www.cnblogs.com/fengli9998/p/8489084.html
配置application.yml
spring:
application:
name: microservicecloud-config-client
擷取配置檔案資訊類
package com.atguigu.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.serviceUrl.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;
}
}
啟動類
package com.atguigu.springcloud;
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);
}
}
分别啟動
microservicecloud-eureka-7001
microservicecloud-config-3344
microservicecloud-config-client-3355
由于用戶端的bootstrap.yml配置的是test所有通路的是git上面的8202端口
http://client-config.com:8202/config
當我們把bootstrap配置檔案中的 profile更改為 dev,再啟動通路的便是git上的8201端口
config服務端配置ok且測試通過,我們可以和config+GitHub進行配置修改并擷取内容
SpringCloud Config用戶端配置實戰
做一個eureka服務+一個通路的微服務,将兩個微服務的配置統由github獲得實作統一配置分布式管理,完成多環境的變更。
eureka的git配置檔案microservicecloud-config-eureka-client可以根據dev或者test切換不同的配置
spring:
profiles:
active:
- dev
---
server:
port: 7001
spring:
profiles: dev
application:
name: microservicecloud-config-eureka-client
eureka:
instance:
hostname: eureka7001 #eureka服務端的執行個體名稱
prefer-ip-address: true #通路路徑可以顯示IP位址
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
defaultZone: http://eureka7001:7001/eureka/
---
server:
port: 7001
spring:
profiles: test
application:
name: microservicecloud-config-eureka-client
eureka:
instance:
hostname: eureka7001 #eureka服務端的執行個體名稱
prefer-ip-address: true #通路路徑可以顯示IP位址
client:
register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
service-url:
defaultZone: http://eureka7001:7001/eureka/
提供接口的微服務的git配置檔案可以根據dev或者test切換不同配置,連接配接不同資料庫
spring:
profiles:
active:
- dev
---
server:
port: 8001
spring:
profiles: dev
application:
name: microservicecloud-config-dept-client
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 目前資料源操作類型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
url: jdbc:mysql://localhost:3306/cloudDB01 # 資料庫名稱
username: root
password: 671354
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.smxy.lq.entities # 所有Entity别名類所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射檔案
eureka:
client: #用戶端注冊進eureka服務清單内
service-url:
defaultZone: http://eureka7001:7001/eureka/
instance:
instance-id: microservicecloud-dept8001 #服務名稱
prefer-ip-address: true #通路路徑可以顯示IP位址
info:
app.name: microservicecloud
company.name: www.baidu.com
---
server:
port: 8001
spring:
profiles: test
application:
name: microservicecloud-config-dept-client
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 目前資料源操作類型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
url: jdbc:mysql://localhost:3306/cloudDB02 # 資料庫名稱
username: root
password: 671354
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.smxy.lq.entities # 所有Entity别名類所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射檔案
eureka:
client: #用戶端注冊進eureka服務清單内
service-url:
defaultZone: http://eureka7001:7001/eureka/
instance:
instance-id: microservicecloud-dept8001 #服務名稱
prefer-ip-address: true #通路路徑可以顯示IP位址
info:
app.name: microservicecloud
company.name: www.baidu.com
建立microservicecloud-config-eureka-client-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.atguigu.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-config-eureka-client-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,指向github的配置檔案
spring:
cloud:
config:
name: microservicecloud-config-eureka-client #需要從github上讀取的資源名稱,注意沒有yml字尾名
profile: dev #本次通路的配置項
label: master
uri: http://config-3344.com:3344 #本微服務啟動後先去找3344号服務,通過SpringCloudConfig擷取GitHub的服務位址
application.yml
spring:
application:
name: microservicecloud-config-eureka-client
其他的與之前的7001沒什麼差別
建立microservicecloud-config-dept-client-8001微服務添加依賴
<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-dept-client-8001</artifactId>
<dependencies>
<!-- SpringCloudConfig配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- actuator監控資訊完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 将微服務provider側注冊進eureka -->
<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>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>
添加bootstrap.yml配置,name填寫github的配置檔案
spring:
cloud:
config:
name: microservicecloud-config-dept-client #需要從github上讀取的資源名稱,注意沒有yml字尾名
#profile配置是什麼就取什麼配置dev or test
profile: dev
#profile: test
label: master
uri: http://config-3344.com:3344 #SpringCloudConfig擷取的服務位址
其它的配置與之前的microservicecloud-provider-dept-8001一緻,依次啟動
microservicecloud-config-3344、
microservicecloud-config-eureka-client-7001
microservicecloud-config-dept-client-8001的微服務,
更改bootstrap.yml中的profile的屬性就可以實作動态更改政策
springcloud完整代碼:
https://github.com/yjp245/microservicecloud