当前位置: 首页 > news >正文

【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 基于推送模式,服务列表有变化实时推送给注册的客户端,服务端和注册端必须保持心跳连接。

http://www.xdnf.cn/news/874027.html

相关文章:

  • 【HarmonyOS 5】游戏开发教程
  • 面向文档编程:MoonBit 的创新开发体验
  • 照片按时间自动重命名工具
  • Java异常信息
  • PaddleOCR(1):PaddleOCR介绍
  • 雷达流速仪相关介绍
  • 微信小程序开发一个自定义组件的详细教程
  • Haystack:AI与IoT领域的全能开源框架
  • 996引擎-前端组件:富文本(RichText)
  • 研究探析 | 高速摄像机在一种新型冲击压痕技术及其动态标定方法中的应用
  • unix/linux,sudo,其发展历程详细时间线、由来、历史背景
  • Origin如何仅删除奇数行或偶数行的数据
  • shell脚本总结14:awk命令的使用方法
  • 【力扣链表篇】203.移除链表元素
  • DIC技术助力金属管材全场应变测量:高效解决方案
  • 线程的生命周期与数量设置
  • 鸿蒙Navigation路由导航-基本使用介绍
  • SwiftUI 数据绑定与视图更新(@State、@ObservedObject、@EnvironmentObject)
  • 区块链架构深度解析:从 Genesis Block 到 Layer 2
  • 机器学习的数学基础:假设检验
  • 题海拾贝:P2347 [NOIP 1996 提高组] 砝码称重
  • 备战2025年全国青少年信息素养大赛-图形化编程挑战赛—省赛—每日一练—绘制立体图形
  • http协议,get,post两种请求方式
  • ArcGIS Pro 3.4 二次开发 - 共享
  • yoloe优化:可支持点提示进行检测分割
  • React 性能监控与错误上报
  • Dockerfile基础
  • SpringCloudAlibaba微服务架构
  • AI在网络安全领域的应用现状和实践
  • 代码训练LeetCode(21)跳跃游戏2