Nacos简介
2018年6月,Eureka2.0宣布闭源(但是1.X版本仍然为活跃项目),同年七月份,阿里Nacos宣布开源,并快速成为国内最受关注的开源产品/作为Eureka的替代,Nacos已经成为了国内开发者的首选,目前Nacos的Star已经突破28K
Nacos(Dynamic Naming and Configuration Service)
在最初开源的时候,Nacos选择内部三个产品统一开源(configserver 非持久注册中心 VIPServer 持久化注册中心,Diamond配置中心) 定位为:一个更易于构建云原生服务的动态服务发现,配置管理和服务管理平台.所以Nacos是一个注册中心组件,但又不仅仅是一个注册中心组件
Nacos安装
学习阶段我们采用待单机安装即可
1.下载安装包
目前官方推荐的稳定版本是2.2.3
下载地址:https://github.com/alibaba/nacos/releases/tag/2.2.3
2.Windows
1.解压:把压缩包解压到任意非中文的目录下

目录介绍:bin:Nacos启停脚本
startup.cmd:Windows的启动脚本 startup.sh:Linux的启动脚本
shutdown.cmd:Windows的停止脚本 shutdown.sh:Linux的停止脚本
conf:Nacos的配置文件
target:存放Nacos应用的jar包
2,修改单机模式
Nacos默认启动方式为集群,启动前需要修改配置为单机模式
1.使用记事本打开startup.cmd
2.Line26左右,修改启动模式
set MODE="cluster"
改为
set MODE="standalone"
3.启动Nacos
启动非常简单,进入bin目录下,双击startup.cmd即可

访问Nacos主页,出现一下界面,表示Nacos启动成功

4.常见问题
Nacos启动后,目录下会多一个logs的文件夹
报错日志在logs/naocos.log
如果是集群模式启动报错(unknownHostException)(按照上述步骤修改即可)
如果端口号冲突报错(net.BindException),杀掉8848进程/修改nacos端口号
Linux
1.准备安装包
2.单机模式启动
进入nacos/bin目录.输入命令 bash startup.sh - m standalone

Nacos快速上手
Nacos是Spring Cloud Alibaba 的组件,Spring Cloud Alibaba 遵循SpringCloud中定义的服务注册,服务发现规范,因此使用Nacos和使用Eureka对于微服务来说,并没有太大区别
主要差异在于:
1.Eureka需要自己搭建一个服务,Nacos不用自己搭建服务,组件已经准备好了,只需启动即可
2.对应的依赖和配置不同
1.服务注册/服务发现
Nacos的服务注册和服务发现代码一样
引入SpringCloudAlibaba依赖(这里要注意Spring Boot和Spring Cloud的版本是有一定的对应关系)
引入Nacos依赖
引入LoadBalance依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2.配置Nacos地址
可以配置为本地地址,也可以使用服务器地址
3.远程调用
1.修改IP为项目名
2.为RestTemplate添加负载均衡注解@LoadBalance
4.启动服务
启动两个服务,观察Nacos的管理界面,发现order-service和product-service都注册到Nacos上了
Nacos负载均衡
生产环境相对是比较恶劣的,我们需要对服务的流量进行更精细的控制,Nacos支持多种负载均衡策略,包括权重,同机房,同地域,同环境等
1.服务下线
当某一个节点上接口的性能比较差时,我们可以第一时间对该节点进行下线
2.权重配置
除了下线之外,我们还可以配置这个节点的流量权重
1.配置权重(默认是1,可以根据需要进行修改)
2.开启Nacos负载均衡策略
由于Spring Cloud LoadBalance组件自身有负载均衡配置方式,所以不支持Nacos的权重属性配置.我们需要开启Nacos的负载均衡策略,让权重配置生效
开启nacos的负载均衡策略
spring:
cloud:
loadbalancer:
nacos:
enabled:true
3.测试权重配置
3.同集群优先访问
Nacos把同一个机房内的实例,划分为一个集群,所以同集群优先访问,一定程度上也可以理解为同机房优先访问
Nacos健康检查
1.两种检健康检查机制
Nacos作为注册中心,需要感知服务的健康状态,才能为服务调用方提供良好的服务
Nacos中提供了两种健康检查机制
客户端主动上报机制:
1.客户端通过心跳上报的方式告知服务端(Nacos注册中心)健康状态,默认心跳间隔为5秒
2.nacos会在超过15s未收到心跳后将实例设置为不健康状态,超过30s将实例删除
服务器端反向探测机制:
1.nacos主动探知客户端健康状态,默认间隔为20s
2.健康检查失败后会被标记为不健康,但不会立即被删除
2.Nacos服务实例类型
Nacos的服务实例(注册中心)分为临时实例和非临时实例
临时实例:如果实例宕机超过一定时间,会从服务列表删除,默认类型
非临时实例:如果实例宕机不会从服务列表剔除,也叫永久实例
服务节点,默认为临时实例 临时实例采用客户端主动上报 非临时实例采用的是服务器反向探测
Nacos会记录一个实例的IP,端口号,以及实例类型,不允许临时实例改为非临时实例,
如果想要修改,需要删除掉nacos的相关数据信息 1.停止nacos 2.删除数据信息 nacos\protocol\raft
Nacos环境隔离
企业开发中,一个服务会分为开发环境,测试环境和生产环境
1.开发环境:开发人员用于开发的服务器,是最基础的环境,一般日志级别设置较低,可能会开启一些调试信息
2.测试环境:测试人员用来进行服务测试的服务器 是开发环境到生产环境的过渡环境
3.生产环境:正式对外提供服务的环境,通常关掉调试信息
通常情况下,这几个环境是不能互相通信的,Nacos提供了namespace来实现环境的的隔离,不同的namespace的服务不可见
1.创建Namespace
默认情况下,所有的服务都在同一个namespace,名为public
点击左侧命名空间,可以对namespace进行操作
2.配置namespace
|------|----------------------------------------|-----|----------------------|
| 配置项 | Key | 默认值 | 说明 |
| 命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用的场景之一是不同环境的注册的区分隔离 |
Nacos配置中心
1.为什么需要配置中心
当项目的配置都在代码中,会存在一下问题:
1.配置文件修改时,服务需要重新部署,微服务架构中,可能会有成百个实例,挨个部署比较麻烦,且容易出错
2.多人开发时,配置文件可能经常需要修改,使用同一个配置文件容易出错
配置中心就是对这些配置项进行统一管理.通过配置中心,可以集中查看,修改和删除配置,无需再逐个修改配置文件,提高效率的同时,也减低了出错的风险

