[SpringCloud][12]Nacos配置中心详解,快速上手,Nacos和Eureka的区别

文章目录

Nacos 配置中心

除了注册中心和负载均衡之外,Nacos 还是一个配置中心,具备配置管理的功能

namespace 的常用场景之一是不同环境的配置区分隔离

  • 例如开发测试环境和生产环境的配置隔离

为什么需要配置中心

当前项目的配置都在代码中,会存在以下问题:

  1. 配置文件修改时,服务需要重新部署。微服务架构中,一个服务可能又成百个实例,挨个部署比较麻烦
  2. 多人开发时,配置文件可能需要经常修改,使用同一个配置文件容易冲突

配置中心就是对这些配置进行统一管理。通过配置中心,可以集中查看、修改和删除配置,无需再逐个修改配置文件。提高效率的同时,也降低了出错的风险

  1. 服务启动时,从配置中心读取配置项的内容,进行初始化
  2. 配置项修改时,通知微服务,实现配置的更新加载

快速上手

通过以下操作,我们先来感受一下 Nacos 配置中心的使用

添加配置

Nacos 控制台添加配置项

注意:

  • 配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的。默认是 public
  • 也就是:服务管理命名空间配置 != 配置管理的命名空间

新建配置项

配置内容

复制代码
nacos.test.num=5

说明:

  • Data ID 设置为项目名称
  • 配置内容的数据格式, 目前只支持 propertiesyaml 类型
  • 设置配置内容

获取配置

  1. 引入 Nacos Config 依赖

product-service 项目

xml 复制代码
<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>
  1. 配置 bootstrap.properties
    微服务启动前,需要先获取 Nacos 中配置,并与 application.yml 配置合并。在微服务运行之前,Nacos 要求必须使用 bootstrap.properties 配置文件来配置 Nacos Server 地址
properties 复制代码
spring.application.name=product-service
spring.cloud.nacos.config.namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

或者使用 bootstrap.yml

yml 复制代码
spring:  
  application:  
    name: product-service  
  
  cloud:  
    nacos:  
      config:  
        server-addr: 127.0.0.1:8848  
        namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff
  • spring.application.name 需要和 nacos 配置管理的 Data ID 一致
  • spring.cloud.nacos.config.server-addrNacos Server 的地址
  • 要加上命名空间

配置中心个注册中心的配置是隔离的

  • Nacos 配置中心:spring.cloud.nacos.config.server-addr
  • Nacos 注册中心:spring.cloud.nacos.discovery.server-addr
  1. 编写程序
java 复制代码
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;  
  
@RequestMapping("/config")  
@RestController  
@RefreshScope  
public class NacosController {  
    @Value("${nacos.test.num:0}")  
    private Integer nacosNum;  
      
    @RequestMapping("/get")  
    public Integer get() {  
        return nacosNum;  
    }  
}
  • @Value:读取配置
    • :0 是默认值,避免启动失败,如果在 nacos 配置中没找到配置,就使用 0
  • @RefreshScope:配置进行热更新。当远程配置中心的配置发生变化并被刷新,这个 Bean 会重新创建(refresh),使新的配置生效
  1. 测试

启动程序,访问接口: http://127.0.0.1:9090/config/get

  • Nacos 控制台修改:nacos.test.num
  • 再次访问接口

配置中心详解

设置命名空间

Nacos 配置管理的命名空间和服务列表的命名空间是分别设置的。默认是 public

Nacos 命名空间配置依然在 bootstrap。properties 中进行配置

复制代码
spring.cloud.nacos.config.namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff

对应 yml 配置

yml 复制代码
spring: 
  cloud: 
    nacos: 
      config: 
        namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff

value 对应命名空间的 ID,如下图所示:

如果设置命名空间后,项目启动时,会从该命名空间下找对应的配置项

Data ID

格式介绍

Nacos Spring Cloud 中,dataId 的完整格式如下:

复制代码
${prefix}-${spring.profiles.active}.${file-extension}
  • prefix:默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置
  • spring.profiles.active 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在
  • file-extension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyml默认为 yml

