分布式面临的配问题:

微服务意味着要将单体应用中的业务分成一个个自服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的 配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题。我们每一个微服务自己都带着一个application.yml,上百个配偶文件的管理。。。该如何解决呢?

分布式ConfigServer是什么?


SpringCloud Config为微服务架构中微服务提供集中化的外部配置支持,配置服务器为<mark>各个不同微服务应用的所有环境提供了一个中心化的外部配置</mark>。

  1. <mark>怎么用?</mark>
    SpringCloud Config分为服务端和客户端两部分。
    服务端也称为<mark>分布式配置中心</mark>,<mark>它是一个独立的微服务应用</mark>,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
    客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用的是git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便管理和访问配置内容。
  2. <mark>能做什么?</mark>
    1. 集中管理配置文件
    2. 不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release
    3. 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置我呢间,服务会向配置中心统一拉取配置自己的信息。
    4. 当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置。
    5. 将配置信息以REST接口的形式暴露。
  3. 与GitHub整合配置
    由于SpringCloud Config默认使用Git来存储配置文件(也有其它方式,比如支持SVN和本地文件),但最推荐的还是Git,而且使用的是http/https访问的形式

==Config服务端配置:

配置流程图:

  1. 在GitHub创建仓储:
  2. copySSH协议git地址:

  3. 运行截图:


    在本地指定的仓储位置上创建一个application.yml 文件。

    <mark>记住</mark>:这里的application.yml文件内容必须以UTF-8的格式保存。(必须)


    pwd:返回当前目录
    git status:git监控当前目录的文件。红色代表是监控到的文件。
    git add .:提交到临时库(<mark>记住add后面有空格和一个点</mark>)。
    git commit -m “init file”:把当前这个文件变成一个git能够管理的仓库。
    git push origin master:上传到GitHub网站上去。

    上传成功的截图:
    **
    <mark>部署文件到GitHub上步骤</mark>:




创建3344工程,
配置pom文件,需要添加Config的依赖如下:

<!-- 引入springcloud config的依赖 == start -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>
		<!-- 引入springcloud config的依赖 == end -->

完整的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.lyj.springcloud</groupId>
		<artifactId>microservicecloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>microservicecloud-config-3344</artifactId>

	<dependencies>
		<!-- 引入springcloud config的依赖 == start -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>
		<!-- 引入springcloud config的依赖 == end -->
		<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==start -->
		<dependency>
			<groupId>org.eclipse.jgit</groupId>
			<artifactId>org.eclipse.jgit</artifactId>
			<version>4.10.0.201712302008-r</version>
		</dependency>
		<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==end -->
		<!-- 引入图形化监控== start -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<!-- 引入图形化监控== end -->
		<!-- 引入熔断机制 依赖 ==start -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix</artifactId>
		</dependency>
		<!-- 引入熔断机制 依赖 ==end -->
		<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>
		<!-- 引入热部署插件依赖 ==start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<!-- 引入热部署插件依赖 ==end -->

	</dependencies>

</project>

创建application.yml文件,配置如下:

server:
  port: 3344
  
spring:
  application:
    name: microservicecloud-config
  cloud:
    config:
      server:
        git:
          uri: git@github.com:lingxi-lyj/microservicecloud-config.git #github上面的git仓库名字(SSH协议链接或者) 
# SSH协议链接: git@github.com:lingxi-lyj/microservicecloud-config.git
# https://github.com/lingxi-lyj/microservicecloud-config
# 以上是该仓储访问链接, 冒号后面就是GitHub用户名,访问链接前缀为"git@",后缀为".git"。
  

创建主程序application。在主程序头上添加@EnableConfigServer注解,开启分布式Config 功能。
主程序如下:

package com.lyj.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_StartSpringApp {

    public static void main(String[] args) {
        
        SpringApplication.run(Config_3344_StartSpringApp.class, args);
    }
}

在C盘的hosts文件里配置映射:
添加:
“127.0.0.1 config-3344.com
测试:

运行结果:

下面的这个访问地址不存在,并且application-xxxx.yml,中的 “xxx”中有特殊字符“;”,所以访问是失败的,如果不包含特殊字符,则返回是空的下下面的一张图

配置的读取规则:

如图:

访问规则:

测试如下规则

测试下面的规则:

4.
5.

SpringCloud 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上去。
然后在父工程下创建子模块3355工程。
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.lyj.springcloud</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-config-client-3355</artifactId>
  
<dependencies>
		<!-- 引入springcloud config客户端的依赖 == start -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>
		<!-- 引入springcloud config客户端的依赖 == end -->
		<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==start -->
		<!-- <dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit</artifactId> <version>4.10.0.201712302008-r</version> </dependency> -->
		<!-- 避免Config的git插件报错:org/eclipse/jgit/api/TransportConfigCallback ==end -->
		<!-- 引入图形化监控== start -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<!-- 引入图形化监控== end -->
		<!-- 引入熔断机制 依赖 ==start -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix</artifactId>
		</dependency>
		<!-- 引入熔断机制 依赖 ==end -->
		<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>
		<!-- 引入热部署插件依赖 ==start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		<!-- 引入热部署插件依赖 ==end -->

	</dependencies>

</project>

这个时候不在创建application.yml 文件,是创建bootstrap.yml 文件,配置如下:

spring:
  cloud:
    config:
    #需要从GitHub上读取的资源名称,注意没有yml后缀名
      name: microservicecloud-config-client
      profile: dev #本次访问的配置项
      label: master
      #本微服务启动后先去找3344号服务,通过SpringCloudConfig获取GitHub的服务地址
      uri: http://config-3344.com:3344 

<mark>为什么是bootstrap.yml文件呢?</mark>

然后再创建一个application.yml文件,刚才那个是系统级的,而这个是用户级的,application.yml配置如下:

spring:
  application:
    name: microservicecloud-config-client

这里的application.yml配置的name名字一定要与bootstrap.yml文件配置的config-name名字要一致。
然后再在系统C盘里的hosts里添加映射“127.0…0.1 client-config.com

创建ConfigClientRest类文件

package com.lyj.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 :从自己配置文件里读取信息并赋值给这里的变量。 */
    @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 "applicationName" + applicationName + "\t eurekaServers:" + eurekaServers + "\t port" + port;

    }
}

创建主程序类:

package com.lyj.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);
    }
}

测试:

3344自测链接:http://config-3344.com:3344/application-dev.yml


如果要切换开发模式,只需要修改下面的profiled的值,修改为为GitHub里的application.yml仓储文件里的profile的值,即可切换application.yml环境模式。