专栏首页FoamValue「分享计划」花一天时间学习 Nacos 源码

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

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

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

让我们下周再见。?


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

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

本文分享自微信公众号 - FoamValue(gh_3c635269f459),作者:陈鑫杰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「拥抱开源」注册中心 Nacos

    长久以来,我一直使用着闭源的分布式服务注册组件。简单易用且可靠,只要告诉它“我新增了一个某个服务”、“我要调用某个服务”、“这个服务最高耗时 3000 ms”,...

    FoamValue
  • Netty 主从多线程

    Netty 是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。

    FoamValue
  • Spring Boot 特性之 Banner

    Banner 特性是通过自定义的 banner.txt 文件,替换启动时打印的横幅。除了文字之外,还可以使用 banner.gif,banner.jpg、ban...

    FoamValue
  • nacos之springboot 原

    List-1.2 映射出端口8848,指定mode为standalone,即单机模式

    克虏伯
  • Nacos 修改mysql中默认账号密码

    官方给出一个docker镜像,就不要我们自己制作了。文档地址:https://github.com/nacos-group/nacos-docker,参考Sta...

    用户2235302
  • SpringBoot 整合 Nacos Config 实现配置文件动态更新

    Springboot 2.2.2.RELEASE Nacos config 0.2.7

    Alone88
  • nacos部署使用mysql作为数据库

    Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件,这里我不讲nacos的docker部署,没错,如果你使用官方的方式部署nacos...

    bboysoul
  • nacos部署使用mysql作为数据库

    Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件,这里我不讲nacos的docker部署,没错,如果你使用官方的方式部署nacos...

    bboysoul
  • 1搭建nacos

    nacos的官方仓库地址:https://github.com/alibaba/nacos.git

    DH镔
  • Nacos 修改mysql中默认账号密码

    官方给出一个docker镜像,就不要我们自己制作了。文档地址:https://github.com/nacos-group/nacos-docker,参考Sta...

    码农笔录

扫码关注云+社区

领取腾讯云代金券