欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud Config 分布式配置中心

程序员文章站 2022-07-03 18:12:33
...

SpringCloud Config 分布式配置中心

分布式系统面临的配置问题:微服务意味着将单体应用拆分成一个个自服务,这些服务都是要相应的配置信息才能运行,

随着系统内微服务数量越来越多,配置信息也不断地增多,所以一套集中式的、动态的配置管理设施是必不可少的。



概述:

    - SpringCloud Config是一个提供外部集中式配置管理的设施,配置服务器为各种不同的额微服务应用提供了一个中心化的       外部配置

    - SpringCloud Config分为客户端和服务端两部分


SpringCloud Config解决的问题:
      1. 集中管理配置文件
      2. 不同环境不同配置,动态化的配置更新,分环境部署比如:dev/test/prod/beta/release
      3. 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,让服务中心统一为服务拉取配置文件
      4. 当配置发生变动时,服务不需要重启即可感知配置变化并应用
      5. 将配置信息以REST接口形式暴露


客户端:

      通过指定的配置中心获取配置资源,cloud推荐用git来存储配置信息。


SpringCloud Config架构图】:

SpringCloud Config 分布式配置中心



SpringCloud Config服务端与Github通讯实现:

目标:将配置文件部署在github,Config服务端从github获取配置。

实现步骤:

1. 新建Config Server模块(服务端 )并配置pom.xml;

<dependencies>
        <!-- springCloud Config -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</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>

2. 建立远程仓库,并上传配置文件。(配置文件必须是utf-8编码)如下例子【application.yml】;

spring: 
    profiles: 
        active:
           - dev
---
spring:
    profiles: dev
    application:
        name: springcloud-config-server-dev
---
spring:
    profiles: test
    application:
        name: springcloud-config-server-test

3. 在application.yml文件中配置github地址;

server: 
  port: 6002
  
spring:
  application:
    name:  springcloud-config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/xxxyyyzzz09/repo_1.git #GitHub上面的git仓库名字
 

4. 编写主启动类,加入@EnableConfigServer注解;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableConfigServer
public class Config_Server_6002_App
{
	public static void main(String[] args)
	{
		SpringApplication.run(Config_Server_6002_App.class, args);
	}
}

5. 启动服务并尝试访问配置文件,有以下五种访问配置规则;
   - {application}:配置文件的文件名
   - {profile}:读取的环境
   - {lable}:分支

1.    /{application}/{profile}[/{lable}]
2.    /{application}-{profile}.yml
3.    /{lable}/{application}-{profile}.yml
4.    /{application}-{profile}.properties
5.    /{lable}/{application}-{profile}.properties

6.根据上面的规则,可访问链接:http://localhost:6002/application-dev.yml即可获得配置文件中的【dev】配置;

测试配置中心服务端是否能获取到GitHub上的配置信息:

SpringCloud Config 分布式配置中心



bootstrap.yml介绍:

  - bootstrap.yml比application.yml具有更高的优先级。
  - bootstrap.yml是系统级的资源配置项,application.yml是用户级的资源配置项。

  - SpringCloud会创建"BootStrap Context"作为"ApplicationContext"的【父上下文】。初始化的时候BootStrap Context 负责从外部源加载配置属性并解析。这两个上下文共享一个"Environment",BootStrap 具有更高优先级,他们不会被本地配置覆盖。


SpringCloud Config客户端的配置实现与测试:

介绍:客户端主要是在【加载时】通过config server服务端获得github配置仓库的地址,进而通过目标配置文件的文件名获取相应的配置,最后将取得的配置对自身资源进行赋值并提供访问;


实现过程如下:

1.创建远程配置yml文件并上传到github上。如下测试案例因为需要进行测试,所以配置了两个profiles【dev与test】方便切换并观察;

spring: 
    profiles: 
        active:
           - dev
---
server: 
    port: 8201
spring:
    profiles: dev
    application:
        name: springclouddemo-provider-dept-config-client-dev
eureka:
    client: 
        service-url: 
            defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
---
server: 
    port: 8202
spring:
    profiles: test
    application:
        name: springclouddemo-provider-dept-config-client-test
eureka:
    client: 
        service-url: 
            defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

2. 本地创建【springclouddemo-config-client-6003】模块,并配置好pom.xml,【spring-cloud-starter-config】是必选依赖;

 <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>

3.编写bootstrap.yml配置文件,这个步骤比较关键,主要是根据此处的配置信息去寻找config server以获得github仓库地址和配置中的目标配置文件文件名;

spring:
  cloud:
    config:
      name: application          #需要从github上读取的资源文件名称,注意没有yml后缀名
      profile: test              #本次访问的配置项(dev或test)
      label: master              #git分支名称
      uri: http://127.0.0.1:6002 #通过之前创建的Config服务端获取GitHub的服务地址
 


4.application.yml文件在本module中其实是可写可不写的,因为配置会从配置中心中获取。为了习惯需要,还是给他写了个名

spring:
  application:
    name: springcloud-config-client

5.编写主启动类;

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class ConfigClient_6003_App
{
	public static void main(String[] args) {
		SpringApplication.run(ConfigClient_6003_App.class, args);
	}
}

6.编写controller,此步骤也比较关键,主要是利用@Value注解赋值,若写错了bootstrap.yml中的配置文件名称而没有获取到配置,启动时这里会抛出异常。@Value中注解的参数即是目标配置文件中的参数值,使用El表达式获取;

@RestController
public class ConfigClientController
{

	@Value("${spring.application.name}")
	private String applicationName;

	@Value("${eureka.client.service-url.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;
	}

7. 先启动config server服务,然后再启用本client服务,根据profiles的值访问对应的端口即可。

如本例选择的是test,则访问端口为:http://localhost:8202/config。(test配置的port为8202)

就会得到controller的结果了。