1. Nacos介绍
1.1 什么是Nacos
- 官方文档:Nacos的官方文档
- Nacos致力于帮助发现,配置和管理微服务。Nacos提供了一组简单易用的特性集,让我们更快的实现动态服务发现,服务配置,服务元数据以及流量管理。
- Nacos的关键特性包括:
- 服务发现和服务健康检测
- 动态配置服务
- 动态DNS服务
- 服务以及其元数据管理
1.2 主流的注册中心的介绍和对比
- Nacos是比较特殊的,有AP和CP两个模式
- Nacos的临时节点是存储在内存中的,下线直接删除,是AP模式
- Nacos的持久节点是存储在磁盘中的的,一般我们是用Mysql存储,是CP模式
1.3 Nacos架构
- NamingService:命名服务,注册中心核心接口
- ConfigService:配置服务,配置中心核心接口
- OpenAPI文档:openAPI文档
2. Nacos的部署
2.1 下载源码编译
- 源码下载地址:下载地址
cd nacos/
mvn -Prelease-nacos clean install -U
2.2 下载安装包
- 下载地址:下载地址
2.3 启动
- 我们的nacos的启动默认是集群模式启动的
- 我们分为两种:
(1)集群模式启动
(2)单机模式启动
2.3.1 单机模式
- 官方文档:官方文档
- 解压,进入nacos的目录
- 单机启动nacos,执行命令
bin/startup.sh -m standalone
注意,我们这里加上了-m standalone ,加上这个之后就成为了单机模式,如果什么都不加的话则是集群模式
- 同样我们也可以修改启动方式
- 访问nacos的管理端,http://ip:8848/nacos,默认的用户名密码是:nacos/nacos
2.3.2 集群模式
- 官网文档:官网文档
- 集群部署的架构图
由此可见,我们的nacos的集群其实是利用nginx进行访问的。
2.3.2.1 搭建单机伪集群模式
- 单机搭建伪集群,复制nacos的安装包,修改为nacos8849,nacos8850,nacos8851
- 以nacos8849为例,进入nacos8849的目录
(1)修改conf/application.properties的配置文件,使用外置数据源
#使用外置mysql数据源
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
(2)将conf/cluster.example修改为cluster.conf,添加节点配置
# ip:port
192.168.3.14:8849
192.168.3.14:8850
(3)nacos8850和nacos8851按照同样的方式进行配置
- 创建mysql数据库,sql文件的位置是在:conf/nacos-mysql.sql
- 修改启动脚本,该脚本在bin/startup.sh的JVM参数
- 分别启动nacos8849,nacos8850,nacos8851,这里我们以nacos8849为例,进入nacos8849的目录,启动nacos
bin/startup.sh
6. 测试
- 登录http://ip:8849/nacos,用户名和密码都是nacos
- 配置nginx,利用nginx的反向代理来完成nacos的集群统一入口
配置完成之后,我们可以访问http://nginx的ip:8847(上面nginx监听的是8847)/nacos
以此通过反向代理来完成nacos的集群访问
2.4 prometheus + grafana监控Nacos
- 文档:Nacos的监控手册
- Nacos0.8.0版本完善了监控系统,支持通过暴露metrics数据接入第三方监控系统监控Nacos的运行状态。
- Nacos暴露metrics数据
management.endpoints.web.exposure.include=*
- 测试:访问http://localhost:8848/nacos/actuator/prometheus
- prometheus采集Nacos metrics数据
- 启动prometheus服务
prometheus.exe --config.file=prometheus.yml
- 测试:访问http://localhost:9090/graph
- grafana展示metrics的数据
- 测试:http://localhost:3000/
3. Nacos的核心功能
- Nacos的核心功能主要有:
- 服务注册
- 服务心跳
- 服务同步
- 服务发现
- 服务健康检查
3.1 服务注册
- Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如IP地址,端口信心等。Nacos Server接受到注册请求之后,就会把这些元数据信息存储在一个
双层的内存Map中
。
注意:这个双层map,第一个key是namespace,第二个key是group:servicename组合而成,所以我们的nacos是以namespace和group进行实例区分的,其他的像是cluster与version需要程序手动控制隔离。
3.2 服务心跳
- 在服务注册之后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直是处可用状态的,防止被剔除,默认是5s发送一次心跳
3.3 服务同步
- Nacos Server集群之间会相互同步服务实例,用来保证服务信息的一致性,leader raft。
- 具体的Raft协议,我们在另外的博客中进行了详细的解释
3.4 服务发现
- 服务消费者(Nacos Client)在调用服务提供者的服务的时候,会发送一个Rest请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
3.5 服务健康检查
- Nacos Server会开启一个定时任务用来检查注册服务实例的健康状态,对于超过
15s
没有收到客户端心跳的实例会将他的healthy属性设置为false - 客户端服务发现的时候不会发现healthy属性是false的实例
- 如果某个实例在
30s
之后还是没有收到心跳,则直接被剔除 - 剔除的实例如果恢复了,重新发送心跳则会进行重新注册。
3.6 Nacos的整体架构
3.7 服务注册表结构
3.8 服务领域模型
3.9 服务实例数据
- 我们直接访问固定API的请求
4. Spring Cloud Alibaba的Nacos的快速开始
4.1 Spring Cloud Alibaba版本的选型
4.2 搭建Nacos-client服务
4.2.1 引入pom依赖
- 引入版本的管理,在父pom文件中引入
<dependencyManagement>
<dependencies>
<!--引入springcloud的版本-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 在当前项目中引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2.2 application.properties文件中配置
- 注意:
server-addr后面的内容不需要写协议,就是不写http这些的
# nacos的配置
spring:
cloud:
nacos:
discovery:
# 远程地址,记得不要写协议,就是在最前面不要写http
server-addr: 192.168.0.108:8848
- 更多的配置可以参考:Nacos的更多的配置
4.2.3 启动springboot应用,观察是否注册成功
- 启动之后,登录nacos的管理页面
4.2.4 测试
- 使用RestTemplate进行服务调用
String url = "http://service-order/order/findOrderByUserId/"+id;
注意:我们这里是直接使用微服务名字进行调用的,那么我们就需要使用@LoadBalance注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
- 到这里我们的nacos已经安装完毕了,并且测试成功。