SpringCloud(五)SpringCloud Config 分布式配置中心

目录

1.为什么使用分布式配置中心

2.什么是分布式配置中心

3.常用的分布式配置中心框架有哪些

4.分布式配置中心一般需要哪些组件

5.config原理:

6.搭建 config 分布式配置中心

6.1.搭建git环境

6.2.搭建ConfigServer服务器

6.3.搭建ConfigClient服务器

7.动态刷新配置文件信息

7.1.重启服务器方式

7.2.动态刷新方式

手动刷新

8.阿波罗分布式配置中心


 

1.为什么使用分布式配置中心?

传统的配置文件管理方式,当配置文件发生改变时,需要到项目中找到对应的配置文件然后进行修改,重新打包,启动项目,重新读取配置信息到 jvm 内存中。而在微服务中,如果使用传统的方式管理配置文件,因为配置文件会比较多,所以配置文件的管理会非常复杂。这时候我们就出现了分布式配置中心。

 

 

2.什么是分布式配置中心?

在微服务中,使用统一的服务器管理所有的配置文件信息,能够实现后台可管理,当服务器正在运行时,如果配置文件发生改变,可以在后台直接修改配置文件,然后不需要重新启动服务器就可以实时更新配置文件信息。

 

 

3.常用的分布式配置中心框架有哪些?

1)阿波罗,携程开发的分布式配置中心框架,有图形管理界面可以管理配置文件,配置文件的信息存储在数据库里。

2)zookeeper,也可以使用zookeeper实现分布式配置中心,持久节点+事件通知。

3)springcloud 自带的框架 config,没有后台界面可以管理配置文件信息,配置文件都存储在版本控制器中(git/svn)

强调:一般公司不会使用springcloud config分布式配置中心,大部分使用的都是阿波罗框架,因为springcloud config 没有像阿波罗一样有图形管理界面可以管理配置文件,管理起来比较麻烦,所以不建议使用springcloud config分布式配置中心,此篇文件是让我们理解分布式配置中心的原理,开发中还是推荐使用阿波罗作为分布式配置中心。

 

 

4.分布式配置中心一般需要哪些组件?

1)web管理系统:后台可以使用图形管理界面管理配置文件,阿波罗有图形管理界面,springcloud config没有管理界面。

2)存储分布式配置文件的服务器(持久存储服务器):springcloud config 存储在版本控制器中,阿波罗存储在数据库中。

3)ConfigServer 缓存配置文件服务器(临时存储服务器)

4)ConfigClient 读取ConfigServer 中的配置文件信息

 

 

5.config原理:

开发人员将配置文件提交到版本控制工具中,git/svn 持久存放配置文件信息,configServer缓存服务器可以从git/svn环境中读取配置文件信息,临时存放到缓存服务器中,ConfigClient 客户端可以从ConfigServer缓存服务器上读取配置文件信息,也保存到客户端本地。

问题:为什么要在客户端和持久存储服务器中间加一层ConfigServer缓存服务器呢?

答:配置文件本来就不是经常修改的,如果每次需要读取配置文件,都要去持久存放服务器中读取,那样效率就太低了,而如果从缓存服务器上读取就会方便很多。当然,如果持久存储服务器上的配置文件信息发生改变,可以通过手动刷新,或者实时更新的方式,及时的刷新到缓存服务器上,以及客户端本地缓存上。


SpringCloud(五)SpringCloud Config 分布式配置中心_第1张图片

 


 

 

6.搭建 config 分布式配置中心

6.1.搭建git环境

首先,我们需要一个git环境,我是使用 码云 创建了一个git环境

https://gitee.com/xuruanshun/gkconfig.git

 

公司的项目环境划分:

dev 开发环境、sit 测试环境、pre 预生产环境、prd 准生产环境

Git环境中,配置文件存放的位置,以项目(服务)进行划分,比如:

member_config:会员服务配置文件

order_config: 订单服务配置文件

 

配置文件的命名规则:服务名称-环境.后缀,比如:

order-dev.yml

order-sit.yml

 

 

我在 gkconfig 仓库里创建了一个文件夹 order_config,里面有两个配置文件:


SpringCloud(五)SpringCloud Config 分布式配置中心_第2张图片

 

SpringCloud(五)SpringCloud Config 分布式配置中心_第3张图片

 

SpringCloud(五)SpringCloud Config 分布式配置中心_第4张图片

注意:内容要符合yml文件的格式。


 

6.2.搭建ConfigServer服务器

1)创建一个项目 springcloud-configserver,作为configserver服务器,读取 git 中的配置文件

SpringCloud(五)SpringCloud Config 分布式配置中心_第5张图片

 

2)引入依赖



    4.0.0

    com.itmayiedu
    springcloud-configserver
    1.0-SNAPSHOT

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.1.RELEASE
    

    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Finchley.M7
                pom
                import
            
        
    

    
        
        
            org.springframework.cloud
            spring-cloud-config-server
        
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
    

    
    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/libs-milestone
            
                false
            
        
    

 

3)application.yml

###服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka
spring:
  application:
    ####注册中心应用名称
    name: config-server
  cloud:
    config:
      server:
        git:
          ###git环境地址
          uri: https://gitee.com/xuruanshun/gkconfig.git
          ####搜索目录
          search-paths:
            - order_config
      ####读取分支
      label: master
####端口号
server:
  port: 8888

注:

1.我们可以将configserver注册到注册中心,configclient读取configserver的配置信息时,直接通过服务名称到注册中心获取configserver的实际信息,远程调用配置信息。

2.git仓库名称是 gkconfig,仓库里有文件夹 order_config,里面有两个配置文件,分支是master。

 

4)启动类

