—— 封面来自腾讯云
对技术人来说,把时间挤出来学习。或许能够让思维短暂的离开,那令人烦恼的生活。
Nacos 是我最近几周在学习的内容,对于 Nacos 给我的感觉是:
首先,它不是一个成熟的产品,因为它有很多的功能列表等待实现。
其次,它是一个成功的产品,因为它有许多成功的案例。
最后,通过对它的学习,还是能够感受到一个自我提升。
一、架构介绍
获取一下完整的项目代码 git clone https://github.com/alibaba/nacos.git,导入到 Eclipse 就可以开始本次的源码学习之旅。如图:
完整的项目架构图
Nacos 是一个典型的 Maven 架构项目,在导入的过程中 Eclipse 会自动的联网下载需要的 jar。开源的第三方还可以下载对应的 sources 源代码,这对于运行调试有很大帮助。
主要的文件目录与作用:
nacos-address 地址服务器
nacos-api HTTP 接口
nacos-auth 安全认证管理
nacos-client Java 客户端
nacos-cmbd 元数据管理
nacos-common 工具管理
nacos-config 配置管理
nacos-consistency 一致性管理
nacos-console 控制台管理
nacos-core Nacos 内核
nacos-distribution 配置启动管理
nacos-example 示例工程
nacos-lstio lstio 服务网格
nacos-naming 服务注册发现
nacos-test 测试工程
style 社区代码风格文件
官方提供的逻辑架构是这样的:
逻辑架构组件图
从主要的文件目录、逻辑架构可以看出,Nacos 核心骨架包括了 nacos-core 组件、元数据、服务管理组件、配置管理组件、元数据管理组件、OpenAPI。基于核心骨架又添加了易于管理与第三方接入的 Console、SDK、Agent、CLI 模块,以及各种插件模块。
二、核心骨架
核心骨架对应的文件目录包括了:
nacos-core, nacos-common, nacos-consistency, nacos-auth, nacos-api, nacos-naming, nacos-address, nacos-cmbd。
1. nacos-api
首先是目录结构、POM 文件的引用依赖。
POM 文件在排除不太重要的之外,使用了三种重要的第三方库。分别是用来序列化和反序列化的 jackson、用于基础通用操作的 commons-lang,以及用于处理并发操作的 guava。
NacosFactory.java 提供了六种工厂方法分别生产 ConfigService、NamingService、NamingMaintainService 接口对象。
以 ConfigService 接口对象为例,它提供了八个接口方法。分别是获取 config,获取 config 并注册监听,注册、删除监听,发布 、移除 config,关闭服务。(完整的接口实现在 nacos-client 项目,篇幅原因不详细展开。)
也就是说,nacos-api 是一个核心项目,它没有提供具体的实现功能,只是定义了大量的 nacos 核心注解、接口、工厂类、异常类等等。
2. nacos-common
首先是目录结构、POM 文件的引用依赖。
POM 文件在排除不太重要的之外,使用了三种重要的第三方库。分别是用来序列化和反序列化的 jackson、用于基础通用 I/O 操作的 commons-io,以及用于处理异步 HTTP 操作的 httpasyncclient。
nacos-common 提供了线程工厂类与线程池管理类、封装了异步 HTTP 调用、通知消息与监听、任务创建与任务管理等工具类。
3. nacos-common
首先是目录结构、POM 文件的引用依赖。
POM 文件在排除不太重要的之外,使用了三种重要的第三方库。分别是元组类型工具 javatuples、二进制格式传输服务框架 hessian、序列化与反序列化工具 protobuf-java。
nacos-consisitency 定义了两种协议 APProtocol.java 和 CPProtocol.java,通过 protobuff 实现了 GetRequest、Response、Log 的创建者工具。
小知识点:
分布式系统有一个重要特性,也就是 CAP。其中,三个元素最多只能同时实现两个,不可能三者兼顾。因为分布式系统的分区容错性最基本的要求,所以只能在 C 与 A 之间进行选择。是牺牲强一致性来满足高可用性,还是牺牲高可用性来满足强一致性。
其中:
C:一致性 Consistency
A:可用性 Availability
P:分区容错性 Partition
4. nacos-auth
首先是目录结构、POM 文件的引用依赖。
POM 文件在排除不太重要的之外,使用了三种重要的第三方库。分别是 spring-boot-starter、tomcat-embed-core、jjwt-api。
这是一个定义了 auth 认证基本参数的 spring-boot-starter 项目。
5. nacos-core
首先是目录结构、POM 文件的引用依赖。
这是 nacos 最核心的项目工程,引用了以上四个小项目。分别是 nacos-api、nacos-common、nacos-consistency、nacao-auth。
AuthConfig.java 使用 @Configuration、@Bean 注解实现 FilterRegistrationBean 注入,对 “/*” 请求启用 AuthFilter.java 进行 auth 认证。
DistroTaskEngineHolder.java 使用 @Component 实现了对 DistroDelayTaskExecuteEngine、DistroExecuteWorkersManager 的初始化。
JRaftProtocol.java 使用了 JRaft 算法实现了 CP 协议。
nacos-core 还是有很多晦涩难懂的地方,由于个人实力有限,本周的源码学习就学到这里啦~~
三、Example
举一个官方的案例
通过 NacosFactory 的方法创建一个 ConfigService 对象。
调用 ConfigService 创建监听的接口,对 configInfo 参数进行监听,同时预留获取执行者的监听方法。
通过 ConfigService 获取、发布、删除 Config 配置。
四、总结
简单梳理了 Nacos 源码,发现 alibaba 开源的产品底层也是很多的开源第三方库。四舍五入约等于“善用开源第三方库就能创造一个产品”
30个 Branch、330个 Issues、10个 Pull Request、2752次 Commit。
Nacos 还有很长一段路需要走,加油!奥利给!
让我们下周再见。?
感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。
文章有帮助可以点个「在看」或「分享」,都是支持,我都喜欢!