Part 01
单体架构到微服务
在web程序发展的早期,功能模块都是被打包成单体应用,在一个web容器中运行,这个应用通常包含后端的所有模块和前端,后端所有功能模块访问同一个数据库。这样的好处是开发效率高、易部署、易测试等。
图1 单体架构
但随着大规模的复杂应用出现,单体应用展现出了很多不足,包括:可维护性变差、版本迭代速度变慢、可扩展能力差等。
微服务架构的出现,解决了上述问题,微服务架构与单体应用的区别是,微服务架构是将一个庞大复杂的应用分解为多个小的互相链接的微服务,一个微服务一般只完成一类相关功能,比如:商品、订单,每个服务可能有自己独立的数据库。
图2 微服务架构
Part 02
注册中心的演变
在微服务架构中,不同服务间免不了要相互通信,这就需要对这些服务信息进行管理,主要包括:服务的生产方、服务的消费方,服务方的物理位置等。如果微服务是部署在固定的机器上的,直接通过代码就可以进行服务间调用,但实际情况是微服务可能部署在云环境,服务实例的网络位置是动态分配的;此外根据实际负载情况部署节点也会动态调整,基于以上问题就需要一个服务管理工具,帮助我们实现服务的动态管理。
对于小体量的微服务,早期Nginx 就可以满足服务管理的需求,具体是通过Nginx维护服务列表(upStream)实现。但随着微服务数量的增多,吞吐量下降会很严重,Nginx配置文件维护起来也更加困难。
这时出现了注册中心,微服务先注册到注册中心,如果服务1想调用服务2,需要先到服务中心去获取相应接口,然后再去调用服务2,这样就解决了上边动态网络位置的问题,最简单的Nacos注册中心如下所示:
图3 Nacos注册中心
Part 03
Nacos的服务发现
那么Nacos协调服务之间的调用细节是怎样的呢?首先服务需要注册,注册的目的就是将服务ip、端口等信息上报给Nacos注册中心;然后是服务订阅,订阅和退订的目的是方便动态管理需要相互通信的服务,实现高效交互;最后是服务调用,至此完成了一个具体功能,具体实现过程如下:
1、每个服务启动后会向Nacos注册中心上报自己的网络地址,服务和Nacos间通过grpc协议进行通信,Nacos通过域名解析出服务端ip列表,这个ip列表就是服务网络地址的数据库,Nacos会选择其中一个ip创建 grpc 连接,并定时检查连接状态,当连接断开,则自动选择服务端ip列表中的下一个ip进行重连。
2、当客户端发起订阅时,注册中心除了会同步返回最新的服务实例列表,还会异步的通过grpc推送给该订阅者最新的服务实例列表,这样做的目的是为了异步更新客户端本地缓存的服务数据,一旦订阅的服务有上下线变更,该服务所有的订阅者会立刻收到最新的服务列表,并且将服务最新的实例数据更新到内存。
3、当客户端进行服务调用的时候,订阅者可以通过本地维护的服务列表获取实例,或者直接从注册中心获取进行调用。
图4 Nacos服务发现
Part 04
Nacos的核心功能
图5 Nacos核心功能
除了上文提到的服务注册和服务发现功能,Nacos的核心功能还包括心跳机制、服务同步和健康检查。
1、心跳机制
服务注册后,Nacos会为该服务分配一个心跳间隔,客户端需要在该时间间隔内发送心跳包,证明服务健康状态,如果客户端在规定时间内没有发送心跳包,Nacos认为该服务已下线,会从服务列表中将该服务移除,从而保障系统稳定性。
2、服务同步
Nacos Server集群之间会互相同步已注册的服务,用来保证服务列表的一致性。Nacos自己实现了一个一致性协议名为Distro,服务注册的时候会触发Distro一次同步,每个Nacos节点之间会定时互相发送Distro数据,以此保证数据最终一致。
3、服务健康检查
Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15秒没有收到客户端心跳的服务实例,会将它的healthy属性置为false,客户端无法调用healthy为false的服务,如果超过30秒没有收到心跳,Nacos会直接将此服务剔除。
Part 05
Nacos的其他情况
常见的注册中心组件有:Zookeeper、Eureka、Nacos、Consul等,下表为目前几个主流注册中心的情况对比:
图片
Nacos支持注册中心和配置中心,但对于小型项目来说,使用 Nacos 可能会过于复杂,不太适合初学者使用;Zookeeper用的最多的地方就是和Dubbo一起使用,不支持负载均衡策略,但可以通过其它组件实现,从性能上来讲,zookeeper 也无法满足注册中心大规模且频繁注册写的场景;Eureka通过去中心化的集群支持保证了注册中心的整体可用性,因为停更的缘故,不支持一些新技术,同时Eureka属于应用内的注册方式,对应用的侵入性太强,且只支持Java应用。
Part 06
总结
Nacos自从阿里集团内配置中心 Diamond 孵化而来,发展至今,凭借其架构与性能优势,已愈来愈受到众厂商的青睐。依托其完善的社区环境,Nacos构建了庞大而成熟的生态,已成为服务发现解决方案领域中至关重要的一员。