Nacos是Dynamic Naming and Configuration Service的首字母组合而成的,致力于帮助开发人员发现、配置和管理微服务。Nacos提供了一组简单易用的功能集,帮助你快速实现动态服务发现、服务配置、服务元数据及流量管理。可以说,Nacos是Spring Cloud Alibaba中最重要的技术组件。本节将帮助你了解Nacos的整体架构。更为重要的,你将基于Nacos掌握构建高可用注册中心的实现架构和操作方法。
Nacos是构建以“服务”为中心的现代应用架构的基础设施组件,在业界应用非常广泛,已经构成了一个生态系统。图2-6展示的就是Nacos的各个应用场景以及与其他主流开源框架的整合路径。
图2-6 Nacos的各个应用场景以及与其他主流开源框架的整合路径
在图2-6中,我们看到Nacos无缝支持一些主流的开源框架,例如:Spring Cloud、Apache Dubbo和Dubbo Mesh、Kubernetes。
Nacos之所以能够构建如此强大的生态系统,关键是因为它的功能特性。经过阿里巴巴多年的探索和沉淀,以及“双11”等大流量场景的真实考验,Nacos积累了丰富而实用的功能特性,列举如下。
❑ 简单数据模型和标准API。
❑ 数据变更毫秒级推送生效。
❑ 十万级服务/配置。
❑ 99.9%高可用。
基于上述功能,使用Nacos为开发人员提供了简化服务治理和配置管理的解决方案。而在这个解决方案背后,是Nacos对于“服务”这一概念的高度抽象以及对于“服务管理”这一过程的架构设计。图2-7展示了Nacos的整体架构。
图2-7 Nacos的整体架构
基于架构分层的思想和实践,我们不难看出Nacos采用了如下四层架构。
❑ 用户层:解决用户使用的易用性问题。
❑ 业务层:解决服务发现和配置管理的功能问题。
❑ 内核层:解决分布式系统一致性、存储、高可用等核心问题。
❑ 插件层:解决框架扩展性问题。
其中,有一个概念我们需要重视,那就是服务元数据(Service Metadata)。所谓服务元数据,是指服务端点、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。这些元数据在实现定制化路由和负载均衡等领域具有广泛的应用。随着SpringOrder案例系统的不断演进,我们也会基于服务元数据实现一系列针对服务管理上的扩展功能。
Nacos是一个独立的服务端组件,想要使用Nacos首先得搭建它的运行环境。Nacos为开发人员提供了两种部署模式:一种是单机模式,一种是集群模式。
1.单机模式
在单机模式下启动Nacos的方法很简单,我们只需要在startup启动命令之后添加-m standalone参数即可。当Nacos成功启动之后,我们可以通过浏览器来查看Nacos的控制台,如图2-8所示。
图2-8 Nacos的控制台
Nacos单机模式比较适合开发、测试环境的使用需求。而如果是生产环境,那就需要采用集群模式构建高可用的服务端架构。集群模式也是Nacos默认的运行模式,搭建过程比较复杂,接下来我们对这一运行模式进行详细的展开。
2.集群模式
Nacos集群的搭建有一套固定的步骤,如图2-9所示。
正如图2-9所示,我们首先需要从Nacos的github官网(https://github.com/alibaba/nacos/tags)上下载任一版本的Nacos部署包,并根据集群大小准备若干个部署包副本。假设我们需要构建具有三个实例的Nacos集群,那么我们就需要准备三个Nacos部署包副本。
图2-9 Nacos集群搭建步骤
当我们打开Nacos部署包并来到它的config文件夹,可以看到如图2-10所示的文件列表,其中用红框标识的就是我们需要操作的配置文件和SQL(结构化查询语言)脚本。
我们需要打开图2-10所示的cluster.conf文件,添加集群实例的IP和端口地址。如果你使用本地环境作为Nacos服务器,那么可以采用如代码清单2-1所示的配置效果。
图2-10 Nacos部署所需相关文件
代码清单2-1 Nacos集群IP和端口配置代码
你可以根据需要将代码清单2-1中的IP替换成你的IP地址,然后确保所设置的端口没有被其他应用占用。当我们将上述配置同步更新到Nacos所有部署包副本中的cluster.conf文件,集群配置文件的调整就完成了。
设置完集群配置文件之后,下一步就是设置Nacos服务的启动端口。Nacos服务本质上也是一个Spring Boot应用程序,所以我们只需要在图2-10所示的application.properties配置文件中设置如代码清单2-2所示的配置项即可。
代码清单2-2 Nacos服务端口配置代码
这里有一个注意点。因为Nacos 2.0以后每个服务实例的启动会占用两个连续端口${server.port} 和 ${server.port}+1,所以端口设置上不要使用连续端口,正如我们在上一步所设置的那样。
Nacos的集群化运行需要将运行时数据保存在关系型数据库中,因此,我们需要创建一个新的数据库并使用图2-10所示的nacos-mysql.sql脚本对其进行初始化。
在完成数据库初始化之后,不要忘记在每个Nacos部署副本的application.properties配置文件中指定数据库的连接地址。
使用-m cluster参数来执行所有Nacos部署副本中的startup命令。当所有Nacos服务实例都启动成功之后,我们访问这些Nacos实例的控制台就可以看到如图2-11所示的集群运行效果,代表Nacos集群搭建成功。
图2-11 Nacos集群运行效果