【微服务 SpringCloudAlibaba】实用篇 · Nacos注册中心
微服务(5)
文章目录
- 微服务(5)
- 1. 认识和安装Nacos
- 2. 服务注册到nacos和拉取服务
- 1)引入依赖
- 2)配置nacos地址
- 3)重启
- 3. 服务分级存储模型
- 3.1 给user-service配置集群
- 3.2 同集群优先的负载均衡
- 4. 权重配置
- 5. 环境隔离
- 5.1 创建namespace
- 5.2 给微服务配置namespace
- 6. Nacos与Eureka的区别
微服务(5)
国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。
而我们现在差不多在学习SpringCloudAlibaba了,它与SpringCloud的关系就有点像SpringBoot与SpringMVC,SpringBoot引入SpringWeb框架就可以说是SpringMVC项目了,也可以说还是SpringBoot项目,只是SpringBoot接纳SpringMVC
这个也一样,SpringCloud项目换上SpringCloudAlibaba的一些组件,也可以说是SpringCloudAlibaba项目咯(框架升级的感觉),也可以说还是SpringCloud项目,只是SpringCloud接纳了SpringCloudAlibaba的一些组件
- SpringCloudAlibaba可以说是SpringCloud在开发过程中,添加了一些组件之后的一个升级态
1. 认识和安装Nacos
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
- 也可以说,我们现在就在学SpringCloudeAlibaba的一个内容了

资源地址:资源 · 游离态/云服务 - 码云 - 开源中国 (gitee.com)
将它下载到一个非中文目录后:
目录说明:
- bin:启动脚本
- conf:配置文件
端口配置:
- Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:
修改其中的内容:
启动:进入bin目录后(双击startup.cmd)或者用命令行输入命令
./startup.cmd -m standalone执行后的效果如图:
在浏览器输入地址:http://127.0.0.1:8848/nacos即可,
默认的账号和密码都是nacos,进入后:
2. 服务注册到nacos和拉取服务
Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中定义的服务注册、服务发现规范。
- 典型的接口规范一致,具体实现却可以是多样的

因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别。
主要差异在于:
- 依赖不同
- 服务地址不同
1)引入依赖
在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>

然后在user-service和order-service中的pom文件中引入nacos-discovery依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.5.RELEASE</version>
</dependency>
- 理论上在父工程的pom已经对版本进行管理了,version标签就不需要加了,但是我的那边不加导入不了依赖😫😫😫

注意:不要忘了注释掉eureka的依赖。
2)配置nacos地址
在user-service和order-service的application.yml中添加nacos地址:
spring:cloud:nacos:server-addr: localhost:8848
注意:不要忘了注释掉eureka的地址
- 注意结构:
spring.cloud.nacos.server-addr!
3)重启
代码不用动
重启微服务后
访问正常:

登录nacos管理页面,可以看到微服务信息:

查看详情:

3. 服务分级存储模型
一个服务可以有多个实例,例如我们的user-service,可以有:
- 127.0.0.1:8081
- 127.0.0.1:8082
- 127.0.0.1:8083
- ……
假如这些实例分布于全国各地的不同机房,例如:
- 127.0.0.1:8081,在上海机房
- 127.0.0.1:8082,在上海机房
- 127.0.0.1:8083,在广东机房
- ……
Nacos就将同一机房内的实例 划分为一个集群。
- 可以有多个集群(在多个地区)
也就是说
user-service是服务
- 一个服务可以包含多个集群,如杭州、上海,而每个集群下
- 可以有多个实例,形成分级模型,如图:
同一个机房,也就是说一个集群,里面的实例可能不同,可能是来自别的微服务的服务,而以上分级,单看一个服务也没问题
-
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快
-
当本集群内不可用时,才访问其它集群
-
所以我们不应该将本地集群和外地集群**“一视同仁”**
例如:

一个机房内的order-service应该优先访问同机房的user-service。

