【SpringCloud】Nacos配置中心
5.8 Nacos 配置中心
5.8.1 为什么需要配置中心?
举一个很简单的例子,小时候上小学班级搞了快乐晚会,会有抽奖环节,类似于下述这样的抽奖卡片:
难道这个抽奖券每个礼品是不同的,每个都需要重新画一张吗?
其实没必要,把固定的东西提取出来就可以了,比如说,抽奖券 是标题,不会变,活动名称 快乐晚会,也不会变,学校名称 快乐小学也不会变,有效期也不大会变。
所以把上面不会变的配置提取出来,提前印刷好,只需要往里面填写不同的中奖内容就 ok了。
就类似,把公共的配置提取出来放到配置中心去,每个服务独属的配置就自己编写。
因为每个服务都有自己的 yml 配置文件,如果有 1000 个服务呢?都要去写一些重复的配置项吗?不如放到配置中心去,每次先获取共同的配置项,各个服务只需要维护自己独属的一份配置文件就够了。
配置中心就是对这些配置项进行统⼀管理。通过配置配置中,可以集中查看,修改和删除配置,无需再逐个修改配置文件。提高效率的同时,也降低了出错的风险。
这样一来的好处呢,服务启动时,从配置中心获取配置,进行初始化,配置项修改时,配置中心通知微服务,实现配置的更新加载。
5.8.2 快速使用配置中心
在 Nacos 控制面板添加配置:
此处是在 PROD 命名空间创建的配置,也就是说只有 namespace 配置 ID 为 PROD 才能使用这个配置,具体目前项目中只有 cook-service 可以获取到这个配置,因为这里的 DataID 要与服务 name 对应,当然此处是这样的,等后面讲 DataID 的格式时就明白了。当然你也可以在 public 命名空间中进行创建配置。
在要获取 Nacos 配置中心的配置的项目中引入 Nacos Config 依赖
此处只在 cook-service 项目中演示。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
在 cook-service 项目中新建并配置 bootstrap.yml 文件
微服务启动前,是先从 Nacos 配置中心获取配置,然后与项目自己的 application.yml 配置文件合并,在微服务运行之前,Nacos 要求必须使用 bootstrap.yml 配置文件来配置 Nacos Server 地址,也可以使用 bootstrap.properties。
spring:application:name: cook-service # 需要和 Nacos 配置管理的 DataID ⼀致cloud:nacos:config:server-addr: 127.0.0.1:8848 # Nacos 的地址namespace: PROD # 配置空间的 namespace 要和 注册中心的 namespace 分开配置
注意,此处的配置中心和注册中心配置项是隔离的:
Nacos配置中⼼: spring.cloud.nacos.config.server-addr
Nacos注册中⼼: spring.cloud.nacos.discovery.server-addr
编写程序使用配置中心
package com.zlcode.cook.controller;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
@RequestMapping("/config")
@RefreshScope // 配置进⾏热更新,可以感知到配置中心配置的变化。
public class NacosConfigController {@Value("${nacos.config.prod.num}") // 读取配置private Integer num;@RequestMapping("/num")public Integer num() {return num;}
}
运行 cook-service 项目,浏览器输入:http://127.0.0.1:8080/config/num
返回的就是 Nacos 配置中心的内容,现在修改 Nacos 配置中心的内容,但是不重新启动 cook-service 服务,看看到底能否热更新感受到配置中心配置的变化。
将 Nacos 配置中心修改成 999 重新发布,然后再去浏览器输入:http://127.0.0.1:8080/config/num
不出所料,看来这里的热更新实现了,也就是我们前面说的:服务启动时,从配置中心获取配置,进行初始化,配置项修改时,配置中心通知微服务,实现配置的更新加载。
5.8.3 配置中心的 Data Id
上面咱们说,配置中心的 DataId 与 服务 name 一致,其实还有其他的写法。
在 Nacos Spring Cloud 中,DataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为
spring.application.name
这也就是为什么说与服务的 name 一致了。 - spring.profiles.active 为当前环境对应的 profile,当
spring.profiles.active
为空时,中间的连接符也就不存在了。DataId 的格式变为:${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。也就是说要从配置中心读哪种数据格式的配置。目前只⽀持 properties 和 yaml类型。默认为properties。
在服务启动的时候,会从 Nacos 读取多个配置文件,分别是如下三个:
${prefix}-${spring.profiles.active}.${file-extension}
例如:cook-service-dev.properties
${prefix}.${file-extension}
例如:cook-service.properties
${prefix}
例如:cook-service
注意!
${spring.application.name}, ${spring.profiles.active} 等通过配置文件来指定时,必须配置在 bootstrap.yml 或 properties 文件中
下面咱们就到 Nacos 配置中心去添加上前面两种配置:
再去配置 bootstrap.yml 文件:
spring:application:name: cook-service # 需要和 Nacos 配置管理的 DataID ⼀致cloud:nacos:config:server-addr: 127.0.0.1:8848 # Nacos 的地址namespace: PROD # 配置空间的 namespace 要和 注册中心的 namespace 分开配置profiles:active: prod# 由于 file-extension 默认是 properties 咱们配置中心的文件类型也是 properties, 这里就不用配置了
启动 cook-service 服务,观察控制台日志打印:
发现确实读取了三个 Nacos 配置中心的配置文件。
那么到现在 Nacos 基本功能就介绍完了。主要内容有 Nacos 的服务注册和发现,Nacos 的服务下线,Nacos 的负载均衡策略,Nacos 的健康检查机制,Nacos 的环境隔离,Nacos 的配置中心。
5.9 Nacos 和 Eureka 的区别
功能上:
Nacos 除了提供服务发现和注册之外,还提供了配置中心,流量管理,负载均衡等功能。
CAP理论:
Eureka 遵循 AP 原则,Nacos 可以切换 AP 和 CP,默认是 AP。
服务发现:
Eureka 基于拉的模式,注册到 Eureka 的客户端会定期从 Eureka Server 拉取服务信息,有缓存,默认30秒拉取一次。
Nacos 基于推送模式,服务列表有变化实时推送给注册的客户端,服务端和注册端必须保持心跳连接。