什么是Nacos?
官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。
简述:集 注册中心+配置中心+服务管理 平台
什么是注册中心?
把所有的服务都统一的放在 一个中心,后续调用的时候只需要用一个服务名调用远程的服务,而不是用ip地址去调用
在一个微服务项目中,不同的服务之间做着不同的事情,服务和服务之间会涉及到调用,那如何去管理,这里可以用到注册中心,当服务启动(Service)启动时,将自己的一个实例,注册到注册中心上,注册中心可以做服务发现,服务检测、心跳机制
什么是配置中心?
帮助管理每一个服务的配置
- 原来:每一个服务都有自己的数据库/redis/MQ等配置,就会有很多公共配置
- 现在:把公共配置放在中,让中心去管理,而不用每个服务单独去管理
正常一个微服务项目都会有自己的一个配置文件,在这里可以配置服务的端口号、数据库地址等。当程序启动时会加载读取配置文件中的信息。当有多个服务时,我们可以将配置文件放到远端,将项目中每个服务的配置放到一起,统一管理,动态配置。
什么是服务管理平台?
可视化界面动态管理
Nacos的关键特性包括(有点)有哪些?
- 服务发现和服务健康监测(注册中心的配置 服务管理平台可以实时健康检测)
- 动态配置服务(动态给每个服务进行配置)
- 动态 DNS 服务
- 服务及其元数据管理 (元数据:注册服务时的ip、远程地址等都会进行管理)
作用(为什么要使用)?
管理所有微服务、解决微服务之间调用管理错综复杂、难以维护的问题
注册中心演变过程
①、分布式架构
问题:远程服务调用必须维护远程服务的ip地址和端口,当远程的服务器一旦发生扩容或是迁移,这个时候就需要去修改url中配置的远程服务地址。一改代码就需要重新部署上线
服务器迁移或扩容,就需要手动修改配置,重新发布上线
解决方案:数据库存储远程服务信息。添加数据库注册表
②、数据库注册表
将远程服务地址存储在数据库注册表中,每一个远程服务地址都设置一个对应的服务名称。比方说:
会员服务想要调用订单服务,通过订单服务的名称order-server我们就可以查到远程服务地址
使用注册表的好处:让远程调用变得简单
存在的问题:
- 高并发不可能每一次都去查数据库。利用缓存
- 减少服务器的压力,实现负载均衡困难
补充:
负载均衡的优点:减少服务器的压力,将原本一台服务器所要承受的访问量分给多台,并提高项目的可用性,当一台服务器挂掉的时候不会导致项目瘫痪。
③、引入nginx
引入nginx,把所有的服务列表都配置在nginx中
存在的问题:
一旦某个服务挂掉,肯定不希望nginx下次负载均衡的时候不要放到它,但是nginx不能实时的监控以及健康检查
解决方案:
一方面:可以使用第三方服务,可以解决,但是非常麻烦
另一方面:微服务中如果有成百上千个服务都需要配置在nginx,这对于运维来说是非常麻烦的,而且人工具有出错性
所以我们可以使用注册中心(nacos服务器)来帮助解决
④、提供注册中心(其实就是nacos服务器)
注册中心其中有一个注册表,用来存储服务的信息(名称、远程ip、端口、状态)
还提供了一系列对外访问的rest、http等接口对外的访问,通过这些接口我们就可以动态的注册接口,以及获取到这些服务,动态的注册服务
过程:注册——>发现——>调用——>解析地址
在服务启动的时候就会调用注册接口,在注册表中添加一条这个服务的注册信息
服务之间调用前,每次服务都会注册中获取订单服务列表,调用服务获取接口(这些接口都是基于http、rest),获取到了远程服务的地址
整个过程都不需要人干,阿里巴巴提供了服务注册与发现
问题:
1.每次都去注册中心拉取订单服务列表吗?注册中心宕机了怎么办?
2.如果拉去的订单服务对应的机器宕机了怎么办?
解决方案:引入心跳机制
⑤、引入心跳机制
1.服务会在本地维护一个定时任务,每5s通过心跳接口发送一个心跳到注册中心,注册中心如果超过5s没有收到这个心跳,注册中心就会把这个服务视为挂掉了,把status改为down;超过30s,服务从注册表中剔除。始终维护最新的服务列表。任何一个微服务都可以称为nacos的服务端,任何一个nacos客户端都会往nacos注册中心发送一个心跳,证明我还活着
2.如果服务要停止掉,调用注销接口,把服务从注册表中删除
3.服务的Client也有一个定时任务,调用服务获取接口定时拉取订单服务列表,如果每次都拉占用系统资源,所以被缓存到客户端
Nacos的核心功能有哪些?
- 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
- 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
- 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。 leader raft
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
- 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)