目前我们没有设置集群,为DEFAULT
3.1 给user-service配置集群
为了模拟得更加真实,我再多加一个user-service实例:

修改user-service的application.yml文件,添加集群配置:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: GD # 集群名称
先把服务都停掉,重启两个user-service实例后

再改下配置,这个时候启动第三个实例,用的就是这个yml配置:

查看网站:

三个分别是
- GD
- SH
- DEFAULT
- 只不过没有一个实例
查看详情:

3.2 同集群优先的负载均衡
默认的ZoneAvoidanceRule并不能实现根据同集群优先来实现负载均衡。
因此Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例,实在不行才到外地
- NacosRule又是经典的集大成者,就是杂合多种规则,取众之所长
1)给order-service(消费者)配置集群信息
修改order-service的application.yml文件,添加集群配置:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: SH # 集群名称

2)修改负载均衡规则
修改order-service的application.yml文件,修改负载均衡规则:
userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

我就不对比实验了,如果不设置这个规则,则就是默认的轮询规则、或者配置中的规则…
但是我这样设置之后,我们期待的效果是本地:也就是GD访问的次数要多一点才对,看一下效果吧~
启动order-service,浏览器访问10次101:
日志都在本地(SH)服务那,说明已经成功啦
我们换order-service到GD,在发送101-108,你会发现它在本地的两个服务的调度是随机的:
要是本地的都挂了的话:
- 我将orderservice改为SH,停掉SH的服务,启动两个GD的服务
在跨集群服务随机调度咯:
在orderservice里:
- 警告日志,提醒我们重启同集群服务
4. 权重配置
实际部署中会出现这样的场景:
- 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
- 但默认情况下NacosRule是同集群内随机挑选,不会考虑机器的性能问题
因此,NacosRule提供了权重配置来控制访问频率,权重越大则访问频率越高。
- 即**通过权重影响随机选中的概率**
在nacos控制台,找到user-service的实例列表,点击编辑,即可修改权重:

在弹出的编辑窗口,修改权重:
- 设置的值大于等于0就行了,之后这个集群各个服务被选中的概率的比值就等于权重的比值~

点击确认后,浏览器访问十次接口试一下:
频次差得将近十倍
注意:如果权重修改为0,则该实例永远不会被访问
这有个妙用就是,一个服务要进行升级,可以将权重设置为0,那么就负载均衡就不会轮它,就不会担心停掉后,那nacos还意识不到这个服务挂了(因为用户时时刻刻都在访问呀,难道每次更新都要等个夜黑风高的夜晚吗🤣)…
5. 环境隔离
Nacos提供了namespace来实现环境隔离功能。
- nacos中可以有多个namespace
- namespace下可以有group、service等
- group不过就是把业务相关度高的放在一个组,可能会有点益处,差不多就那个意思,了解即可
- 不同namespace之间相互隔离,例如不同namespace的服务互相不可见
没有namespace的概念之前,我们的服务可以访问到其他的所有服务,因为都可以见
但是在一些业务里,我们是不希望服务A访问服务B的,虽然可以通过行为规范去限制,但是还是得“强硬点”,也就是来了个命名空间,让服务A不可见服务B,服务B不可见服务A
当然在开发设计上是可以不用namespace的,非必须~

5.1 创建namespace
默认情况下,所有service、data、group都在同一个namespace,名为public:

我们可以点击页面新增按钮,添加一个namespace:

确认后:

回到服务列表:


- 空空如也~
设置namespace是很严肃的,涉及业务不可见性的,所以这里修改不了,要在代码那修改~
5.2 给微服务配置namespace
给微服务配置namespace只能通过修改配置来实现。
例如,修改order-service的application.yml文件:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 3dcc6119-bdd8-46f1-a183-9904cc1ac98b # 命名空间,填ID

- 记得填自己的命名空间id
重启order-service后,访问控制台,可以看到下面的结果:

此时访问order-service,因为namespace不同,会导致找不到userservice,控制台会报错:
- 因为他们已经是两个世界的人了🤣🤣🤣