2.快速上手
1.添加配置
在nacos控制台添加配置项
注意:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的,默认是public
也就是服务管理命名空间配置!=配置管理的命名空间
2.获取配置
1.引入nacos依赖
2.配置bootstrap.properties
微服务启动前,需要先获取到nacos中配置,并于application.yml配置合并,在微服务运行之前,Nacos要求必须使用bootstrap.properties配置文件来配置nacos server地址
3.编写程序
java
@RefreshScope
@RestController
public class NacosController {
@Value("${nacos.config}")
private String nacosConfg;
@RequestMapping("/getConfig")
public String getConfig(){
return "从Nacos获取配置项nacos.config:"+nacosConfg;
}
}
@Value读取配置
@RefreshScope:配置进行热更新
3.配置中心详解
1.设置命名空间
nacos配置管理的命名空间和服务列表的命名空间是分别设置的,默认为public
nacos命名空间配置依旧在bootstrap.properties中进行配置
2.DataId
在nacos spring cloud中,dataId的完整格式如下:
{prefix}-{spring.profiles.active}.${file-extension}
prefix默认为spring.application.name的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置
spring.profiles.active:即当前环境对应的profile 当spring.profiles.active为空时,对应的连接符-也将不存在,dataId的拼接格式变为{prefix}.{file-extension}
file-extension为配置内容的数据格式 可以通过配置项spring.cloud.nacos.config.file-extension来配置,目前只支持properties和yaml类型, 默认为properties
Nacos和Eureka的区别
共同点
都支持服务注册和服务拉取
区别
1.功能:Nacos除了服务发现和注册之外,还提供了配置中心,流量管理和DNS服务等功能
2.CAP理论:
Eureka遵循AP原则, Nacos可以切换AP和CP模式,默认为AP
Nacos根据配置识别CP/AP模式,如果注册Nacos的Client的节点是临时节点,那么Nacos对于Client节点的效果就是AP,反之就是CP.AP和CP可以混合同时存在
3.服务发现:
Eureka:基于拉模式 Eureka Client会定期从Server拉取服务信息,有缓存,默认每30s拉取一次
Nacos:基于推送模式,服务列表有变化时实时推送给订阅者 ,服务端和客户端保持心跳连接