【Spring Cloud Alibaba】:Nacos 使用全详解

【Spring Cloud Alibaba】:Nacos 使用全详解

目录

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解分布式系统的 Gossip协议 请看 : Gossip协议:分布式系统中的“八卦”传播艺术

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
前言:
上文我们了解到 Nacos 的作用,以及在本地启动 Nacos 的服务器,接下来,在本篇文件会详细的讲解 Nacos 的使用和配置。🎈

一、服务注册发现

整合 Spring Cloud AlibabaNacos 简单的很,直接启动 Alibaba提供的 Nacos 服务即可,这样就能让程序员把更多的经历放在核心业务上。

看本文之前先看:【Spring Cloud Alibaba】:Nacos 入门讲解

以下是一个简单的架构图:

在这里插入图片描述

接下来我要按照这个简单的架构图来讲解!

参考上面的架构图,需要创建两个模块,分别是nacos-provider(服务提供者)、nacos-consumer(服务消费者)

  • nacos-provider:注册进入nacos-server,对外暴露服务
  • nacos-consumer:注册进入nacos-server,调用nacos-provider的服务

1、nacos-provider服务提供者创建

1. 添加 Maven 依赖
在pom文件中需要添加 spring-cloud-starter-alibaba-nacos-discovery 这个依赖,代码如下:

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

这里没有指定版本是因为父模版指定了 spring-cloud-alibaba-dependencies 的版本,所以子模块直接引入依赖即可,因为这样能够更好地达到版本管理的效果。
具体还请看:【Spring Cloud Alibaba】:Nacos 入门讲解

2.配置YML文件

server:port:9901spring:application:# 指定服务名称,在nacos中的名字name: nacos-provider cloud:nacos:discovery:# nacos的服务地址,nacos-server中IP地址:端口号server-addr: 127.0.0.1:8848

3.开启服务注册和发现功能
大部分 SpringBoot 引入了某些功能模块之后都要手动的在启动类添加@EnableXxxx 来开启某个功能,否则无法引入自动配置。这里开启服务注册发现功能的注解是:@EnableDiscoveryClient

@EnableDiscoveryClient//开启服务注册发现功能@SpringBootApplicationpublicclassProviderApplication{publicstaticvoidmain(String[] args){SpringApplication.run(ProvideApplication.class, args);}}

4.编写接口
由于 nacos-provider 作为服务的提供者,肯定是需要提供服务的,这里编写一个接口来供消费者服务。

@RestController@RequestMapping("/nacos")publicclass testController {@GetMapping("/test")publicStringtest(){return"调用了服务者提供服务接口";}}

5.启动项目
启动项目就是在项目的启动类中启动,点这绿色的小三角符号。

在这里插入图片描述

启动完成之后,可以在 Nacos 中查看是否以及进行了服务的注册,可以看到 nacos-provider 已经成功注册到了 Nacos 中。

在这里插入图片描述

2、nacos-consumer服务消费者创建

nacos-consumernacos-provider 步骤差不多
1.添加 Maven 依赖
nacos-consumer 服务的pom文件添加 spring-cloud-starter-alibaba-nacos-discovery

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

2.配置YML文件

server:port:9902spring:application:name: nacos-consumer cloud:nacos:discovery:server-addr: 127.0.0.1:8848service-url:nacos-provider: http://nacos-provider #微服务的访问名称

3.开启服务注册和发现功能
使用 @EnableDiscoveryClient 注解来开启服务注册和发现功能

@SpringBootApplication@EnableDiscoveryClient//开启功能的注解publicclassConsumerApplication{publicstaticvoidmain(String[] args){SpringApplication.run(ConsumerApplication.class, args);}}

