nacos

1. 概念

namespace 命名空间,用于区分开发和生产环境,也可以区分业务系统
Group:用来分组
DataId 文件名
三者所属关系:DataId属于Group属于namespace
image

2. 安装管理端

2.1. 启动提示鉴权报错

2.2.2之前,无论服务端是否开启鉴权,都会存在一个登录页
最好升级到大于2.2.1的版本,详情见官方文档:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html

2.2. 启动报错总结

2.2.1. cmd启动后闪退

解决办法:startup.cmd/bat文件结尾加2行

pause
endlocal

2.3. docker安装

  • 2.0.2 版本亲测成功
    dockerhub官方命令:
docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2

2.4. win版安装

2.4.1. 1.下载server

官网下载:https://nacos.io/download/release-history/
github: https://github.com/alibaba/nacos/releases/download/2.0.3/nacos-server-2.0.3.zip

2.4.2. 2.解压后创建数据库

  • 1: zip解压

  • 2:本电脑创建库nacos
    image

  • 3: 执行初始化脚本(conf目录下)
    版本2.3.2,sql文件名为:mysql-schema.sql

image

成功后的表:
image

2.4.3. 3.properties文件配置连接信息(conf目录)

image
image

  • 注意检查手动建的库名是否一致

2.4.4. 修改启动脚本cmd文件(改为单机)

image

2.4.5. 将"cluster"改为"standalone"

image
如设置为集群模式,增加一个cluster.conf也可
2.2.2亲测:
image

2.4.6. 启动

双击startup.cmd
成功页面:
image

2.4.7. 登录地址

访问:http://127.0.0.1:8848/nacos/index.html

2.4.8. 默认账号

nacos登录面板:默认账号:nacos 默认密码:nacos

3. springboot配置文件

3.1. 用spring.config.import方式(官方推荐)

springboot2.4.0才支持

application.yml配置示例:

spring:
  application:
    name: tlmall-order-01
  config:
    import:
			# 表示从Nacos配置中心导入tlmall-order-01.yml文件
      - optional:nacos:${spring.application.name}.yml
			# optional的意义:可选的,如果没有不抛异常,继续往下执行
      - optional:nacos:db-common.yml

3.1.1. 订单系统如何整合到配置中心

  • 目标
    让系统读取配置中心的配置,来做为项目启动。

  • 1:Nacos页面创建dataid(即spring.config.import对应的xxx.yml)

  • 2:pom引入依赖

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

  • 3:springboot的application.yml配置Nacos Config地址
spring:
  application:
    name: tlmall-user-config-demo
  config:
    import:
      - optional:nacos:${spring.application.name}.yml
      - nacos:nacos-discovery.yml     #nacos注册中心配置
  cloud:
    nacos:
      config:
        # nacos配置中心
        server-addr: tlmall-nacos-server:8848
        username: nacos
        password: nacos

3.2. bootstrap.yml(boot2.4以后已不推荐)

springboot项目,application.yml改为bootstrap.yml
boot2.4以后,推荐用spring.config.import方式

3.2.1. spring配置属性

  • DataId名字命名规则
    nacos的DataId可以由spring.application.name和spring.cloud.nacos.config.file-extension拼接而成。
    image

  • 共享配置
    有2种方式
    shared-configs
    配置的DataId只能是DEFAULT_GROUP
    ext-config[下标]
    可灵活配置任意GROUP下

3.2.1.1. 配置优先级

三种配置方式:
*A:spring.cloud.nacos.config.shared-configs //读取公共DataId, 只能读取DEFAULT_GROUP组的
*B:spring.cloud.nacos.config.extension-configs //读取公共DataId,可读取任意组的
*C: 通过nacos规则自动映射的配置文件(spring.application.name + spring.cloud.nacos.config.file-extension)

三者方式共同使用时,优先级为:C > B > A

4. nacos集群

4.1. 2.x

注意事项
1:集群部署至少需要3个
2: 将nacos-server下的nacos目录拷贝出来
2.x版本由于nacos2.x后新增了两个grpc的端口,所以修改的时候3个端口不能连续,要不然后造成端口冲突,
所以说这里默认为8848的话,就会占用8848、9848、9849三个端口。所以这里建议三个nacos分别修改成如下

8848, 8248,8348

3: 所有集群的ip和端口都要配置在cluster.conf中

