Skip to content

认识Nacos

Nacos官网

Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施

Nacos 支持如下核心特性:

1)服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。

2)服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。

3)动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

4)动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。

5)服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos 地图

img

Nacos 生态图

img

常见的注册中心

Eureka(原生,2.0遇到瓶颈,停止维护)

Zookeeper(支持,专业的独立产品。例如:dubbo)

Consul(原生,GO语言开发)

Nacos 相对于 Spring Cloud Eureka 来说,Nacos 更强大。

Nacos = Spring Cloud Eureka + Spring Cloud Config

Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

nacos与eureka的区别

1)nacos和eureka的范围不同,Nacos的阈值是针对某个具体Service的,而不是针对所有服务的;但Eureka的自我保护阈值是针对所有服务的。nacos支持CP和AP两种;eureka只支持AP。nacos使用netty,是长连接; eureka是短连接,定时发送。

2)Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server. enab1e-self-preservation:false)

Nacos保护方式:当域名健康实例(Instance)占总服务实例(Instance)的比例小于阈值时,无论实例(Instance)是否健康,都会将这个实例(Instance)返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例(Instance)能正常工作。

img

分布式应用核心CAP知识

TIP

CAP定理: 指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时获得

  • 一致性(C):所有节点都可以访问到最新的数据

  • 可用性(A):每个请求都是可以得到响应的,不管请求是成功还是失败

  • 分区容错性(P):除了全部整体网络故障,其他故障都不能导致整个系统不可用

  • CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡

img

如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的

如果不要求A(可用),每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统

要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。

NacosEurekaConsulZookeeper
一致性协议CP+APAPCPCP
健康检查TCP/HTTP/MYSQL/Client Beat心跳TCP/HTTP/gRPC/CmdKeep Alive
访问协议HTTP/DNSHTTPHTTP/DNSTCP
SpringCloud集成支持支持支持支持
  1. Zookeeper:CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举行的leader,或者半数以上节点不可用,则无法提供服务,因此可用性没法满足

  2. Eureka:AP原则,无主从节点,一个节点挂了,自动切换其他节点可以使用,去中心化

  3. 结论:

  • 分布式系统中P,肯定要满足,所以只能在CA中二选一
  • 没有最好的选择,最好的选择是根据业务场景来进行架构设计
  • 如果要求一致性,则选择zookeeper/Nacos,如金融行业 CP
  • 如果要求可用性,则Eureka/Nacos,如电商系统 AP
  • CP : 适合支付、交易类,要求数据强一致性,宁可业务不可用,也不能出现脏数据
  • AP: 互联网业务,比如信息流架构,不要求数据强一致,更想要服务可用

Nacos下载和安装

js
# 本站提供 nacos 2.1.0
链接:https://pan.baidu.com/s/17yBXkJnxIAt08tmMdpmnSg?pwd=8q6a 
提取码:8q6a
js
# 本站提供 jdk 64位 1.8
链接:https://pan.baidu.com/s/1jXtNQrVlt_bDn-0mzNbhFQ?pwd=24jp 
提取码:24jp

从Github上下载源码

PS:nacos的默认端口是8848,需要保证8848默认端口没有被其他进程占用

js
# 下载项目
git clone https://github.com/alibaba/nacos.git
cd nacos/
# 编译
mvn ‐Prelease‐nacos clean install ‐U
ls ‐al distribution/target/
# 切换至相应版本目录
cd distribution/target/nacos‐server‐$version/nacos/bin
# Windows下运行
startup.cmd -m standalone
# Linux下运行,standalone表示为单机运行
startup.sh -m standalone

下载编译后压缩包方式
下载 nacos-server-$version.zip 包
下载地址:https://github.com/alibaba/nacos/releases
js
# 解压
unzip nacos‐server‐$version.zip 
# tar ‐xvf nacos‐server‐$version.tar.gz
# 切换目录
cd nacos/bin
# 运行
startup.sh -m standalone
# docker pull mysql:5.7
# docker run -p 3306:3306 --name qmm-mysql -v ~/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Ab@123456  -d mysql:5.7

# sudo bash -f /opt/nacos/bin/shutdown.sh
# sudo bash -f /opt/nacos/bin/startup.sh -m standalone

# 无论如何,先把自己防火墙的端口放开
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent

# 重新加载下防火墙,让规则生效
sudo firewall-cmd --reload

# Windows下直接解压点击startup.cmd运行即可

官网下载地址:

https://github.com/alibaba/nacos/tags

软件环境

Nacos 版本:2.0.4 mysql版本:5.7

docker安装nacos

**注:**注意启动时需要配置这个环境配置 -e MODE=standalone 否则默认启动为占用内存为1G

1、先拉取镜像

命令:

docker pull nacos/nacos-server:v2.0.4

docker pull nacos/nacos-server

2、挂载目录

mkdir -p /home/nacos/logs/                      #新建logs目录
mkdir -p /home/nacos/init.d/          
vim /home/nacos/init.d/custom.properties        #修改配置文件

配置如下

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
 
spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://xx.xx.xx.x:3306/nacos_devtest_prod?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=user
db.password=pass
 
 
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
 
management.metrics.export.elastic.enabled=false
 
management.metrics.export.influx.enabled=false
 
 
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i
 
 
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.expireInstance=true

2、运行容器

命令:

docker run --name nacos(容器名称) -d -p 8848(外部访问端口):8848(容器内端口) --privileged=true --restart=always -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /home/nacos/logs(数据卷主机地址):/home/nacos/logs(数据卷容器内部地址) -v /home/nacos/conf:/home/nacos/conf ea54f31c46e4(容器id)

格式化后

docker  run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /home/nacos/logs:/home/nacos/logs \
-v /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties \
nacos/nacos-server

命令:docker ps

3、查看容器相关日志

命令:docker logs --since 10m nacos的容器id #查看指定容器的输出日志

Linux安装nacos

下载安装包上传到服务器的对应路径下面即可

  • 解压安装包
  • 进入bin目录
  • 启动 sh startup.sh -m standalone
  • 访问 localhost:8848/nacos
  • 默认账号密码 nacos/nacos

windows安装nacos

下载安装包解压对应路径下面即可

img

配置数据源

修改conf/application.properties文件,增加支持mysql数据源配置

img

# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456

启动

nacos的默认端口是8848,需要保证8848默认端口没有被其他进程占用。

进入安装程序的bin目录:

Linux/Unix/Mac启动方式:

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows启动方式:

启动命令:

修改start.cmd启动器: set MODE="standalone"(26行)

双击startup.cmd运行文件。

或者 : startup.cmd -m standalone

img

进行访问

本机IP地址:

text
http://localhost:8848/nacos

img

注:记得开放对应端口

登录账号 登录密码 nacos nacos

本人用的是1.3.2版本 jdk1.8

下载的2.1.0版本有报错应该是 我电脑 jdk版本过低不兼容

Released under the MIT License.