4.调用 nacos-provider 的接口
首先创建一个 RestTemplate ,将其注册到 IOC 容器中,然后添加@LoadBalanced注解来开启负载均衡。
开启负载均衡前需要添加依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
publicclassAutoBeanConfig{@Bean@LoadBalanced//开启负载均衡publicRestTemplaterestTemplate(){returnnewRestTemplate();}}

编写调用接口:

@RestControllerpublicclassConsumerController{@ResourceprivateRestTemplate restTemplate;//获取配置文件中的微服务访问地址@Value("${service-url.nacos-provider}")privateString servicePrivadeUrl;@GetMapping("/test")publicResponseEntity<String>test(){return restTemplate.getForEntity(servicePrivadeUrl +"/nacos/test",String.class);}}

注意: 因为已经将 nacos-provider 注入到了 Nacos 中了,所以是可以直接通过服务名直接找到对应的服务的,而 servicePrivadeUrl 注入的就是服务名。

5.启动项目
启动之后就能看到 Nacos 中已经有两个服务了

在这里插入图片描述

然后进行接口的调用看看能不能调用成功,在浏览器中访问:http://localhost:9902/test,可以看到调用成功了。

在这里插入图片描述


总结:可以看到,Nacos 的服务注册和发现是如此的简单。还不需要自己搭建注册中心,直接提供好了。

二、配置管理

为什么需要配置管理呢?🤔试想一下、如果你的一个线上项目想要修改某个配置,比如数据源变了,要添加新的数据源,这个时候修改完了应该怎么办?把项目停掉重启?你觉得这样做合理吗,显然是不合理的吧。

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

在这里插入图片描述

1、添加配置文件

首先,在 Nacos 添加配置文件,如下图步骤:

在这里插入图片描述


填写完配置信息之后,进行发布

在这里插入图片描述

Data ID是什么?dataId是一个配置的唯一标识,怎么取值呢?格式如下
${prefix}-${spring.profiles.active}.${file-extension}

  • prefix:前缀,默认是spring.application.name的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active: 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

2、拉取配置

创建一个模块,名叫 config-demo 父类为 ,来获取 Nacos 的配置内容

首先添加依赖:

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

创建一个 bootstrap.yml 文件,该文件是用来设置 Nacos 的配置,该文件会在 application.yml 之前被读取

在这里插入图片描述


配置如下

spring:application:name: nacos-config # 服务名称profiles:active: dev #开发环境,这里是dev cloud:nacos:server-addr: localhost:8848# Nacos地址config:file-extension: yaml # 文件后缀名

根据配置文件的内容,他会去 Nacos 中读取作为 nacos-config-dev.yaml 的Data ID里面的内容,也就是我们上面在 Nacos 中添加的。

在这里插入图片描述

application.yml 文件设置改模块的端口为9903

server:port:9903

3、读取配置

创建一个 controller 来测试一下

@RestController publicclassNacosController{ @Value("${datas.version}")//读取Nacos的配置信息privateString version; @GetMapping("/test")publicStringtest(){return"这是在Nacos中添加的配置信息: version = "+ version;}}

启动项目,访问 http://localhost:9903/test ,结果如下:

在这里插入图片描述

恭喜你,读取 Nacos 的配置信息成功!🎉

但是目前还不能动态刷新(热更新), 也就是修改了 Nacos 中的配置信息,无需启动项目就能实时的读取新的配置信息。不相信?🤔那你请看!

在这里插入图片描述

不启动,重新访问 http://localhost:9903/test

在这里插入图片描述

那怎么才能实现热更新呢?别急,往下看!

4、配置热更新

方式一:添加 @RefreshScope 注解

@Value 注入的变量所在类上添加注解 @RefreshScope

在这里插入图片描述

重新启动项目,访问http://localhost:9903/test

在这里插入图片描述


修改 Nacos 中的配置信息:

在这里插入图片描述


再次访问http://localhost:9903/test

在这里插入图片描述
方式二:使用@ConfigurationProperties注解代替@Value注解。

添加一个类,来读取 Nacos 的配置信息

@Component @Data @ConfigurationProperties(prefix ="datas")publicclassDatasProperties{privateString version;}

然后再 controller 中使用这个类来代替@Value

在这里插入图片描述


重启应用,访问http://localhost:9903/test

在这里插入图片描述

修改 Nacos 的配置内容:

在这里插入图片描述

访问http://localhost:9903/test

在这里插入图片描述

5、多环境共享

其实微服务启动时,会去 nacos 读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
  • [spring.application.name].yaml,例如:userservice.yaml
    [spring.application.name].yaml不包含环境,因此可以被多个环境共享。
1)添加环境共享配置

我们首先在 nacos 中添加一个 nacos-config.yaml

在这里插入图片描述
在这里插入图片描述
2)读取环境共享配置

在 nacos-config 服务中修改 DatasProperties 类,读取新添加的属性内容:

在这里插入图片描述

修改 controller 类的内容

在这里插入图片描述
3)运行两个ConfigApplication

