Nacos注册中心
Nacos是阿里巴巴的产品,作为SpringCloud的组件。Nacos可以用作注册中心和分布式配置管理中心,相对于Eureka功能更多一些。
Nacos也是服务端和客户端的结构,服务端通过官方仓库下载的压缩包进行启动,客户端还是引入依赖配置服务路径进行挂载。
因为SpringCloudCommons组件规定了DiscoveryClient(服务发现)接口和ServiceRegistry(服务注册)接口,所有微服务组件直接对接此标准接口完成功能研发,所以对于同类的微服务组件可以无缝的切换。
客户端搭建
Nacos的服务端搭建要从官方仓库下载安装包进行启动,客户端仍然是导入依赖和书写配置:
- 在Maven根项目中添加管理依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2..25.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
- 项目中添加nacos客户端依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置环境:
spring:
cloud:
nacos:
server-addr: localhost:8848
启动服务后,可以在Nacos控制台中查看到已经注册的服务列表:
分级存储模型
服务可以理解是jar包,将服务实际部署之后称为实例,通常一个服务的实例部署在多个服务器上,服务器又存在于多个地区,那每个地区的多个实例就称作集群。这样可以避免将所有服务放到一个地方所导致服务器宕机而给整体实例带来的影响。
当消费者调用提供者时,会优先在同一集群下寻找服务,只有当最近的服务都不可用的情况下,才会选择跨集群访问。
虽然通过通俗的说法采用了地区来划分集群,但Nacos并不关系集群部署的实际意义,只需要打上同样的标记,Nacos就认定为同一集群。
spring:
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ # 集群名称
在配置好集群信息后,服务列表中就会出现多个集群数量,标识多个实例部署到了多个集群:
进入服务后,还可以详细的查看每个集群的实例信息:
NacosRule负载均衡
NacosRule策略
在默认情况下,即使每个服务都在Nacos配置了集群名称,在进行远程调用的时候仍然采用轮询的方式,所以需要将ribbon的负载均衡策略更改为Nacos提供的方式:
oneservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
跨集群访问警告
配置了Nacos负载均衡方式之后,进行RPC调用的时候会自动选择集群内的服务。集群内的多个服务采用随机的方式,如果进行跨集群调用的话就会出现调用警告(出现了跨集群访问):
同集群访问权重
如果要规定同一个服务内的服务调用优先级,可以通过Nacos控制台,对实例进行编辑,通过权重来控制调用优先级。
优先级通常定义在0-1之间,分值越小优先级越小,如果设置为0,服务就会进入假死状态,无法被访问:
Nacos环境隔离
在Nacos中,不仅存在服务管理还有数据的管理,环境隔离表示通过Namespace概念将多个同类型的服务划分到不同的空间,不同空间的服务无法相互调用。
环境隔离可以用在对环境的划分,例如开发环境和测试环境如果使用了同一个Nacos服务器,但并不想其相互之间存在数据和服务交流,就可以将服务分布到不同的Namespace中。
Namespace中可以定义多个group,gruop是配置和服务的集合,可以将业务关联度较高的服务和数据放到一起易于管理:
新建命名空间
在Nacos的菜单中可以看到命名空间的菜单,点击菜单可以对现有的命名空间进行管理:
保留空间是Nacos默认存在的空间。
点击新建可以添加一个命名空间:
创建完成之后就可以看到刚刚创建的命名空间:
不填写命名空间的ID将自动生成
然后就可以在服务中指定命名空间ID进行服务的注册:
spring:
cloud:
nacos:
discovery:
namespace: 命名空间ID
Nacos服务原理
- Nacos中每个服务所管理的列表是定时30秒缓存的。
- 临时实例表示自动的通过服务主动发送心跳来进行健康检查,非临时实例表示由Nacos主动询问服务来进行健康检查。Nacos中的实例都是临时实例,临时实例心跳出现异常后将直接踢出服务列表,但非临时实例如果心跳异常则会标识为不健康实例,但不会踢出服务列表。
spring:
cloud:
nacos:
discovery:
ephemeral: false # 设置为非临时实例
非临时实例在Nacos控制台显示为false。
- 在服务没有及时推送到服务消费者的情况下,容易造成错误的调用。Eureka采用了服务拉取的方式,Nacos不仅采用服务拉取,还采用主动推送的方式。在服务出现健康异常和新服务加入的时候,都会主动的推送到各个客户端。
总结:
- 都支持服务注册和服务拉取,以及让服务提供者发送心跳进行心跳检测。
- Nacos的临时实例仍然采用心跳模式,但是非临时实例还会采用主动检测模式。
- Nacos支持服务列表的主动推送,服务列表更新更及时。
- Nacos集群更强调服务的高可用,采用AP模式,当集群中存在非临时实例时,则更强调可靠和稳定,采用CP模式;Eureka始终采用AP模式。