package com.itamyiedu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableConfigServer
@EnableEurekaClient
@SpringBootApplication
public class ConfigServerApplication {

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

}

@EnableConfigServer:开启分布式配置中心服务器端

 

5)启动eureka,启动configserver项目,浏览器访问配置文件,看configserver是否读取到git上的配置文件。


SpringCloud(五)SpringCloud Config 分布式配置中心_第6张图片

SpringCloud(五)SpringCloud Config 分布式配置中心_第7张图片


 

 

6.3.搭建ConfigClient服务器

1)创建一个项目 springcloud-configclient,作为configclient客户端,读取 configserver 中的配置文件

SpringCloud(五)SpringCloud Config 分布式配置中心_第8张图片

2)引入依赖



    4.0.0

    com.itmayiedu
    springcloud-config-client
    1.0-SNAPSHOT

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.1.RELEASE
    
    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Finchley.M7
                pom
                import
            

        
    
    
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.cloud
            spring-cloud-config-client
        
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
    
    
    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/libs-milestone
            
                false
            
        
    

3)bootstrap.yml文件

spring:
  application:
    #### 注册中心应用名称
    name: order
  cloud:
    config:
      #### 读取版本环境
      profile: dev
      #### 读取config-server注册服务名称
      discovery:
        service-id: config-server
        #### 开启读取权限
        enabled: true
##### eureka服务注册地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8100/eureka
server:
  port: 8882

解释:

SpringCloud(五)SpringCloud Config 分布式配置中心_第9张图片

4)Controller

package com.itmayiedu;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

   @Value("${itmayieinfo}")
   private String itmayieinfo;

   @RequestMapping("/getItmayieinfo")
   public String getItmayieinfo() {
      return itmayieinfo;
   }

}

5)启动类

package com.itmayiedu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class ConfigClientApplication {

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

}

6)启动eureka,启动configserver,启动configclient,浏览器访问(配置的是生产环境)

SpringCloud(五)SpringCloud Config 分布式配置中心_第10张图片

7)修改成测试环境,浏览器再次访问

SpringCloud(五)SpringCloud Config 分布式配置中心_第11张图片

SpringCloud(五)SpringCloud Config 分布式配置中心_第12张图片

注意:如果没有搜索到对应的配置文件,或者没有搜索到配置文件中的信息,项目启动会报错。

 

 

7.动态刷新配置文件信息

7.1.重启服务器方式

 

默认情况下,config是不能及时的获取实时变更的配置文件信息的。

 

我们修改 git 中的order-sit.yml文件

SpringCloud(五)SpringCloud Config 分布式配置中心_第13张图片

浏览器访问configserver服务器,发现已经同步更新了。

SpringCloud(五)SpringCloud Config 分布式配置中心_第14张图片

浏览器访问configclient服务器,发现没有更新

SpringCloud(五)SpringCloud Config 分布式配置中心_第15张图片

所以,在默认情况下,修改git中的配置文件,configserver是同步更新的,但是configclient不是同步更新的。

此时,我们可以通过重新启动configclient服务器,获取最新的配置文件信息:

SpringCloud(五)SpringCloud Config 分布式配置中心_第16张图片

 

7.2.动态刷新方式

每次修改配置文件,都要重新启动服务器,太不方便了,我们可以使用 springcloud config 手动刷新或者自动刷新的方式,获取实时的配置文件信息。无论是手动刷新,还是自动刷新,都不用重启服务器。

手动刷新:需要手动的调用接口,读取最新的配置文件信息,采用的是监控中心的方式。

自动刷新:使用消息总线的方式进行实时通知,这种方式本篇文章不作介绍,后文在消息总线时候说。

 

 

手动刷新:

1)添加监控中心的依赖



    org.springframework.boot
    spring-boot-starter-actuator

2)bootstrap.yml 新增

##### 开启所有监控断点
management:
  endpoints:
    web:
      exposure:
        include: "*"

3)在需要刷新的Bean上添加@RefreshScope注解。

package com.itmayiedu;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class IndexController {

   @Value("${itmayieinfo}")
   private String itmayieinfo;

   @RequestMapping("/getItmayieinfo")
   public String getItmayieinfo() {
      return itmayieinfo;
   }
}

4)重新启动服务器,修改配置文件

SpringCloud(五)SpringCloud Config 分布式配置中心_第17张图片

5)浏览器访问configclient,发现此时数据依然没变。

SpringCloud(五)SpringCloud Config 分布式配置中心_第18张图片

 

6)我们需要手动调用接口,刷新configclient中的配置文件

手动刷新接口:使用Post请求手动刷新:/actuator/refresh

SpringCloud(五)SpringCloud Config 分布式配置中心_第19张图片

7)再次访问,同步成功

SpringCloud(五)SpringCloud Config 分布式配置中心_第20张图片

 

 

问题:

使用@RefreshScope注解时候遇到一个问题,当不使用此注解时候,浏览器可以访问到数据,当使用到此注解时,浏览器访问一直为null,找了半天原因,原来是因为我的方法写成private权限的了,改成public就可以了。

SpringCloud(五)SpringCloud Config 分布式配置中心_第21张图片

 

注意:

在实际开发中,不建议使用自动刷新的公司拟,对性能不是很好。建议每次改完配置文件之后,手动调用接口,刷新配置文件。

 

 

8.阿波罗分布式配置中心

在实际开发中是不建议使用springcloud config,而建议使用阿波罗,详情参看文档:

SpringCloud 集成Apollo分布式配置中心   https://blog.csdn.net/hu_zhiting/article/details/89707448

 

后文:代码已上传到码云 https://gitee.com/xuruanshun/springcloud.git

你可能感兴趣的:(分布式)