复制一个 nacos-config 服务,修改端口号为,修改Active profiles,然后运行两个程序。

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分别访问 http://localhost:9903/testhttp://localhost:9904/test

在这里插入图片描述
在这里插入图片描述

可以看出来,不管是 dev ,还是 test 环境,都读取到了 content 这个属性的值。

4)配置共享的优先级
在这里插入图片描述

三、多环境配置隔离

一般在业务开发的时候,至少会有三个环境,也就是开发(dev),测试(test),生产环境(prod)

每个环境肯定配置是大部分是不一样的,所以说,怎么才能很好的在不同的环境使用不一样的配置呢?🤔是的,Nacos 就能够很好的区分以上三种不同的配置。

Nacos 是如何区分的呢?答案就是 Namespace

Namespace(命名空间):解决多环境及多租户数据的隔离问题 在多套不同的环境下,可以根据指定的环境创建不同的Namespace,实现多环境的数据隔离

查看配置信息所处在那个命名空间:

在这里插入图片描述

1、命名空间的创建

创建一个命名空间:

在这里插入图片描述

作者这里创建了3个不同的命名空间

在这里插入图片描述

创建完成之后,那应该怎么使用呢?怎么指定那个命名空间呢?答案就是: 命名空间ID

2、添加配置信息

首先在 dev 这个命名空间下添加配置信息

在这里插入图片描述

3、读取不同环境下的配置信息

修改配置文件 bootstrap.yml

在这里插入图片描述

配置完毕,启动项目,访问 http://localhost:9903/test

在这里插入图片描述

四、业务配置隔离

在实际项目中,是有很多的微服务的,不同服务之间的配置是不一样的,那这个时候如果都创建在一起,那会显得非常的臃肿,难以区分,Nacos 针对这个问题是如何做的呢?🤔
答案就是 Group,该单词大家都认识吧,也就是分组的意思。😁

Group:Nacos 中的一组配置集,是组织配置的维度之一,简单的说则是不同的系统或微服务的配置文件可以放在一个组里。Nacos如果不指定Group,则默认的分组是DEFAULT_GROUP。

对于有多个微服务而言,比如订单系统,用户系统,针对这两个不同的微服务,可以将他们单独的分为一个组,订单系统分在ORDER_GROUP、用户系统分在USER_GROUP

1、创建配置信息指定Group分组

在命名空间 dev 环境下创建一个配置信息,指定分组

在这里插入图片描述
在这里插入图片描述

2、读取Group的配置信息

修改配置文件 bootstrap.yml 的内容

在这里插入图片描述

配置完成,启动项目,访问 http://localhost:9903/test

在这里插入图片描述

五、Nacos实现共享配置

共享配置,主要体现在随着项目中的微服务数量越来越多😣,而这些微服务多多少少都会有一些共同的配置,比如数据源信息啊。而这个时候我们就可以将这些共同的配置抽取出来,作为项目中共有的配置。

Nacos 就能很好的实现共享配置,接下来让我来带你一步一步地操作。😁

1、添加一个环境共享配置

在这里插入图片描述


