写点什么

Nop 平台中的模块依赖关系

作者:canonical
  • 2023-06-25
    北京
  • 本文字数:3515 字

    阅读完需:约 12 分钟

Nop 平台的模块虽然很多,但是因为整体设计采用了依赖注入、动态加载等方式,各个模块的耦合度很低,大部分模块都可以独立使用,并且可以脱离 Nop 平台与其他框架集成使用。

一. 核心模块

Nop 平台最核心的模块是 nop-core、nop-xlang 这两个模块。所谓的可逆计算原理的具体实现都集中在这两个模块中



  • nop-api-core 包含了整个平台对内、对外都需要共享的全局对象和交互消息。例如平台中使用的所有注解、API 调用用到的公共 Bean(如 ApiRequest, ApiResponse, PageBean),NopException 统一异常处理类,IContext 全局上下文,IUserContext 用户上下文等。当第三方框架需要调用 Nop 平台提供的服务接口时一般会引用这个模块。

  • nop-commons 提供了 StringHelper, FileHelper 等帮助函数,并提供了大量的与业务无关的数据结构封装,例如 ThreadPoolExecutor, LocalCache,TextScanner 等。

  • nop-core 负责提供其他模块都可能会用到的核心模型对象以及全局的模型缓存和依赖跟踪机制。例如基本的 Tree、Table、Graph、Filter、FieldSelection 结构定义和相关算法实现,XML 和 JSON 文件解析(没有使用第三方解析库),差量化的虚拟文件系统,全局模型加载器,以及字典表、国际化消息、异常码映射等。为了便于支持 GraalVM,core 模块还提供了自制的泛型类型定义以及反射调用机制(直接使用 Java 反射性能较低)。

  • nop-xlang 提供 Nop 平台最核心的 XLang 语言以及差量合并算法的实现。XLang 语言是一个统称,它包括了 Nop 平台内置的一系列自定义领域语言,例如 XDef 元模型定义语言,XMeta 对象结构定义语言,Xpl 面向元编程的模板语言, XScript 支持宏函数的脚本语言, XPath 路径查找语言,XTransform 结构转换语言等。参见xlang

  • nop-codegen 提供了可以与 maven 打包工具集成在一起的代码生成器。XLang 内置的元编程机制可以看作是一种语言内置的代码生成器,而 codegen 则提供了外置的、数据驱动的差量化代码生成器,参见codegen.md。nop-codegen 模块的 templates 目录下包含了大量内置的代码生成模板,比如/templates/orm 用于根据数据模型来生成全套的前后端增删改查代码。这些代码生成模板可能需要解析 DSL 模型,这时就需要引入对应的元模型和 Excel 解析模型。比如为了根据 g4 文件定义生成 Antlr AST 解析器就需要引入 nop-antlr4 依赖,参见antlr.md。为了解析 Excel 数据模型,我们需要引入 nop-orm-model 依赖,并使用 nop-xdefs 模块中的 orm.xdef 元模型定义。


nop-xlang 的开发是一个有趣的自举过程。因为 codegen 需要使用 XLang 中的 Xpl 和 XScript 语言,而 XScript 语言的解析器又是根据 antlr 语法定义模型自动生成的,所以实际开发过程采用了如下方式:


  1. 先手工编写一个简易的 XScript 解析器,使得它可以支持 antlr 代码生成模板的运行

  2. 编写代码生成模板,根据 antlr 模型生成 XScript 解析器

  3. 用自动生成的解析器覆盖手工编写的 XScript 解析器


nop-codegen 工具可以独立于 Nop 平台被使用,生成其他框架或者其他语言的代码,比如生成 mybatis 代码,vue 代码等,而且可以将 CodeGenerator 与 FileWatcher 结合在一起,当发现某个目录下的模型文件发生变动时,就自动将依赖于该模型的所有文件重新生成一遍

二. GraphQL 引擎


Nop 平台的后端服务使用 NopGraphQL 引擎实现。NopGraphQL 引擎没有使用 graphql-java 包,是完全从零开始实现的一个新的 GraphQL 引擎。相比于 graphql-java,它充分利用了可逆计算原理,极大减少了需要手工编写的代码量,提高了运行时性能。此外,NopGraphQL 支持模型动态加载,支持 REST 调用接口与 GraphQL 调用接口。


  • nop-graphql-core 提供了 GraphQL 的执行引擎,协调多个 DataFetcher 并行获取数据,并且提供了 RPC 调用接口封装

  • nop-graphql-orm 提供了使用 NopORM 引擎实现的各种 DataFetcher

  • nop-dao 提供了 JDBC 封装、事务封装以及数据库 Dialect 机制

  • nop-orm-model 提供了实体模型定义,而 nop-orm-eql 提供了 EQL 语法的解析器。这两个模块可以独立于 nop-orm 引擎被使用

  • nop-orm 实现了一个包含 Hibernate 和 MyBatis 所有核心功能的 ORM 引擎

  • nop-biz 中的BizObjectManager提供了IGraphQLSchemaLoader接口的实现,将 GraphQL 调用映射到 BizModel 的方法上。这个过程类似于 REST 框架将 URL 链接映射到 Controler 类的方法上,具体参见graphql-java.md。nop-biz 模块内置了CRUD服务字典表服务

  • nop-biz 通过 nop-fsm 内置了有限自动机机制,可以描述某些简单的业务流程

  • nop-biz 并不强依赖于 NopIoC 容器,但是依赖 nop-ioc 模块可以利用模块内置的 beans.xml 配置。

三. 分布式 RPC 框架


