Nacos
黑马程序员:https://www.bilibili.com/video/BV1LQ4y127n4?p=17
简介
Nacos
阿里巴巴的产品,SpringCloud的一个组件,相比Eureka功能更加丰富,在国内受欢迎程度较高。
安装
Github下载地址:Tags · alibaba/nacos · GitHub 推荐使用1.x版本
启动服务器
下载完毕后解压,进入bin目录下进入命令行,执行.\startup.cmd -m standalone
启动命令(standalone代表着单机模式运行,非集群模式):
关闭服务器
shutdown.cmd
或者双击shutdown.cmd运行文件。
Nacos的使用
在父类添加阿里巴巴管理依赖
注意版本号冲突
<!--springcloud - alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
服务提供者
导入Nacos依赖springcloud-provider-dept-8001
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
配置nacos
spring:
cloud:
nacos:
server-addr: localhost:8848
测试
服务消费者
导入nacos依赖springcloud-consumer-dept-80
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件
# 端口
server:
port: 80
spring:
cloud:
nacos:
server-addr: localhost:8848
application:
name: nacos-demo
解决办法,给注册的服务添加一个name服务名字
启动测试
Nacos注册中心
Nacos服务分级存储模型
服务跨集群调用问题
- 服务调用尽可能选择本地集群的服务,跨集群调用延迟较高
- 本地集群不可访问时,再去访问其它集群
nacos集群的配置
服务提供者
修改配置文件
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: SH #上海集群
服务消费者
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 在消费中,优先访问杭州的集群
但是经过测试,依然采用轮询
的方式来访问集群。所以必须修改负载均衡。
NacosRule负载均衡
根据集群负载均衡
在服务消费者springcloud-consumer-dept-80
中
优先访问已经设置的集群,如果本地没有,则访问其他集群。
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
根据权重负载均衡
实际部署中会出现这样的场景:
- 服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。
当权重设置为0时,将不会被访问,所以可以用来重启服务。
环境隔离(namespace)
Nacos中 服务存储和服务存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
新建命名空间
创建完成
配置服务提供者
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
namespace: 55a18106-a5bf-43dc-b4aa-2615c63f39b8 # dev环境
ephemeral: false # 非临时实例
重启服务
不同的环境下,不可以访问。
No instance available for userservice
Nacos注册中心原理
服务消费者—注册中心
定时拉取服务 pull:每隔三十秒更新一次。
主动推送服务 push:若30秒内服务宕机,注册中心会主动推送变更信息即使更新服务的状态。
服务提供者—注册中心
默认情况下所有的实例都是临时实例,宕机就会被剔除,推荐使用临时实例
。
非临时实例nacos不会采用心跳检测。如果宕机就会等待其恢复健康。
spring:
cloud:
nacos:
discovery:
ephemeral: false # 非临时实例
停掉服务后
只要不删除一直等待服务恢复。
与Eureka 的对比
共同点:
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
区别:
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP模式。