不过一个微服务的实例可以不在一个命名空间里,
例如这里我把其中一个userservice的实例放在orderservice的命名空间里,这样orderservice还是可以执行相应的业务
- 但是我个人觉得这种行为很傻,很没有必要,要这么做干啥子要有命名空间
6. Nacos与Eureka的区别
两者的主要区别在于Nacos的服务实例分为两种类型:
-
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
-
非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

- 默认情况下,都是临时实例
配置一个服务实例为永久实例:
spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例


Nacos和Eureka整体结构类似:
- 服务注册
- 服务拉取
- 心跳等待
但是也存在一些差异:

-
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
-
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式(心跳检测频率要比eureka快);非临时实例采用主动检测模式
- (ಥ _ ಥ),对非临时实例主动嘘寒问暖
- 临时实例心跳不正常会被剔除;非临时实例则不会被剔除,被标记为不健康

例如我把非临时的orderservice实例停掉,nacos看他跟亲儿子一样,没有直接剔除~

- 我将userservice的其中一个实例停了~
可见,这个临时实例这个捡来的儿子🤣,直接被剔除了
- Nacos支持服务列表变更的消息推送模式,服务列表缓存的更新更及时
- 因为如果消费者每个三十秒拉取一次的话,期间缓存不变更的话,有个实例挂了,消费者就很可能访问到这个挂了的接口~
- 及时更新是很有必要的,即使没法避免某些极端事件(例如心跳检测不及时等等巧合的事…)的发生,也能解决绝大多数情况~
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式(看看就行了,暂时不讲,这是后面的事)
- Nacos还提供一个的负载均衡规则NacosRule,是一种优良的负载均衡策略
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式(心跳检测频率要比eureka快);非临时实例采用主动检测模式
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!代码:cloud-demo · 游离态/云服务 - 码云 - 开源中国 (gitee.com)
相关文章:
【微服务 SpringCloudAlibaba】实用篇 · Nacos注册中心
微服务(5) 文章目录 微服务(5)1. 认识和安装Nacos2. 服务注册到nacos和拉取服务1)引入依赖2)配置nacos地址3)重启 3. 服务分级存储模型3.1 给user-service配置集群3.2 同集群优先的负载均衡 4. …...
华为手机安卓扫描安装包apk在哪
1、在文件管理器里找,有的安装包没有搜索到2、在应用市场-我的-安装包管理,它会扫描整个手机,推荐...
IDEA 新版本设置菜单展开
使用了新版本的IDEA 新UI后,常用的file,view,菜单看不见了,不太适应,找了一下,有个配置可以修改。 打开settings里面把show main menu in a separate toolbar勾选上,应用保存就可以了...
Leetcode 350:两个数组的交集II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。 示例 1…...
【数据结构】队列的实现与优化指南
一、前言 队列是一种重要的数据结构,它按照“先入先出”(FIFO)的原则管理数据。本文将介绍队列的概念、应用场景,以及如何使用数组实现普通队列和环形队列。 二、内容 2.1 概述 (1)什么是队列࿱…...
视频太大怎么压缩变小?三分钟学会视频压缩
随着科技的不断发展,视频已经成为了我们日常生活中不可或缺的一部分,然而,大尺寸的视频文件常常会给我们带来诸多困扰,例如发送不便、存储空间不足等等,那么,如何将这些过大的视频文件压缩变小呢࿱…...
Rust 泛型
泛型 Generics泛型详解 使用泛型参数,有一个先决条件,必需在使用前对其进行声明: fn largest<T>(list: &[T]) -> T {该泛型函数的作用是从列表中找出最大的值,其中列表中的元素类型为 T。首先 largest<T> 对…...
STM32+2.9inch微雪墨水屏(电子纸)实现显示
本篇文章从硬件原理以及嵌入式编程等角度完整的介绍了墨水屏驱动过程,本例涉及的墨水屏为2.9inch e-Paper V2,它采用的是“微胶囊电泳显示”技术进行图像显示,其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移,从而改变显示屏各…...
Hadoop3教程(二十九):(生产调优篇)集群扩容及缩容(白名单与黑名单)
文章目录 (150)添加白名单(151)服役新服务器(152)服务器间数据均衡(153)黑名单退役服务器参考文献 这一章还算是比较重要的。 (150)添加白名单 白名单&#…...
NET7下用WebSocket做简易聊天室
NET7下用WebSocket做简易聊天室 步骤: 建立NET7的MVC视图模型控制器项目创建websocket之间通信的JSON字符串对应的实体类一个房间用同一个Websocketwebsocket集合类,N个房间创建websocket中间件代码Program.cs中的核心代码,使用Websocket聊…...
详解API基础知识
目录 什么是API: API 的设计原则包括: API 的开发流程包括以下几个步骤: API 的使用场景包括: API 的优势包括: 然而,API 也存在一些挑战和问题,例如: 什么是API: API(应用程…...
b树和b+树
二叉树和平衡二叉树 二叉树,每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。 二叉查找树,在二叉树的基础上增加了一个规则,左子树的所有节点的值都小于它的根 节点,右子树的所有子节点都大于它…...
Linux 下 Java 安装字体方法
因上线访问图字体乱码了,因为在windows下设置的微软雅黑,linux默认是没有的,所以需要给jdk安装一个微软雅黑字体。按照步骤来,so easy! 1)首先找到windows下面的字体,不用去其他地方下了&#…...
敏捷开发的实施要素和实现敏捷的实际改进
敏捷开发的实施要素如下: 个体和交互:胜过过程和工具。可以工作的软件:胜过面面俱到的文档。客户合作:胜过合同谈判。响应变化:胜过遵循计划。 敏捷开发过程是一个增量的、迭代的过程,责任人、开发人…...
学会使用Pandas进行数据清洗
大家好,如果你对数据科学感兴趣,那么数据清洗可能对你来说是一个熟悉的术语,本文将向你介绍使用Pandas进行数据清洗的过程。我们的数据通常来自多个资源,而且并不干净,它可能包含缺失值、重复值、错误或不需要的格式等…...
Stable Diffusion WebUI扩展a1111-sd-webui-tagcomplete之Booru风格Tag自动补全功能详细介绍
安装地址 直接附上地址先: Ranting8323 / A1111 Sd Webui Tagcomplete GitCodeGitCode——开源代码托管平台,独立第三方开源社区,Git/Github/Gitlabhttps://gitcode.net/ranting8323/a1111-sd-webui-tagcomplete.git上面是GitCode的地址,下面是GitHub的地址,根据自身情…...
Linux中iostat命令
iostat命令是IO性能分析的常用工具,其是input/output statistics的缩写。 一、安装 yum install sysstat -y二、参数说明 -c: 显示CPU使用情况-d: 显示磁盘使用情况--dec{ 0 | 1 | 2 }: 指定要使用的小数位数,默认为 2-g GROUP_NAME { DEVICE [...] | A…...
Pandas数据处理分析系列3-数据如何预览
Pandas-数据预览 Pandas 导入数据后,我们通常需要对数据进行预览,以便更好的进行数据分析。常见数据预览的方法如下: ①head() 方法 功能:读取数据的前几行,默认显示前5行 语法结构:df.head(行数) df1=pd.read_excel("销售表.xlsx",sheet_name="手机销…...
【汇编语言-王爽】第二章:寄存器
知识点 (一)寄存器 一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。其中AX、BX、CX、DX为通用寄存器,可…...
5G学习笔记之5G频谱
参考:《5G NR通信标准》1. 5G频谱 1G和2G移动业务的频段主要在800MHz~900MHz,存在少数在更高或者更低频段;3G和4G的频段主要在450MHz ~ 6GHz;5G主要是410MHz ~ 6GHz,以及24GHz ~ 52GHz。 5G频谱跨度较大,可…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
