Nop 平台在 GraphQL 引擎的基础上建立了分布式 RPC 机制,参见rpc-design.md


  • nop-cluster-core 提供了负载均衡、服务发现、Leader 选举等集群相关的支持机制

  • nop-rpc-http 将IHttpClient接口封装成了 IRpcService 接口(RPC 服务的内部实现接口)

  • nop-rpc-cluster 提供了广播式 RPC 调用和负载均衡 RPC 调用


NopIoC 内置了类似 springboot 的 autoconfig 机制,因此只要引入 nop-cluster-nacos 等模块就会自动初始化相关的 bean。


  • nop-cluster-nacos 基于 Alibaba Nacos 服务提供了服务注册发现机制

  • nop-cluster-sentinel 基于 Alibaba Sentinel 服务实现了熔断限流机制

  • nop-config 提供了动态配置更新机制

  • nop-biz 通过 GraphQL 引擎实现了 RPC 服务接口

四. 应用入口


  • nop-boot 模块中的 NopApplication 类类似 springboot 中 SpringApplication 类的作用,负责整个应用的创建和初始化工作

  • nop-quarkus-web-starter 类似于 springboot 中 starter 模块的作用,应用只要引入 nop-quarks-web-starter 模块即可将 Nop 平台与 Quarkus 框架集成在一起。

  • nop-spring-web-starter 实现了 Nop 平台与 Spring 框架的集成。

五. 应用模块


  • nop-web-site 中包含了 Nop 平台的前端框架代码,它是 nop-chaos 项目打包的产物

  • nop-web-amis-editor 包含了 AMIS 可视化设计器的代码


一般通过 Excel 数据模型生成的代码会分成几个子模块:dao 模块提供实体定义和 Mapper 定义,service 模块提供 GraphQL 服务,web 模块提供前端 View 模型和 AMIS 页面定义。一般的业务应用会引入 nop-sys-web 和 nop-auth-web。


  • nop-sys 模块提供字典表、系统序列号等系统表相关的后端服务和前端页面

  • nop-auth 模块提供用户角色权限控制相关的后端服务和前端页面


Nop 平台整体设计采用了可分可合的灵活组织形式。初始代码生成时对于每一个 Excel 数据模型,我们会生成一个 app 模块,它引用了本模型对应的 service 和 web 子模块,例如 nop-auth-app 引用了 nop-auth-web 和 nop-auth-service。在开发调试的过程中,我们可以使用 nop-auth-app 模块作为微服务单独启动,通过内置的 sso 机制即可将多个微服务集成为一个整体应用系统。


除此之外,我们也可以在一个应用中引用所有模块的 web 和 service 子模块,从而构成一个单体应用,例如 nop-quarkus-demo 模块中的做法。

六. 报表引擎


NopReport 是一个采用 Excel 作为可视化设计器的支持中国式报表的报表引擎,使用方法参见report.md


  • nop-report-core 实现了报表展开算法、报表表达式、报表函数等核心机制

  • nop-ooxml-xlsx 提供了 Excel 文件解析和保存功能,它的实现没有使用 apache poi 包或者其他的第三方软件包,而是直接使用 XML 解析器解析 Excel 原始文件,因此它的代码总量很小,可以嵌入到 Android 平台中使用

  • nop-excel 提供了 ExcelWorkbook 模型对象,利用 workbook.xdef 元模型,可以自动实现 XML 格式的 DSL 与 ExcelWorkbook 对象之间的双向转换。因此 ExcelWorkbook 作为领域模型是脱离 Excel 软件独立存在的。

  • nop-ooxml-docx 提供了可以进行可视化编辑的 Word 模板机制,具体使用参见word-temlate.md

七. 自动化测试框架


Nop 平台的自动化测试框架原则上是一种通用设计,不依赖于 JUnit 测试框架。


  • nop-autotest-core 提供了框架中立的自动化测试支持,它与 nop-orm 引擎集成在一起,可以自动录制 ORM 引擎读取和修改的数据,并自动利用录制数据来初始化数据库,并自动校验测试用例执行结果与录制结果相匹配

  • nop-match 提供基于前缀引导语法的结果匹配校验算法

  • nop-autotest-junit 提供 JUnit 框架集成所需的封装,并和 nop-ioc、nop-config 模块集成在一起,简化自动化测试用例的配置和使用

八. IDEA 插件


  • nop-idea-plugin 插件基于 xdef 元模型实现统一的 DSL 语法提示、校验、链接跳转、端点调试等功能

  • nop-xlang-debugger 提供断点调试支持,它的内部实现使用了一个基于 socket 的简单 RPC 接口

  • 在被调试的应用程序中也要引入 nop-xlang-debugger 模块依赖。因为调试的基本原理是应用启动的时候打开一个 socket 监听端口,然后 IDEA 调试器链接到这个端口上发送调试指令。

九. 命令行工具


nop-cli 命令行工具聚合了一批可以独立使用的功能,具体参见cli.md


  • gen 指令需要用到 nop-codegen 模块来执行代码生成

  • reverse-db 指令需要用到 nop-dbtool 模块从数据库中逆向分析数据表定义,然后转换为 nop-orm 模块中定义的实体对象模型,最后利用 nop-report 模块提供的报表导出功能将实体对象模型保存到 Excel 文件中


发布于: 刚刚阅读数: 2
用户头像

canonical

关注

还未添加个人签名 2022-08-30 加入

还未添加个人简介

评论

发布
暂无评论
Nop平台中的模块依赖关系_开源_canonical_InfoQ写作社区