分佈式系統面臨的配置問題:微服務意味着將單體應用拆分成一個個自服務,這些服務都是要相應的配置信息才能運行,隨着系統內微服務數量越來越多,配置信息也不斷地增多,所以一套集中式的、動態的配置管理設施是必不可少的
- SpringCLoud Config 爲微服務架構中的微服務提供集中化的外部配置支持,配置服務器爲各個不同微服務應用
的所有環境提供了一箇中心化的外部配置; - SpringCloud Config 分爲服務端和客戶端:
- 服務端也稱爲分佈式配置中心,它是一個獨立的微服務應用,用來連接配置服務器併爲客戶端提供獲取配置信息,
加密/解密信息等訪問接口; - 客戶端則是通過指定的配置中心來管理應用資源,以及與業務相關的配置內容,並在啓動的時候從配置中心獲取和
加載配置信息;
- 服務端也稱爲分佈式配置中心,它是一個獨立的微服務應用,用來連接配置服務器併爲客戶端提供獲取配置信息,
- 配置服務器默認採用Git來存儲配置信息;
- SpringCloud Config解決的問題:
1. 集中管理配置文件
2. 不同環境不同配置,動態化的配置更新
3. 運行期間動態調整配置,不再需要在每個服務部署的機器上編寫配置文件,讓服務中心統一爲服務拉取配置文件
4. 當配置發生變動時,服務不需要重啓即可感知配置變化並應用
5. 將配置信息以REST接口形式暴露
SpringCloud Config服務端與Github通訊
目標:將配置文件部署在github,Config服務端從github獲取配置
GitHub 準備工作:
// GitHub 新建一個名爲 microservicecloudd-config 的新Repository
// 獲得SSH協議的git地址: [email protected]:Noodlescn/microservicecloud-config.git
// 本地硬盤目錄上,新建Git倉庫,並clone
git clone [email protected]:Noodlescn/microservicecloud-config.git
// 本地Git倉庫,microservicecloud-config 新建 application.yml
spring:
profiles:
active:
- dev
---
spring:
profiles: dev # 開發環境
application:
name: microservicecloud-config-noodles-dev
---
spring:
profiles: test # 測試環境
application:
name: microservicecloud-config-noodles-test
# 文件保存爲 UTF-8 格式
// 將application.yml推送到github上新建 microservicecloud-config-3344(Cloud的配置中心模塊)
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- 避免Config的Git插件報錯 -->
<dependency>
<groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId>
<version>4.10.0.201712302008-r</version>
</dependency>
server:
port: 3344
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: [email protected]:Noodlescn/microservicecloud-config.git # GitHub上面的git倉庫名字
編寫主啓動類,加入@EnableConfigServer註解@SpringBootApplication
@EnableConfigServer
public class Config_3344_StartSpringCloudApp {
public static void main(String[] args) {
SpringApplication.run(Config_3344_StartSpringCloudApp.class, args);
}
}
// 修改hosts文件,增加映射
// 127.0.0.1 config-3344.com
// 測試啓動微服務 3344// http://config-3344.com:3344/application-dev.yml
// http://config-3344.com:3344/application-test.yml
啓動服務並嘗試訪問配置文件,有以下五種訪問配置規則
- {profile}:讀取的環境
- {lable}:分支
/{application}/{profile}[/{lable}]
/{application}-{profile}.yml
/{lable}/{application}-{profile}.yml
/{application}-{profile}.properties
/{lable}/{application}-{profile}.properties
可用例子(返回格式可能不大相同,但返回值相同):- http://config3344.com:3344/application-test.yml
- http://config3344.com:3344/master/application-dev.yml
- http://config3344.com:3344/application-test.yml/master
不可用例子:
- 沒有該環境,返回空值:http://config3344.com:3344/application-test11.yml/master
- 沒有配置文件,犯回錯誤頁面:http://config3344.com:3344/lkjliiusdfsddsfl.yml
SpringCloud Config客戶端配置
GitHub 準備工作
// 本地 microservicecloud-config倉庫 路徑下新建文件 microservicecloud-config-client.yml
spring:
profiles:
active
- dev
---
server:
port: 8201
spring:
profiles: dev
application:
name: microservicecloud-config-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-test.com:7001/eureka/
// 提交到GitHub新建 microservicecloud-config-client-3355
<!-- springCloud Config 客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
### bootstrap.yml介紹- bootstrap.yml比application.yml具有更高的優先級。
- bootstrap.yml是系統級的資源配置項,application.yml是用戶級的資源配置項。
- SpringCloud會創建"BootStrap Context"作爲"ApplicationContext"的=父上下文=。初始化的時候BootStrap Context負責從外部源加載配置屬性並解析。這兩個上下文共享一個"Environment",BootStrap 具有更高優先級,他們不會被本地配置覆蓋
// bootstrap.yml(是系統級配置文件,優先級最高)
spring:
cloud:
config:
name: microservicecloud-config-client # 需要從github上讀取的資源名稱,注意沒有yml後綴名
profile: dev # 本次訪問的配置項
label: master
uri: http://config-3344.com:3344
# 本微服務啓動後,先去找3344號服務,通過SpringCloudConfig獲取GitHub的服務地址
// application.yml(是用戶級的資源配置項)
spring:
application:
name: microservicecloud-config-client
// 修改hosts文件: 127.0.0.1 client-config.com
// 新建rest類,驗證是否能從GitHub上讀取配置
@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")
private String getConfig() {
String str = "applicationName:"+applicationName+"\t eurekaServers:"+eurekaServers+"\t port:"+port;
System.out.println("********str:" + str);
return str;
}
}
// 主啓動類ConfigClient_3355_StartSpringCloudApp
@SpringBootApplication
public class ConfigClient_3355_StartSpringCloudApp {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_3355_StartSpringCloudApp.class, args);
}
}
先啓動config server服務,然後再啓用本client服務,根據profiles的值訪問對應的端口即可。如本例選擇的是dev,則訪問端口爲:http://config3355.com:8201/config。(config3355.com爲hosts文件中配置了的映射)SpringCloud Config 配置實戰
GitHub 準備工作
介紹:其實前面client的配置案例都是幫助理解這個組件爲主,並沒有很大的實際意義。。。。。。這次案例中是配置一個Provider,一個eureka,他們的配置統一在github上獲取,實現統一配置分佈式管理和多環境變更,這個才比較有實戰意義
// 本地microservicecloud-config倉庫 下新建:
// microservicecloud-config-eureka-client.yml
spring:
profiles:
active:
- dev
---
server:
port: 7001
spring:
profiles: dev
application:
name: microservicecloud-config-eureka-client
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false # 當前的eureka-server自己不註冊進服務列表中
fetch-registry: false # 不通過eureka獲取註冊信息
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
---
server:
port: 7001 # 註冊中心佔用7001端口
spring:
profiles: test
application:
name: microservicecloud-config-eureka-client
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false # 當前的eureka-server自己不註冊進服務列表中
fetch-registry: false # 不通過eureka獲取註冊信息
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
// 本地microservicecloud-config 下新建:// microservicecloud-config-dept-client.yml
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
url: jdbc:mysql://localhost:3306/cloudDB01
username: root
password: root
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml
type-aliases-package: com.noodles.springcloud.entities
mapper-locations:
- classpath:mybatis/mapper/**/*.xml
eureka:
client: # 客戶端註冊進eureka服務列表內
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: dept-8001.com
prefer-ip-address: true
info:
app.name: noodles-microservicecloud-springcloudconfig01
company.name: www.google.com
build.artifactId: $project.artifactId$
build.version: $project.version$
---
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
url: jdbc:mysql://localhost:3306/cloudDB02
username: root
password: root
dbcp2:
min-idle: 5
initial-size: 5
max-total: 5
max-wait-millis: 200
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml
type-aliases-package: com.noodles.springcloud.entities
mapper-locations:
- classpath:mybatis/mapper/**/*.xml
eureka:
client: # 客戶端註冊進eureka服務列表內
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
instance-id: dept-8001.com
prefer-ip-address: true
info:
app.name: noodles-microservicecloud-springcloudconfig02
company.name: www.google.com
build.artifactId: $project.artifactId$
build.version: $project.version$
// 上傳GitHub新建 microservicecloud-config-eureka-client-7001 工程 (Config版的eureka服務端)
// pom.xml(參照microservicecloud-eureka-7001)
<!-- springCloud Config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
// bootstrap.yml
spring:
cloud:
config:
name: microservicecloud-config-eureka-client # 需要從GitHub上讀取的資源名稱,沒有yml後綴名
profile: dev
label: master
uri: http://config-3344.com:3344 # SpringCloudConfig 獲取的服務地址
// application.yml
spring:
application:
name: microservicecloud-config-eureka-client
// 主啓動類
@SpringBootApplication
@EnableEurekaServer // EurekaServer 服務器端啓動類,接收其他微服務註冊進來
public class Config_Git_EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(Config_Git_EurekaServerApplication.class, args);
}
}
//測試
// 啓動 microservicecloud-config-3344
// 啓動 microservicecloud-config-eureka-client-7001
// 訪問 http://eureka7001.com:7001/
新建 microservicecloud-config-dept-client-8001(Config版的dept微服務)
// pom.xml(參照8001)
<!-- SpringCloud 配置 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
// bootstrap.yml
spring:
cloud:
config:
name: microservicecloud-config-dept-client # 需要從GitHub上讀取的資源名稱
# profile 配置什麼就讀取什麼,配置 dev 或 test
profile: test
label: master
uri: http://config-3344.com:3344 # SpringCloudConfig 獲取的服務地址
// application.yml
spring:
application:
name: microservicecloud-config-dept-client
// 主啓動類
@SpringBootApplication
@EnableEurekaClient // 本服務啓動後,自動註冊進eureka服務中
@EnableDiscoveryClient // 服務發現
public class DeptProvider8001_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
// 測試
// 默認訪問 test 配置: http://localhost:8001/dept/list
// 更換 dev 配置: http://localhost:8001/dept/list