什么是Nacos
官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。
集 注册中心+配置中心+服务管理 平台
Nacos 的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
Nacos注册中心
管理所有的微服务、解决微服务之间调用关系错综复杂、难以维护的问题
注册中心演变及其设计思想
(1)分布式架构
分布式架构远程调用存在以下问题:
应用需要维护好对方的ip和端口号,一旦对方的ip port变更(比如服务器的迁移、扩容等),就需要修改远程调用的代码,然后重新部署发布上线。
(2)手动维护一份注册表
使用手动维护一份注册表,注册表中维护服务的ip和端口,每个服务对应一个服务名,方便获取。为了提高访问效率,可以将注册表存放到缓存中。但这种方式也存在一个问题:
订单服务水平扩容,某个订单服务宕机等都需要手动修改注册表。
而且当时微服务还没有正式诞生,本地上实现负载均衡比较困难。
(3)使用Nginx作为注册中心
引入nginx后,将所有服务列表保存在nginx配置中,但这种方式也存在问题:
1.如果有服务挂掉了,nginx并没有实时的监控和健康检查功能,并不能及时发现
2.nginx中维护的服务非常多,比如电商大促需要添加成百上千服务,之后又要撤销,这对于运维非常困难。
(4)使用Nacos作为注册中心
Nacos Client一启动就会发送REST请求向Nacos Server注册自己的服务,提供自身的元数据,比如ip地
址、端口等信息。Nacos Server收到请求后就会将元信息存储到Map中,在内部维护了一个注册表。客户端定时从服务器中获取最新的注册表信息。
但Nacos还没有解决服务宕机,对服务的监控问题。
之后对于Nacos存在的问题,之后又进行了改进:
设置了一个定时任务,客户端定时向注册中心发送心跳,用于维护注册表,将宕机的服务从注册表中剔除
当服务停止后,调用注销接口,注销服务。
Nacos核心功能
服务注册: 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(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
主流的注册中心对比
CAP C 一致性 A可用性 P 分区容错性
可以看出Nacos支持的功能最齐全,Nacos可以自由地切换一致性协议CP/AP,默认为AP
代码实现
nacos客户端内置了负载均衡器Ribbon,帮助实现服务调用。如果不使用负载均衡器,nacos无法实现服务间的调用,所以在使用ResTemplate实现远程调用时需要加上@LoadBalanced,才能利用注册表实现远程调用,否则无法直接用服务名调用对应微服务
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
return restTemplateBuilder.build();
}