引言:在现代的软件开发中,配置管理是一个至关重要的环节。传统的方式是将配置信息硬编码在应用程序中或者放在静态的配置文件中,这种方式存在诸多问题,比如修改配置需要重新部署应用,而且配置分散在不同的地方,不易管理和维护。为了解决这些问题,配置中心应运而生。配置中心是一个专门用来管理应用程序配置信息的服务,它能够将配置信息集中存储,并实现动态刷新。

题目

面试官:为什么要有配置中心这个组件?你怎么使用的?

推荐解析

我们 Spring 就有很多配置,比如 application.xml 等,像端口、密钥配置等等这些都是固定写在配置文件中的,修改起来不方便,可能每次还需要重启应用。

因此可以将这些配置放在配置中心里,其实配置中心就是一个服务,专门管理配置的服务。

它实现了配置的统一管理和动态刷新,它可以将配置信息进行一个集中化的存储,如 Zookeeper、Nacos、Apollo(阿波罗)等。当配置信息发生变化的时候,配置中心可以自动通知服务实例进行配置更新,然后在更新完成之后进行动态刷新,这样就可以实现在不重启实例的情况下进行配置的更新了,从一定程度上减少了系统访问的空窗期,且管理和部署都非常方便,只需要在配置中心进行操作就完成了。

有哪些配置中心?

与注册中心一样,常见的配置中心有很多种,如下所示:

1)Nacos:这个是现在比较流行的,也是我们比较熟悉的,很多同学可能会知道它可以作为注册中心,但是它也是可以作为配置中心的,如下图所示,这个就是 Nacos 作为配置中心的地方。Nacos 支持服务的注册与发现、动态 DNS 服务、服务健康检测等功能,是目前比较流行的注册中心与配置中心。

面试官:为什么要有配置中心这个组件?你怎么使用的?_配置信息

2)Zookeeper: Zookeeper 是一个开源的分布式协调服务,和 Nacos 一样,其既可以作为注册中心,又可以作为配置中心。

3)Consul: Consul 是一个开源的分布式服务发现与配置管理工具,也就是说,它即是注册中心,也是配置中心,它支持多种形式的配置文件,与 Nacos 一样具有健康检查、故障转移等功能。

4)Apollo: Apollo 是携程开源的配置中心,它支持多种语言和框架,并提供了丰富的配置管理功能,如配置版本管理、灰度发布等。

5)Etcd: Etcd 作为配置中心主要是因为其键值的特性,其是一个分布式键值存储系统,与 Redis 差不多,也可以作为分布式锁的工具,且由于它键值的特性,它也可以用作配置中心使用了,它主要是基于 Raft 算法保证数据的一致。

6)Spring Cloud Config: 这个是官方推荐的配置中心,它主要是将配置文件存储在 Git、SVN 等版本控制系统中,然后通过 Restful API 实现访问与管理。

以 Nacos 为例的简单使用

面试官:为什么要有配置中心这个组件?你怎么使用的?_动态刷新_02

Nacos 官网:https://nacos.io/docs/v2/what-is-nacos/

步骤一:添加Nacos依赖

在项目的pom.xml文件中添加Nacos的依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

步骤二:配置Nacos连接信息

application.propertiesapplication.yml中配置Nacos连接信息:

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 # Nacos服务器地址
        namespace: your-namespace # Nacos命名空间,可选
        group: your-group # 配置组,可选

步骤三:编写配置文件

在Nacos上创建配置文件,格式为{dataId}.{group}。例如,创建一个名为example.properties的配置文件,group为DEFAULT_GROUP

步骤四:在应用程序中加载配置信息

可以使用@Value注解或@RefreshScope注解来加载配置信息,并实现配置的动态刷新。

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

@RestController
public class ConfigController {

    @Value("${example.property}")
    private String exampleProperty;

    @GetMapping("/config")
    public String getConfig() {
        return "Config from Nacos: " + exampleProperty;
    }
}

步骤五:启动应用程序

启动Spring Boot应用程序,它将自动从Nacos加载配置信息,并提供/config接口返回配置值。

步骤六:在Nacos上修改配置信息

在Nacos配置中心修改example.properties中的配置信息,保存后,观察应用程序是否能够动态刷新配置。

其他补充


面试官:为什么要有配置中心这个组件?你怎么使用的?_配置文件_03

配置中心:

  1. 作用:配置中心用于集中管理应用程序的配置信息,包括但不限于端口号、数据库连接、日志级别等。它能够将配置信息存储在统一的地方,并实现动态刷新,使得系统能够在运行时动态调整配置而无需重启应用。
  2. 特点
  • 提供统一的配置管理接口,方便管理和维护配置信息。
  • 支持配置信息的动态刷新,无需重启应用即可生效。
  • 可以将配置信息存储在不同的后端存储中,如数据库、文件系统、Git等。
  1. 常见实现:Nacos、Zookeeper、Consul、Apollo等。

注册中心:

  1. 作用:注册中心用于服务的注册与发现,即服务实例向注册中心注册自己的信息,并能够从注册中心获取其他服务实例的信息,实现服务之间的通信和调用。
  2. 特点
  • 维护服务实例的信息,包括地址、端口、健康状态等。
  • 提供服务发现功能,使得服务能够自动发现和调用其他服务。
  • 支持服务的动态上下线,能够及时响应服务的变化。
  1. 常见实现:Eureka、Consul、Zookeeper、Nacos等。

区别和联系:

  1. 角色不同:配置中心负责管理应用程序的配置信息,而注册中心则负责管理服务实例的注册与发现。
  2. 功能不同:配置中心提供配置信息的存储和动态刷新功能,而注册中心提供服务的注册、发现和健康检查功能。
  3. 侧重点不同:配置中心侧重于配置管理和更新,注册中心侧重于服务发现和通信。
  4. 联系:虽然功能不同,但在微服务架构中,通常会同时使用配置中心和注册中心。例如,服务启动时需要从配置中心获取配置信息,同时注册自己到注册中心,以便其他服务能够发现和调用它。

总的来说,配置中心和注册中心在微服务架构中起着不可替代的作用,它们共同构成了一个完善的服务治理系统,有助于提高系统的可靠性、可维护性和可扩展性。

欢迎交流

本文主要介绍配置中心的产生原因,以及常见的配置中心的示例,并用 Nacos 举了一个小 Demo,关于微服务五大组件,大家可以去具体了解下,很多组件都有相对应的开源项目,在文末留下了三个关于配置中心的问题,欢迎小伙伴在评论区留言!近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)如何保证配置的安全性?

2)如何处理配置的版本管理?

3)如何实现配置的动态刷新?