前言
总结整合自视频课程 https://www.bilibili.com/video/BV1LQ4y127n4
只是自己整理了一下笔记,分享了出来。
抹除了一些。
入门学习建议观看视频,这边只是整理了一些资料。
本篇文章篇幅有点长,如果没有阅读过本专栏的前几篇文章,很难理解,建议按照顺序阅读
文章后面有总结,建议该文章阅读两次效果最佳
- 第一次简单阅读一下,然后仔细看一下总结
- 第二次认真阅读一下
如果还是有许多小问号,可能是没看之前几篇文章,建议按照顺序阅读,如有疑问,评论区留言交流
什么是Nacos
Nacos 是阿里巴巴的产品,现在是Spring Cloud 中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos Server 安装启动
0.版本选择
您可以在Nacos的release notes及博客中找到每个版本支持的功能的介绍
https://github.com/alibaba/nacos/releases
1.预备环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
64 bit JDK 1.8+;下载 & 配置。
Maven 3.2.x+;下载 & 配置。
2.下载源码或者安装包
你可以通过源码和发行包两种方式来获取 Nacos。
从 Github 上下载源码方式
git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin
下载编译后压缩包方式
您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。
unzip nacos-server-$version.zip
或者
tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.启动服务器
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
4.服务注册&发现和配置管理
服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
5.关闭服务器
Linux/Unix/Mac
sh shutdown.sh
Windows
shutdown.cmd
或者双击shutdown.cmd运行文件。
服务注册到Nacos
在父工程中添加管理依赖
引入之后,所有子模块的版本都无需去管理
微服务项目里添加客户端依赖
添加配置文件
Nacos的服务分级
nacos中有集群的概念,可以将一些服务器配置成集群
防止跨越集群访问
在服务调用时候,尽可能访问本地集群
在本地集群不可用的情况下再去访问其他集群
如下图,杭州order-service 访问user-service最快路径就是访问本地集群的user-service
当然访问上海的user-service也可以,只不过延迟就大了
配置集群
在配置文件里添加集群名称
配置完成后打开nacos里面则可以看到集群
NacosRule 负载均衡配置
上面虽然已经配置上集群了,通过访问,还是使用默认的请求方式(轮询)
所以要想集群生效,所以还是用Nacos提供的负载均衡规则(若不理解负载均衡规则,请阅读前一篇文章 Ribbon)
配置完成之后,访问会优先访问当前集群里的微服务
在同一个集群
在假定 orderservice在 HZ 集群
那么,会优选选择HZ的userservice集群
如果HZ的userservice有多个微服务实例,那么则会随机选择,没有规律
当前集群没有指定微服务实例
现在HZ集群的userservice全部停掉了
只有SH集群里有userservice
此时访问请求后HZ集群的 orderservice会向SH集群的userservice发送请求
同时控制台会报出一个警告,但程序不会出错
当前警告的意思为:
一次跨集群访问发生了
发起者 userservice
想访问HZ的集群,但实际上访问的是SH集群
运维人员看到这样的警告,就知道HZ集群的userservice出现了问题,应当及时的去解决这个问题
根据权重控制访问频率
在现实中,经常会出现这样的一个场景,有一些机器性能较好,但是也有一些较差。默我们希望让性能较好的机器承担更多的请求,性能差的少承担一些。
所谓能者多劳
Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高
设置权重的步骤
所有微服务的默认权重都是1,所以我们要设置一下权重,权重范围在 0~1之间
这里假设HZ集群里
- 8081实例 性能较差
- 8082实例 性能较好
点击实例右侧的编辑按钮即可打开编辑界面
修改完成之后点击确认保存
如果将权重改成0会怎么样?
如果权重改成0,则不会去调用,适用于对服务的升级(降权升级)。升级完成后将权重改成一个较小的,例如0.1,让一些用户来测试一下是否存在问题。
环境隔离
namespace主要是进行业务隔离的,多个业务或者部门可以用一个Nacos,但是数据都相互屏蔽。
也就是说,假如你有多个项目,都可以使用 同一个nacos服务器 ,但是不能让他们有数据交互,因为他们本来不是一套系统。
namespace中要注意的:
- 只有在同一个namespace中才能进行访问
- 不同namespace之间是隔离的,无法访问
Nacos中都会有一个默认的namespace,那就是public
如何来创建明明空间呢
在这里需要注意:
- 命名空间ID 可以不用写,不写自动生成UUID
- 命名空间和描述必须填写,最好命名规范,不建议随便瞎写,做到见名知意(防止实际环境中出现意外)
然后服务列表里就多了一个命名空间
在微服务里配置命名空间
在配置命名空间时候,要将命名空间id复制到配置文件
下图配置的为orderservice
启动项目之后,orderservice跑到了dev命名空间
此时此刻:
- userservice 在 public 命名空间
- orderservice 在 dev 命名空间
此时要注意,现在userservice和orderservice已经是两个世界的人了,彼此见不到彼此
所以,互相无法访问
程序运行 (orderservice) 抛出异常
userservice启动了3个,但是还是说无法找到userservice
所以说,dev命名空间和public命名空间已经不在同一个世界了
Nacos的服务注册 对比 Eureka增加了什么
Nacos的测试实例与非测试实例
临时实例:
- 默认的都是临时实例
- 测试实例与Eureka一致,服务提供者向注册中心发送心跳包
- 服务挂掉之后会直接从列表 剔除
- 消费者向注册中心拉取最新的服务列表
非临时实例:
- 健康检测是由Nacos主动发请求询问是否存活。
- 服务挂掉之后,Nacos 不会 把非临时实例剔除,仅仅标记说不健康了,等待服务恢复健康
- 消费者可以从注册中心拉取最新服务列表。当Nacos发现有服务挂掉了,则会立即向消费者推送变更信息
配置为非临时实例
启动项目发现服务变成了非临时实例
完成之后,将该服务停掉,再看一下控制台
可以发现没有健康实例,但是服务也没有剔除,除非手动删除,否则永远都在
再次将服务启动起来,可以发现恢复了健康状态
总结
本文篇幅过长,这里在梳理一下,除去nacos的安装配置信息,简介描述下核心内容
服务注册和环境搭建很简单,这里就不叙述了。
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
服务分级
Nacos中有集群的概念,就是为了方便访问当前区域的机器。
例如:
杭州的order服务访问 杭州的user服务
要比
杭州的order服务访问 深圳的user服务
要快!!
假如杭州的user服务全部宕机了,杭州的order要访问user则会访问其他集群的服务,同时抛出一个警告(非错误异常,可正常使用)但是还是要重视这个警告。尽可能的抓紧时间修复。
Nacos的负载均衡
说到负载均衡,前两偏文章说的是Eureka的负载均衡
Nacos也是实现了相同的接口,所以用法一样
只不过Nacos的负载均衡 是按照Nacos一些配置来进行负载均衡(例如:集群、权重等),如果想使用Nacos,则这里的负载均衡配置就使用Nacos提供的
权重
权重就是当一个请求访问微服务时候,发现微服务有多个实例
那么:
- 权重数字在0~1之间
- 比较按照权重来划分优先级,谁的权重大,谁优先
- 通常用于服务器配置不同,例如机器A性能较高,则权重大,机器B 性能较弱,权重小
命名空间
命名空间一般的应用场景就是假如你有两个项目,两个项目都是微服务项目,都要用到Nacos。
所以我们一般情况:
- 搭建两个Nacos
- 两个项目公用Nacos
所以命名空间可以为不同项目使用 同一个 Nacos服务器,而且还不会有冲突
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采
用心跳模式,非临时实例采用主动检测模式 - 临时实例心跳不正常会被剔除,非临时实例则不会被
剔除 - Nacos支持服务列表变更的消息推送模式,服务列表
更新更及时