天天看點

SpringCloud之Config分布式配置中心

SpringCloud之Config分布式配置中心

分布式系統面臨的配置問題

微服務意味着要将機關應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,是以系統中将會出現大量的服務。由于每個服務都需要必要的配置資訊才能運作,是以一套集中式的、動态的配置管理設施是必不可少的。SpringCloud提供了ConfigServer來解決這個問題,我們每一個微服務自己帶着一個application.yml,上百個配置檔案的管理。。。、/T o T/~~

SpringCloud Config為微服務架構中的微服務提供集中化的外部配置支援,配置伺服器為各個不同微服務應用的所有環境提供了一個中心化的外部配置。

SpringCloud之Config分布式配置中心

SpringCloud Config分為服務端和用戶端兩個部分。

服務端也稱為分布式配置中心,它是一個獨立的微服務應用, 用來連接配接配置伺服器并為用戶端提供擷取配置資訊,加密/解密資訊等通路接口

用戶端則是通過指定的配置中心來管理應用資源,以及與業務相關的配置内容,并在啟動的時候從配置中心擷取和加載配置資訊。配置伺服器預設采用git來存儲配置資訊,這樣就有助于對環境配置進行版本管理,并且可以通過git用戶端工具來友善的管理和通路配置内容。

SpringCloud Config服務端的配置

使用自己的github賬戶,添加一個倉庫microservicecloud-config

SpringCloud之Config分布式配置中心

複制https路徑:

https://github.com/yjp245/microservicecloud-config.git

SpringCloud之Config分布式配置中心

在本地建立一個目錄将github上工程克隆下來

SpringCloud之Config分布式配置中心

克隆後,建立一個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主機
           
SpringCloud之Config分布式配置中心

這時檢視github 便可以看到上傳的檔案

SpringCloud之Config分布式配置中心

建立微服務項目與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);
	}
}

           

配置本地服務域名:

SpringCloud之Config分布式配置中心

添加:

127.0.0.1 config-3344.com

SpringCloud之Config分布式配置中心

啟動測試:

http://config-3344.com:3344/master/application-test.yml

SpringCloud之Config分布式配置中心

http://config-3344.com:3344/master/application-dev.yml

SpringCloud之Config分布式配置中心

SpringCloud Config用戶端的配置

建立Spring Cloud Config用戶端,通過服務端從git擷取配置檔案資訊,首先建立一個往git上面建立一個microservicecloud-config-client.yml配置檔案

SpringCloud之Config分布式配置中心

填寫

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

SpringCloud之Config分布式配置中心

建立一個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

SpringCloud之Config分布式配置中心

當我們把bootstrap配置檔案中的 profile更改為 dev,再啟動通路的便是git上的8201端口

SpringCloud之Config分布式配置中心

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

繼續閱讀