微服务启动时,会从 Nacos 中读取多个配置文件

  1. ${prefix}-${spring. profiles. active}.${file-extension},如: product-service-dev.properties
  2. ${prefix}.${file-extension},如:product-service.properties
  3. ${prefix},如:product-service

${spring.application.name},${spring.profiles.active}等通过配置⽂件来指定时,必须放在 bootstrap.properties⽂件中

观察日志

bootstrap.yml 中添加 spring.profiles.active

yml 复制代码
spring: 
  profiles: 
    active: dev

启动服务,观察日志

  • 三个文件的优先级为
    1. product-service-dev.properties
    2. product-service.properties
    3. product-service

测试

bootstrap.yml 配置如下

yml 复制代码
spring:  
  application:  
    name: product-service  
  
  profiles:  
    active: dev  
  
  cloud:  
    nacos:  
      config:  
        server-addr: 127.0.0.1:8848  
        namespace: 34e7d072-f35f-4478-be26-6ab8f00b89ff

配置项如下:

访问接口,服务获取到了 product-service-dev.properties 的值

删除这个配置,再次访问

注意:

  1. booststrap.yml 设置的配置格式必须和 Nacos 控制台配置的数据格式保持一致
  2. 不设置配置格式((spring.cloud.nacos.config.file-extension))时,默认为 properties

服务部署

  1. 修改数据库,Nacos 等相关配置

  2. 对两个服务进行打包

  3. 上传 jarLinux 服务器

  4. 启动 Nacos(启动前最好把 data 数据删除掉)

  5. 启动服务

    #后台启动order-service, 并设置输出⽇志到logs/order.log
    nohup java -jar order-service.jar >logs/order.log &

    #后台启动product-service, 并设置输出⽇志到logs/order.log
    nohup java -jar product-service.jar >logs/product-9090.log &

    #启动实例, 指定端⼝号为9091
    nohup java -jar product-service.jar --server.port=9091 >logs/product-9091.log &

Nacos 与 Eureka 的区别

共同点:

  • 都支持服务注册和服务拉取

区别:

  1. 功能:

    • Nacos 除了服务发现和注册之外,还提供了配置中心,流量管理和 DNS 服务等功能
  2. CAP 理论

    • Eureka 遵循 AP 原则,Nacos 可以切换 APCP 模式,默认 AP
    • Nacos 根据配置识别 CP 或者 AP 模式。如果注册 NacosClient 的节点是临时节点,那么 Nacos 对这个 Client 节点的效果就是 AP,反之是 CPAPCP 可以同时混合存在
  3. 服务发现

    • Eureka:基于拉模式。Eureka Client 会定期从 Server 拉取服务信息,有缓存,默认每 30s 拉取一次
    • Nacos:基于推送服务。服务列表有变化实时推送给订阅者,服务端和客户端保持心跳连接
相关推荐
来杯@Java11 小时前
图书管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·mybatis·课程设计
卷毛的技术笔记11 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
半旧夜夏14 小时前
【保姆级】微服务组件环境搭建(Docker Compose版)
java·linux·spring cloud·微服务·云原生·容器
云烟成雨TD15 小时前
Spring AI 1.x 系列【33】RAG Advisor 组件与四大分层架构
java·人工智能·spring
J2虾虾16 小时前
Spring AI Alibaba - Tools
服务器·人工智能·spring
J2虾虾18 小时前
Spring AI Alibaba - 人工介入(Human-in-the-Loop)
java·人工智能·spring
J2虾虾19 小时前
Spring AI Alibaba - Skills 技能
人工智能·python·spring
J2虾虾21 小时前
Spring AI Alibaba - 智能体作为工具(Agent Tool)
java·人工智能·spring
Devin~Y21 小时前
从内容社区到AIGC客服:Spring Boot、Redis、Kafka、K8s、RAG的三轮大厂Java面试对话(附标准答案)
java·spring boot·redis·spring cloud·kafka·kubernetes·micrometer