一、什么是配置中心

在微服务架构中,配置中心就是统一管理各个微服务配置文件的服务。把传统的单体jar包拆分成多个微服务后,配置文件也要拆分,每个微服务都要有自己的配置文件。为了统一维护,方便管理,所以出现了配置中心的概念。所有的微服务配置文件都在配置中心中管理和读取,因此,出现了配置中心的概念。提供配置中心的服务有Nacos,Apollo等,这里我们讲解Nacos的配置中心功能。

二、Nacos服务端配置中心功能

Nacos提供了配置中心的功能,首先,需要在Nacos服务端,配置好服务的配置文件,具体配置如下:
配置命名空间:
命名空间主要用于隔离开发环境。如开发环境,生产环境,测试环境。
在这里插入图片描述
其中,public是Nacos默认提供的命名空间,如果不单独配置命名空间,那么默认所有的配置信息都在public命名空间中。

配置列表
在命名空间中配置好后,在配置列表中就会有几个命名空间的tab。
我们以开发环境dev为例,配置某个微服务的配置文件信息。
在这里插入图片描述
新建配置界面如下:
在这里插入图片描述

Data ID:
Data ID是配置项的唯一标识,它的命名是有一定规范的。我们在配置信息时,一定是先有了微服务客户端,根据客户端需求,才在配置中心配置的信息。
Data ID的命名规范是:

spring.application.name-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

其中spring.application.name就是微服务客户端配置文件中配置的服务名称。${spring.profiles.active}是配置文件中配置的环境信息。${spring.cloud.nacos.config.file-extension}是微服务客户端配置文件中配置的file-extension信息。这个信息的作用是指定配置中心中配置信息的格式,一般选择yaml格式的。
假设微服务客户端服务名叫mall-user-consumer-demo,开发环境为dev。file-extension扩展格式为yaml,则Data ID命名为:mall-user-consumer-demo-dev.yaml。

Group
组的概念。上面讲到的命名空间是用来隔离项目环境的。Group是在同一个项目环境中更细粒度的区分配置项,博主现在还没理解有何场景使用Group进行分组,在Data ID中命名已经是通过服务名命名了,而且微服务客户端拉取数据时会根据服务名进行映射的,已经通过Data ID可以区分不同微服务客户端了,不理解Group是进行什么更细粒度的区分。

配置格式
配置格式的勾选要与file-extension扩展模式的配置相对应。一般选择yaml格式。
然后在配置栏中写配置信息即可:
在这里插入图片描述

三、微服务客户端配置信息拉取配置中心

踩坑一:
博主刚开始将所有的配置都放在了application.yml中,包括nacos的注册中心配置和配置中心配置,但是在项目启动中,一直报连接的还是localhost:8848。而nacos地址配置的并不是本地。为何还会去连接localhost地址呢?
原因是微服务客户端连接nacos配置中心,是发生在application.yml文件读取之前去拉取的,此时并不知道application.yml中配置的是什么信息,所以只能按默认配置去连接,因此就连接localhost地址去了。那么如何进行地址的修改呢?就是把nacos配置中心的内容,配置到bootstrap.yml中。bootstrap.yml配置文件是先于application.yml文件读取的,而且发生在拉取配置中心信息之前,所以配置在bootstrap.yml文件中,可以解决该问题。
关于application.yml配置文件和bootstrap.yml配置文件的区别,可以参考这篇文章:application.yml与bootstrap.yml的区别

踩坑二:
当客户端配置nacos的配置中心地址为nginx集群时,项目启动无法成功,而单独配置成某个节点时,可以正常使用,这个问题博主猜测是nacos2.x增加了两个端口,而nginx里并没有配置两个端口的转发规则,所以配置中心连接nginx时,会出现错误。

下面,讲解微服务客户端拉取配置中心信息的集成过程:

  1. 加入nacos配置中心依赖:
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. bootstrap.yml中配置nacos配置中心的相关信息:
spring:
  #配置nacos注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 39.100.116.73:80
        #namespace: 39e1e969-15f9-46d2-832d-fa052da55377
        #group: mall-user
      #        cluster-name: BJ
      config: #配置中心的相关配置
        server-addr: 39.100.116.73:8851
        file-extension: yaml  #与配置中心的扩展项相对应
        namespace: 507945ce-1b37-4d59-90aa-f2707fee0013  #命名空间id

因为在application.yml中配置了服务名称和profiles开发环境,所以,结合这两个配置文件,就可以根据Data ID命名规则找到相应的配置项,并拉取相关信息。

  1. 获取配置中心信息
    使用@RefreshScope注解,用于实时拉取更新后的配置中心的信息,无需重启项目。
    通过@Value注解,进行配置中心信息的获取,代码如下;
@RefreshScope
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
 @Value("${user.name}")
    private String username;
    @Value("${user.age}")
    private Integer age;
    @Value("${user.id}")
    private String id;
    @GetMapping("getNacosConfig")
    public String test(){
        return "id:"+id+",name:"+username+",age:"+age;
    }
}

这样,就获取到了配置中心的信息。

四、共享配置

官网地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

spring:
  #配置nacos注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 39.100.116.73:80
        #namespace: 39e1e969-15f9-46d2-832d-fa052da55377
        #group: mall-user
      #        cluster-name: BJ
      config:
        server-addr: 39.100.116.73:8851
        file-extension: yaml
        namespace: 507945ce-1b37-4d59-90aa-f2707fee0013
        shared-configs[0]: #配置共享配置
          data-id: db.yaml
          group: DEFAULT_GROUP
          refresh: true

补充

在nacos配置中心中,客户端的配置文件中只要配置了namespace的data-id,那么就会自动加载客户端application-name.file-extension命名的配置项信息进来。如果想指定自定义命名的其他配置项配置,需要如下配置:

exetension-configs[0]: 
          data-id: db.yaml  #自定义配置名
          group: DEFAULT_GROUP #分组
          refresh: true  #配置自动刷新

需要注意的是,在配置的时候需要配置自动刷新,在实体类里,也需要写@RefreshScope才能生效。

此外,nacos自动刷新Mysql数据源配置和redis数据源配置可参考下面两篇文章:
Mysql动态配置 redis动态配置

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