官方文档地址:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
一、核心功能:
- 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
- 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被踢除,默认5s发送一次心跳。
- 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
- 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时器任务定时拉取服务端最新的注册表信息更新到本地缓存。
- 服务健康检查:Nacos Server会开启一个定时任务来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性设置为false,如果某个实例超过30s没有收到心跳,直接剔除该实例(被踢除的实例如果恢复发送心跳则会重新注册)。
二、主流注册中心功能对比
Nacose | Eureka | Consul | CoreDns | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP(默认AP) | AP | CP | — | CP |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | TCP/HTTP/gRPC/CMD | — | Keep Alive |
负载均衡策略 | 权重/Metadata/Selector | Ribbon | Fabio | RoundRobin | — |
雪崩保护 | 有 | 有 | 无 | 无 | 无 |
自动注销实例 | 支持 | 支持 | 支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心同步 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
Spring Cloud集成 | 支持 | 支持 | 支持 | 不支持 | 支持 |
Dubbo集成 | 支持 | 不支持 | 支持 | 不支持 | 支持 |
K8s集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
CAP理论和BASE理论【引用文档】
-
CAP定理:Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性); 这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个
-1-. CA:优先保证一致性和可用性,放弃分区容错。这也意味着放弃系统的扩展性,系统不再是分布式的,有违设计的初衷。
-2-. CP:优先保证一致性和分区容错性,放弃可用性。在数据一致性要求比较高的场合(譬如:zookeeper,Hbase)是比较常见的做法,一旦发生网络故障或者消息丢失,就会牺牲用户体验,等恢复之后用户才逐渐能访问。
-3-. AP:优先保证可用性和分区容错性,放弃一致性。NoSQL中的Cassandra就是这种架构。跟CP一样,放弃一致性,不是说一致性就不保证了,而是逐渐的变得一致 -
BASE定理:Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写,BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。
三、Nacos中AP模式源码分析
四、Nacos版本选择
由上图可知nacos应下载1.4.2版本 ,下载地址:Nacos官方(GitHub)下载地址、Nacos码云下载地址(更快)
tips:加速插件是“GitHub加速”,浏览器是edge浏览器;也可以复制链接使用迅雷下载,速度更快。
五、安装Nacos
Nacos官方文档:快速开始
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.下载编译后压缩包方式
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
3.Nacos相关配置
4.Nacos支持三种部署模式
- 单机模式 - 用于测试和单机试用。
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
- 安装数据库,版本要求:5.6.5+
- 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
- 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到了mysql
- 集群模式 - 用于生产环境,确保高可用。
- 多集群模式 - 用于多数据中心场景。
Nacos支持NameServer路由请求模式,通过它您可以设计一个有用的映射规则来控制请求转发到相应的集群,在映射规则中您可以按命名空间或租户等分片请求…
5.启动Nacos(nacos默认有内置存储)
# 启动命令(standalone代表着单机模式运行,非集群模式):
startup.[sh|cmd] -m standalone 等价于将startup文件里面的export MODE="cluster" 为 export MODE="standalone "
sh startup.sh -m standalone
# 如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
# Windows
startup.cmd -m standalone
启动成功:
六. 访问:http://[IP]:[端口]/nacos/
application.properties可以更改默认的端口8848
默认的账号和密码都是nacos,进入后效果:
七、常见错误以及解决方案
-
删除data目录后,重新运行
-
必须配置JAVA_HOME,且需要JDK的版本为JDK8及其以上
-
更换JDK
八、注册服务到Nacos
1.添加依赖
<!-- Nacos 注册服务功能 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.启动类配置
Spring Cloud最早是从2014年推出的,在推出的前期更新迭代速度非常快,频繁发布新版本,目前更趋于稳定,变化稍慢一些;
Spring Cloud的版本并不是传统的使用数字的方式标识,而是使用诸如:Angel、Brixton、Camden、Dalston、Edgware、Finchley、GreenWich、Hoxton…等伦敦的地名来命名版本
3.添加配置
spring:
application:
name: service-clint1 # 应用名称(nacos会将该名称当作服务名称),注意:不能使用“—”(下划线)
cloud:
nacos:
server-addr: 127.0.0.1:8848 # Nacos 配置中心地址
discovery:
username: nacos # Nacos用户名,默认为 nacos
password: nacos # Nacos密码,默认为 nacos
namespace: public # 名称空间,默认为 public
3.启动项目查看注册结果
九、通过服务名调用接口
此处利用RestTemp测试调用
1.创建两个项目(nacon_client1、nacons_client2),编写两个control层方法
创建两个项目
nacon_client1项目control
nacon_client2项目control
2.直接访问报错,需要使用带有负载均衡的RestTemplate
- java.net.unknownhostexception 错误
解决方法:改造RestTemplate,使其具有负载均衡的效果(加上@LoadBalanced注解)
@LoadBalanced注解 还报错,还需要引用loadbalancer依赖(没报错就不用添加)
<!-- 支持 RestTemplate 开启负载均衡的功能 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
- java.lang.IllegalStateException: Request URI does not contain a valid hostname
解决办法:服务名称不能用下划线,换成中划线。
3.访问成功
十、Nacos界面功能介绍
1.服务详情
位置:服务管理 -> 服务列表 -> 服务详情
十一、Nacos集群
文档地址【运维指南->集权部署说明】:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
任务:使用centos部署Nacos伪集群(在一台服务器中模拟)
前提条件:安装jdk 1.8+ 、maven 3.0+ 、nginx、mysql(5.7+),安装教程
1.下载Nacos 1.4.2(版本选择看前面)
2.使用mysql数据库,sql初始化脚本在conf目录的nacos-mysql.sql
3.将下载的nacos解压,并修改conf目录下的application.properties配置,使用外置数据源
5.将conf\cluster.conf.example改为cluster.conf,添加节点配置
# 建议不要使用127.0.0.1
172.21.16.4:8849
172.21.16.4:8850
172.21.16.4:8851
7.如果出现内存不足:修改启动脚本(bin\startup.sh)的jvm参数
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
8.将一份nacos拷贝三份,并修改端口(conf目录下的application.properties文件的server.port=8848)
server.port=8848
9.官方推荐,nginx反向代理
upstream nacoscluster {
server 172.21.16.4:8849;
server 172.21.16.4:8850;
server 172.21.16.4:8851;
}
server {
listen 8848;
access_log /var/log/nginx/nacos/access.log main;
#配置请求规则
location /nacos/{
proxy_pass http://nacoscluster/nacos/;
}
}
10.启动三个nacos服务,并访问
启动成功(先判断内存是否够用 free -h;内存不够会导致之前的服务挂掉,而且没有错误日志信息)
使用nginx访问