在这里插入图片描述
注意: 因为我们是在public命名空间下创建的共享配置,所以在微服务的配置文件中不指定namespace的值默认就是读取在public命名空间下的配置信息

2、读取共享配置

修改 nacos-config 的配置文件 bootstrap.yaml 的内容

在这里插入图片描述

这里就通过 @Value 注解来获取 Nacos 的配置内容

在这里插入图片描述


启动项目,访问 http://localhost:9903/test1

在这里插入图片描述
注意:如果共享配置信息放在了其他命名空间或者指定了分组,需要填写相应的namespace和Group
在这里插入图片描述

六、Nacos的持久化

Nacos默认使用的是内嵌的数据库 Derby ,如果想要更换数据库,比如 mysql ,也是非常简单的。

首先在 MySQL 中创建一个数据库,名为 nacos_config(名字随意哈),然后执行 Nacos 提供的 SQL 脚本,在 Nacos 下载目录的 conf 文件夹下


在这里插入图片描述

SQL 脚本执行完成之后,生产的表如下:


在这里插入图片描述

然后修改配置文件的数据源


在这里插入图片描述

在配置文件中取消 MySQL 数据源的注释,配置成自己的数据源即可


在这里插入图片描述

修改完毕,重启 Nacos-server

七、Nacos集群的搭建

Nacos推荐集群模式部署,这样可以避免单点故障,官方给出的 Nacos 的集群图:


在这里插入图片描述


其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。

企业中大致会是这样的架构:


在这里插入图片描述

那如何搭建集群呢?
首先进入到 conf 文件下,找到 cluster.conf.example 文件复制一份并修改名称为 cluster.conf 放到当前目录下


在这里插入图片描述

修改内容如下:

192.168.124.1:8847 192.168.124.1:8848 192.168.124.1:8849 

192.168.124.1就是你的服务器IP,后面的是Nacos的端口号

修改完成之后,将nacos文件复制两份


在这里插入图片描述

然后分别修改两个个文件夹中的application.properties
nacos1:

server.port=8847

nacos2:

server.port=8849

然后分别启动三个 nacos 节点,我这里先启动两个,来查看效果,双击 startup.cmd 文件
访问 http://localhost:8848/nacos ,点击集群管理,可以看到

在这里插入图片描述

但是一般会使用 nginx 来进行反向代理,这里就不演示 nginx 的搭建了。

nginx 配置文件的内容大致为:

upstream nacos{ server 192.168.124.1:8847 server 192.168.124.1:8848 server 192.168.124.1:8849} server{ listen 80; location /{proxy_pass http://nacos;}}

你以为这样就完了? 不,还没有完!
你既然搭建了集群,那肯定是要修改项目的 bootstrap.yaml


在这里插入图片描述

或者:


在这里插入图片描述
到目前为止,你已经掌握了Nacos的大部分知识了,该文章也告一段落了

拓展

Nacos 默认是 AP,但可以通过配置切换到 CP 模式。 选择哪种模式取决于你的业务需求。 如果对可用性要求更高,选择 AP;如果对数据一致性要求更高,选择 CP。

深入了解CAP知识请看:CAP定理和BASE理论 趣学!

Read more

Bug 算法路径规划实战:从数学建模到 Python 实现

1. 从“撞墙”到“绕行”:Bug算法的直觉理解 想象一下,你被蒙上眼睛,站在一个空旷的房间里,有人告诉你:“向前走十步,就能拿到桌子上的苹果。”你开始径直向前走。走了五步,你的膝盖“砰”地一声撞到了什么东西——是一把椅子。这时候你会怎么做?你肯定不会继续硬着头皮往前撞,而是会伸出手,摸着这把椅子的边缘,小心翼翼地绕着它走,直到你感觉前方没有阻碍了,再重新判断苹果的方向,继续前进。 这个“撞到就绕”的朴素策略,就是Bug算法最核心的思想。在机器人路径规划领域,Bug算法就是这样一种简单、直接、不需要“上帝视角”地图的局部规划方法。它不关心整个房间的布局,只关心“我”现在在哪里,“目标”在哪里,以及“我”眼前有没有障碍物。这种特性让它特别适合用在未知环境探索、实时避障以及计算资源有限的场景里,比如你家里的扫地机器人,或者在一个陌生仓库里穿梭的物流小车。 我刚开始接触路径规划时,

【3月考】二级Python最新真题及满分代码合集(基本操作题部分)

【3月考】二级Python最新真题及满分代码合集(基本操作题部分)

本套试题内容适配2025年9月考试 配套讲解视频欢迎关注B站:大头博士先生 考前押题关注微博:大头博士先生 祝大家优秀拿下!!! 第1套题 【题目素材】 # 请在______处使用一行代码或表达式替换## 注意:请不要修改其他已给出代码import ______ txt =input("请输入一段中文文本:") ______ print("{:.1f}".format(len(txt)/len(ls))) 【参考代码】 # 请在______处使用一行代码或表达式替换## 注意:请不要修改其他已给出代码import jieba txt =input("请输入一段中文文本:") ls=jieba.lcut(txt)print("{:.1f}".format(len(txt)/len(ls)

Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python作为一门简单易学、功能强大的编程语言,近年来在数据分析、人工智能、Web开发等领域广受欢迎。而PyCharm作为一款专业的Python集成开发环境(IDE),提供了强大的代码编辑、调试和项目管理功能,是Python开发者的得力助手。本文将详细介绍如何从零开始安装Python和PyCharm,帮助新手小白快速搭建Python开发环境。 一、安装前准备 在安装Python和PyCharm之前,我们需要做一些准备工作,以确保安装过程顺利进行。 1.检查系统要求 (1)操作系统:Windows 7及以上版本。 如何查看自己的操作系统版本: 按下键盘上的“Windows键 + R”组合键,打开“运行”对话框。 输入winver命令,然后按下“回车”键。弹出的“关于Windows”窗口将显示当前操作系统的详细版本信息,包括版本号、内部版本号和系统构建信息。 此外,也可以鼠标左键单击”此电脑“,然后鼠标单击右键,在打开的对话框中点击”属性“,即可查看此电脑的操作系统版本。 本文将以Windows10专业版为例。 (2)内存:

C/C++(IDEA外部工具)开发环境(直译不含CMake)极速配置手册(手把手教会大量详细截图):宏变量(参数详解)避坑指南 +Clion(jvm参数表)

C/C++(IDEA外部工具)开发环境(直译不含CMake)极速配置手册(手把手教会大量详细截图):宏变量(参数详解)避坑指南 +Clion(jvm参数表)

🚫 付费插件党建议划走 🎯 白嫖党、多语言战士、IDE统一教信徒请继续 💡 想体验"一个IDE学多种语言"的快感吗?这篇指南就是你的答案! 🙏 大家好! 最近一直在爆肝更新"四语言同步学"教程,C/C++系列一直未来得及更(求轻喷😅)。今天特地为大家带来一篇纯白嫖向的实用指南—— * 今天特地为大家带来一篇实用指南——JetBrains IDE外部工具配置C/C++开发环境。 * 这可能是最不起眼但绝对免费高效的方法,特别适合多语言学习环境下不想频繁切换IDE的开发者! * 🙏 你们要的C/C++外部工具配置来了! * 上次的Rust外部工具配置火了之后,很多兄弟催更C/C++版本 * → Rust外部工具配置完整教程 今天就把我压箱底的C/C++极简开发环境配置大公开! ✅为什么选择白嫖外部工具配置? * 随着Clion开始收费,包括传统JetBrains IDE插件中C/C++插件也面临诸多兼容性问题,本蜀黎就踩了很多的坑,很多开发者被迫转向VSCode。 * 但今天,我要告诉大家:还有第三条路!