前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「分享计划」花一天时间学习 Nacos 源码

「分享计划」花一天时间学习 Nacos 源码

作者头像
FoamValue
发布2020-09-16 14:42:15
7450
发布2020-09-16 14:42:15
举报
文章被收录于专栏:FoamValueFoamValue

—— 封面来自腾讯云 对技术人来说,把时间挤出来学习。或许能够让思维短暂的离开,那令人烦恼的生活。

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 还有很长一段路需要走,加油!奥利给!

让我们下周再见。?


感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。

文章有帮助可以点个「在看」或「分享」,都是支持,我都喜欢!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FoamValue 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档