1. 什么是Nacos
一个更易于构建云原生应用的动态服务发现(Nacos Discovery)、服务配置(Nacos Config)和服务管理平台。
Nacos的关键特性包括:
- 服务发现和服务健康检测;
- 动态配置服务;
- 动态DNS服务;
- 服务及其元数据管理。
2. Nacos注册中心
管理所有微服务、解决微服务之间调用关系错综复杂、难以维护的问题。 Nacos官方文档
2.1 注册中心演变及其设计思想
2.2 核心功能
Nacos Discovery服务发现-github文档
Nacos的专栏文档
- 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip、port等信息;Nacos Server收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中;
- 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,默认5s发送一次心跳;
- 服务同步:Nacos Server集群之间会相互同步服务实例信息,用来保证服务信息的一致性。 Nacos的leader选举通过Raft协议来保证分布式的一致性;
- 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存;
- 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30s没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册),详见:微服务:剖析一下源码,Nacos的健康检查竟如此简单
2.3 主流的注册中心
CAP:一致性(Consistence)、可用性(Availability)和分区容错性(Partition Tolerance),详见:神一样的CAP理论被应用在何方
雪崩保护:避免大量服务不可用时拖垮所有服务。 -> 详细介绍
- 保护阀值:设置在0~1之间的值;
- 永久实例:spring.cloud.nacos.discovery.ephemeral=false // 当服务宕机了也不会从服务列表中剔除。
下图代表永久实例:
保护阀值:当健康实例数/总实例数<保护阀值时,触发雪崩保护。
权重:结合负载均衡器,权重越大,被分配的流量也多。
3. Nacos部署
3.1 Nacos Server部署
版本说明:
- SpringCloud Alibaba:2.2.5.RELEASE
- SpringBoot:2.3.2.RELEASE
- SpringCloud:Hoxton.SR8
组件版本关系:
流程如下:
- 下载Nacos Server源码:github;
- 修改startup.sh文件默认启动方式:cluster -> standalone;
- 启动sh脚本:sh startup.sh;
- 查看start.out日志是否启动成功;
- 进入nacos后台:http://192.168.x.x:8848/nacos/index.html (192.168.xx.xx为本机ip地址) 账号密码默认:nacos/nacos
3.2 Nacos Client部署
流程如下:
- 项目pom中引入依赖;
<!-- nacos的服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 添加项目配置application.properties;
# nacos注册的服务名
spring.application.name=order-service
# nacos server地址
spring.cloud.nacos.server-addr=127.0.0.1:8848
# nacos服务账号
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# nacos注册的命名空间
spring.cloud.nacos.discovery.namespace=public
- 启动client服务,查看是否注册成功;
- 使用RestTemplate进行服务调用。
@PostMapping("/query")
public String query(@RequestBody Object obj) {
log.debug("订单请求req:{}", JSON.toJSON(obj));
return restTemplate.postForObject("http://stock-service/stock/query", obj, String.class); // 指定服务名调用
}
@Bean
@LoadBalanced // 指定负载均衡器,默认Ribbon
public RestTemplate restTemplate() {
return new RestTemplate();
}
其它说明:
3.3 Nacos注册中心架构
3.4 Nacos集群部署
官网文档:集群部署说明
集群部署架构图:
注:使用niginx作负载均衡,把请求分发到各个nacos server服务。
单机搭建伪集群流程:
- 复制nacos源码文件,创建nacos-1.4.1-8849/8850/8851三个服务文件夹;
- 修改conf/application.properties文件:修改端口号和使用mysql作为外置数据源;
### Default web server port:
server.port=8849
### If use MySQL as datasource:
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=xiaowei
db.password.0=789456
- 将conf/cluster.conf.example文件改为cluster.conf,添加nacos server节点配置;
#example (192.168.xx.xx为本机ip地址)
192.168.1.4:8849
192.168.1.4:8850
192.168.1.4:8851
- 创建mysql数据库nacos,执行sql文件:conf/nacos-mysql.sql;
- 启动时如果出现内存不足,修改启动脚本bin/startup.sh的jvm参数;
- 分别启动nacos-1.4.1-8849/8850/8851三个服务,测试ok;
- 下载安装nginx,见:在mac电脑本地搭建nginx
- 配置nginx.conf文件,启动nginx,访问:http://192.168.1.4:8847/nacos/index.html (192.168.xx.xx为本机ip地址) ok;
upstream nacoscluster {
server 127.0.0.1:8849;
server 127.0.0.1:8850;
server 127.0.0.1:8851;
}
server {
listen 8847;
server_name localhost;
location /nacos/{
proxy_pass http://nacoscluster/nacos/;
}
}
- 将client服务配置文件application.properties中nacos server地址改为nginx服务地址+端口;
# nacos server地址
spring.cloud.nacos.server-addr=192.168.1.4:8847
-
启动client服务,进入http://192.168.1.4:8847/nacos/index.html ,服务列表显示ok。