# 示例
127.0.0.1:8242
127.0.0.1:8343
127.0.0.1:8848
192.168.84.162:8848

5. 微服务实例集群

5.1. 引入依赖

  <!--nacos-discovery  注册中心依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

6. 配置中心功能

6.1. 如何集成

  • 以订单服务为例
  • 1:pom引入依赖
 <!-- nacos-config 配置中心依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  • 2:Nacos控制台创建“订单服务”dataId(订单服务application.yml中spring.config.import指定的文件名)
  • 3:订单服务application.yml中添加配置
spring:
  application:
    name: tlmall-account
  cloud:
    nacos:
#      discovery:
#        server-addr: tlmall-nacos-server:8848
      # 配置中心服务地址
      config:
        server-addr: tlmall-nacos-server:8848
        file-extension: yml   #指定配置文件扩展名为yml

  config:
    import:
      # ${spring.application.name}.yml == tlmall-account.yml == dataId文件名
      - optional:nacos:${spring.application.name}.yml
      - optional:nacos:db-common.yml    #数据库公共配置
      - nacos:nacos-discovery.yml
      - optional:nacos:seata-client.yml

6.2. profile粒度

config:
    import:
      # ${spring.application.name}.yml == tlmall-account.yml == dataId文件名
     
      - optional:nacos:${spring.application.name}.yml
       # profile分支
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.yml

6.3. 自定义Namespace

  • yml配置项
spring:
  application:
    name: tlmall-account
  cloud:
    nacos:
      # 配置中心服务地址
      config:
        namespace: 命名空间id
       

6.4. 自定义Group配置

6.5. 配置文件优先级

6.5.1. application.yml方式

  • config.import方式
    自上而下,后面的会替换前面的
config:
    import:
      # ${spring.application.name}.yml == tlmall-account.yml == dataId文件名
     
      - optional:nacos:${spring.application.name}.yml
       # profile分支的配置 > 上面的
      - optional:nacos:${spring.application.name}-${spring.profiles.active}.yml

6.6. 配置文件动态刷新

需要添加注解@RefreshScope

  • 可以把@Value 集中到一个bean管理
// 加了@RefreshScope后,nacos配置文件“server.port”刷新后,proFile的值可以获取最新的。
@RefreshScope
@Component
public class CommonValue {

    @Value("${server.port}")
    private String proFile;

    public String getProFile() {
        return proFile;
    }
}

6.6.1. 容易出现的问题

  • 现象:
    @RefreshScope修饰的bean下面同时有spring的@Scheduled和@Value
    @Value的值发生刷新,@Scheduled的定时任务会暂停,当有bean获取@Value的值后,定时任务才会重新开始执行。
  • 原因:
    @RefreshScope修饰的bean,属性变更后,缓存会被清除,定时任务缓存也被清除了,获取属性时,spring才会重新扫描该bean,重新初始化。
  @RefreshScope修饰的bean,和普通的单例bean不一样,被@Scope("refresh")注解修饰,默认代理模式为:
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; 
作用是创建一个代理对象,每次调用时用它来调用GenericScope.get方法获取bean.

  在GenericScope里面包装了一个内部类 BeanLifecycleWrapperCache 对加了@RefreshScopebean进行缓存,使其在不刷新时获取的是同一个bean.

  如果属性发生变化,会调用ContextRefresher.refresh() --> RefreshScope.refreshAll()清理缓存,并发送刷新事件通知 --> 调用GenericScope.destroy()
清理缓存。

  下次使用bean时,代理对象会调用get(String name, ObjectFactory<?> objectFactory),生成一个新的bean,存入缓存,此时属性装配的就是nacos最新的属性了。

  • 如何解决:
    实现Spring事件监听器,监听RefreshScopeRefreshedEvent事件,监听方法中执行一次该定时任务方法。
@RefreshScope
@Component
public class CommonValue implements ApplicationListener<RefreshScopeRefreshedEvent> {

    @Value("${server.port}")
    private String proFile;


    public String getProFile() {
        return proFile;
    }

    @Scheduled(cron = "*/3 * * * * ?")
    public void aa() {
        System.out.println("CommonValue.aa()...执行了");
    }

    public void onApplicationEvent(RefreshScopeRefreshedEvent event) {
        aa();
    }
}

7. 常见问题

7.1. 如何打印nacos日志

  • yml文件配置
logging:
  level:
    com.alibaba.cloud.nacos: debug
posted @   jf666new  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示