Config组件

又称为 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个一个服务手动维护。

img点击并拖拽以移动

Config Server开发

1.引入依赖

<dependencies>
      <!--引入springboot-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!-- 引入consul-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-consul-discovery</artifactId>
      </dependency>
      <!--引入actuator-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>


      <!---==============引入统一配置中心=====================-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-config-server</artifactId>
      </dependency>
  </dependencies>

2.开启统一配置中心服务

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer  //统一配置中心服务
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class);
    }
}

3.修改配置文件

server.port=7878
spring.application.name=CONFIGSERVER

# consul
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

4.直接启动服务报错:没有指定远程仓库的相关配置

***************************
APPLICATION FAILED TO START
***************************

Description:

Invalid config server configuration.

Action:

If you are using the git profile, you need to set a Git URI in your configuration.  If you are using a native profile and have spring.cloud.config.server.bootstrap=true, you need to use a composite configuration.

**5.创建远程仓库: ** gitee创建一个仓库

img点击并拖拽以移动

6.在统一配置中心服务中修改配置文件指向远程仓库地址

server.port=7878
spring.application.name=CONFIGSERVER

# consul
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500


#------------------远程仓库配置----------------
#指定仓库的url:
spring.cloud.config.server.git.uri=https://gitee.com/sovzn/configs.git
#指定访问的分支:
spring.cloud.config.server.git.default-label=master


#私有仓库的话还要配置访问用户名和访问密码:
#spring.cloud.config.server.git.username=
#spring.cloud.config.server.git.password=		

7.再次启动统一配置中心: 成功启动

Config client开发

config client也就是系统中的一个个微服务

1.项目中引入config client依赖

<!--web-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <!--consul-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  </dependency>
  <!--actuator-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>

<!--========================================-->
  <!--引入config client-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
  </dependency>
<!--========================================-->

2.编写配置文件bootstrap.properties

#告诉当前微服务(configclient)统一配置中心(ConfigServer)在注册中心服务id
spring.cloud.config.discovery.service-id=CONFIGSERVER
#开启当前微服务(configclient)根据服务id去注册中心获取
spring.cloud.config.discovery.enabled=true

#配置注册中心
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500


#获取哪个配置文件 1.确定分支  2.确定文件名  3.确定环境
spring.cloud.config.label=master
spring.cloud.config.name=configclient
spring.cloud.config.profile=prod

# 本地配置时指定配置环境
#spring.profiles.active=dev

3.远程仓库创建配置文件

注意远程配置文件的命名规则(yaml 和properties一样):

  • 公共配置文件:文件名.properties

  • 不同环境配置文件:文件名-环境名.properties

如:

公共配置文件:configclient.properties

spring.application.name=CLIENTOFCONFIG

#其他公共配置信息.....

开发环境配置文件:configclient-dev.properties

server.port=9099
name=I am Dev

#开发环境相关数据库配置
#其他配置....

上线产品环境配置文件:configclient-prod.properties

server.port=9098
name=I am Prod

#上线产品环境相关数据库配置
#上线产品其他配置....

img点击并拖拽以移动

可以在统一配置中心服务(ConfigServer)直接访问,看是否可以拉取到相应配置文件:

img点击并拖拽以移动

成功拉取到公共配置和对应环境配置信息

img点击并拖拽以移动

控制台打印出对应配置信息的缓存位置

4.编写一个接口,用于获取配置文件中的name属性

@RestController
public class DemoController {
    @Value("${name}")  //获取配置文件中的变量
    String name;

    @GetMapping("Demo")
    public String demo(){
       return "获取配置文件中的name"+name;
    }
}

5.启动服务测试:

成功获取到配置文件configclient-prod.properties:

img点击并拖拽以移动

在配置文件中修改为获取开发环境配置文件(dev)

spring.cloud.config.label=master
spring.cloud.config.name=configclient
spring.cloud.config.profile=dev

重新启动:成功获取到配置文件configclient-dev.properties:

img点击并拖拽以移动

另外一定要注意,config client中的配置文件,不管是yaml还是properties文件,都需命名为bootstrap,否则启动时会直接报错,因为application.properties文件是springboot的默认配置文件,使用这个配置文件在springboot项目启动过程中不会等待远程配置拉取,直接根据配置文件中内容启动,因此当需要注册中心,服务端口等信息时,远程配置还没有拉取到,所以直接报错

img点击并拖拽以移动

问题:

虽然现在可以通过“统一配置中心服务”来获取远程仓库的配置文件,但是如果我们更新修改了远程仓库的配置文件,就只能够重启当前服务来重新获取最新的配置文件。

手动配置刷新

当远程仓库中的配置发生变化时,不需要重启微服务就可以直接读取远端修改后的配置信息。

实现配置手动刷新

1.在config client端加入刷新暴露端点

management.endpoints.web.exposure.include=* 

2.在需要刷新代码的类中加入刷新配置的注解

@RestController
@RefreshScope
/**
 * @RefreshScope的作用:
 * 用来在不需要重启微服务的情况下,将当前scope域中的信息刷新
 * 为最新的配置信息
 */
public class DemoController {
    @Value("${name}")  //获取配置文件中的变量
    String name;

    @GetMapping("Demo")
    public String demo(){
       return "获取配置文件中的name:"+name;
    }
}

3.每次更新完远端的配置文件后,给需要刷新配置文件的微服务发送一个POST请求,请求的路径为

http//IP:端口/actuator/refresh

测试:

未修改配置文件前访问:

img点击并拖拽以移动

修改远程仓库中的配置信息:将name的值改为 “I am Dev (New DEV ……)”

img点击并拖拽以移动

向当前服务发送一个更新配置信息的请求:

localhost:9099/actuator/refresh

img点击并拖拽以移动

在此访问:成功获取到配置文件中刷新后的name值

img点击并拖拽以移动

虽然这种手动刷新配置文件的方式可以在不重启服务的前提下实现对配置文件的刷新,但是,我们需要给每个需要刷新的配置文件信息的服务都发送一个刷新请求,如果微服务的数量庞大的话,这种操作显然不太理想。我们可以通过BUS组件来实现所有服务的统一配置文件刷新。