快速开始
项目简介
Dante Cloud 国内首个支持阻塞式和响应式服务并行的微服务平台。是采用领域驱动模型(DDD)设计思想,以「高质量代码、低安全漏洞」为核心,完全基于 Spring 生态全域开源技术和 OAuth2.1 协议,高度模块化和组件化设计,支持智能电视、IoT等物联网设备认证,满足国家三级等保要求,支持接口国密数字信封加解密等一系列安全体系的多租户微服务解决方案。独创的可以“一套代码实现微服务和单体两种架构灵活切换”的企业级应用系统。
理念
Dante Cloud 一直秉承着“简洁、高效、包容、务实”的理念,使用微服务领域及周边相关的各类新兴技术或主流技术进行建设,不断地深耕细作、去粗取精、用心打造。目标是构建一款代码质量高、维护投入低、安全防护强
的,可以帮助用户快速跨越架构技术选型、技术研究探索阶段,降低传统项目中因安全漏洞、技术负债、低质代码等潜在隐患所产生的高维护投入,期望像项目名字寓意一样,在行业变革的时期承上启下,助力企业信息化建设和变革的产品。
背景
回顾过往,发现很多工作,特别是很多会占用技术人员大量时间和精力的工作,大多数情况下并不是像技术攻关、新技术研究、业务架构设计、并发性能调优等有挑战性的工作,而往往都是因细节考虑欠缺、代码质量不高、在用技术老旧、欠缺优化迭代、系统难于维护、项目管理不善等问题产生的需要长期投入的、低效、低意义工作。
这也是为什么做 Dante Cloud 的初衷:一方面是以 Dante Cloud 为载体,潜移默化地将过往项目建设的经验教训融入其中,尽可能地帮助使用者规避或者减少无效工作,提升工作效率和质量,有跟多的时间做更有意义的事情;另一方面不断地融合和使用各类新兴技术,帮助使用者尽可能多的了解、学习和运用新技术,让技术不再成为禁锢变为进步和提升的基石。
这也是为什么 Dante Cloud 与其它项目不同:Dante Cloud 并不过分强调常规应用功能的堆叠与丰富化,因为作者认为纯开发工作仅占整个项目建设投入的 20%,减少开发投入、提升开发效率未必就能减少整个项目建设周期剩余80%工作投入。Dante Cloud 的远景目标是可以帮助使用者缩短整个项目的建设周期和减少无意义的工作投入,降低技术债务,提升创新效能,而不仅仅只是在开发效率方面的提升。
架构
[一]Dante Cloud 3.3.X 版本
[1]新特性
Spring Boot
已升级至 3.3.0Spring Authorization Server
已升级至 1.3.0- 全面采用 Java 21,默认开启虚拟线程,以改善阻塞操作的处理降低系统资源的消耗
- 支持传统的
阻塞式
微服务与基于Reactor
和WebFlux
的响应式
微服务同时运行在一套系统之中 - 不强制使用
响应式
方式开发,可根据自身项目对资源吞吐量、资源消耗、特殊功能性能保障的需求,灵活的选择是采用响应式
还是阻塞式
来开发对应的服务。 - 在保持 Dante Cloud 原有
Spring Authorization Server
深度扩展的各种特性的前提下,实现响应式
服务的动态鉴权与现有体系的完全融合(无需在代码中使用@PreAuthorize
写死权限,全部通过后台动态管理) - 向“响应式编程”转变,基于
Reactor
重构大量核心代码,进一步提升本系统代码质量和运行效能 - 重新架构所有核心组件模块,进一步降低各模块的耦合性,减少第三方组件依赖深度,简化各模块使用的复杂度,使用更贴近 Spring Boot 生态官方写法,提升模块组件的可插拔性以及
响应式
和阻塞式
不同环境下自动配置的适配能力 - 实现
响应式
和阻塞式
不同类型服务,Session 共享体系以及自定义 Session 体系的完美融合(谁说微服务就一定用不到 Session :))。 - 新增
GRPC
服务间调用和通信方式,系统核心服务间调用支持OpenFeign
和GRPC
两种方式,可通过修改配置实现两种方式的切换。 - 基于
RSocket
全面重写WebSocket
消息系统,实现WebSocket
的响应式
改造以及RSocket
与 Spring Security 体系的全面集成。支持多实例、跨服务的私信和广播 - 新增 OAuth2 独立客户端,可用于客户端动态注册以及授权码模式
- 新增基于
Loki + Grafana
生态的轻量级日志中心和链路追踪解决方案,使用 OSS 作为数据存储,极大地降低资源需求,可作为原有 Skywalking 和 ELK 重量级体系的备选方案,根据实际需要切换。 - 开放纯手写动态表单功能。可实现BPMN、动态表单、Camunda 流程引擎的串联,实现工作流程运转(目前仅支持简单工作流)
- 开放包含自定义属性面板的 BPMN 在线设计器功能。
- 开放物联网设备认证和管理模块,支持基于 Emqx 的物联网设备通信和管理。
- 开放阿里云内容审核、百度 OCR、环信、Emqx、天眼查、Nacos、PolarisMash等第三方 OpenApi 封装模块
- 前端工程支持 Docker 运行,相关参数可通过配置环境变量修改。已上传至 Docker Hub,可以直接下载运行。
[2]设计答疑
1. 为什么不做“纯血”响应式
响应式固然有其优势所在,但是使用响应式也不得面对一些现实问题:
- 要做纯血响应式,首先要有生态的保证。目前响应式的接受度还并不是很高,很多组件还都不支持响应式。除非有精力将所有用到的不支持的组件改写一遍,否则很难做到纯血,特别是对于微服务系统来说。
- 绝大多数应用都是需要使用数据库的,Java 领域现有的 orm 组件,要么不支持响应式(比如 JPA)、要么支持的不是特别好(比如 Hibernate)、要么需要自己编写的内容太多(比如 R2DBC),所以从投入产出比的角度说目前在数据层面做响应式并不“划算”
所以,还是要具体看应用系统的类型,在条件不具备的情况下没有必要做到纯血响应式
。
2. 响应式可以带来哪些好处
响应式
对阻塞式
的好处,网上有大把的文章介绍,具体就不赘述了。对于实际应用中比较明显的优势:
响应式
资源的利用效能更高,对于高资源消耗的功能,响应式
的优势更突出- 微服务系统往往会需要集成更多内容,特别在数据层面,可能会存在同时使用多种类型数据存储以及数据的流转和迁移,常规事件驱动与响应式的“流”式思维比传统阻塞式更为契合。
- 响应式可以与事件驱动更好的配合。在 Spring 生态中在多个方面都大量使用了事件驱动,而响应式的核心设计思想也与事件驱动殊途同归。
正因为 Dante Cloud 用了很多 Spring Integration 的内容,传统阻塞式方式越用越别扭,才越来越觉得有必要做响应式支持。如果有时间可以好好看看 Spring Integration,也许会为你打开一个新的世界。
3. 学习响应式编程有哪些难点
- 如果基于 Reactor 学习响应式编程,难点和突破点就在于
Flux
和Mono
两个类。把这两个类的方法用透、弄明白,基本上就可以消除所有开发阻碍了。 - 响应式编程最大的难点就是编程思维的转换,因为习惯了阻塞式编程,一时会很难适应
响应式
的流
式开发思维
世上无难事只怕有心人
[二]Dante Cloud 3.X 特性
[1]核心基础依赖便捷切换
- 新增
Spring Cloud Tencent
和Spring Cloud
原生微服务全家桶等两种基础设施支持。 - 新增
Spring Cloud Alibaba
、Spring Cloud Tencent
和Spring Cloud
原生微服务全家桶三种基础设值切换能力,可以以相对便捷的方式切换使用 Alibaba、Tencent、Spring 等基础设施环境。可根据自身实际需求选择,不再局限于只能在某一种基础设施环境中运行。
[2]Spring Authorization Server
全特性支持及扩展
- 基于
Spring Authorization Server
和Spring Data JPA
实现多租户系统架构, 支持 Database 和 Schema 两种模式。 - 基于
Spring Data JPA
,重新构建Spring Authorization Server
基础数据存储代码,替代原有 JDBC 数据访问方式,破除Spring Authorization Server
原有数据存储局限,扩展为更符合实际应用的方式和设计。 - 基于
Spring Authorization Server
,在 OAuth 2.1 规范基础之上,增加自定义Resource Ownership Password
(密码) 认证模式,以兼容现有基于 OAuth 2 规范的、前后端分离的应用,支持Refresh Token
的使用。 - 基于
Spring Authorization Server
,在 OAuth 2.1 规范基础之上,增加自定义Social Credentials
(社会化登录) 认证模式,支持手机短信验证码、微信小程序、基于JustAuth
的第三方应用登录, 支持Refresh Token
的使用。 - 扩展
Spring Authorization Server
默认的Client Credentials
模式,实现真正的使用 Scope 权限对接口进行验证。 增加客户端 Scope 的权限配置功能,并与已有的用户权限体系解耦 - 支持
Spring Authorization Server
Authorization Code PKCE
认证模式 - 在
Spring Authorization Server
的标准的JWT Token
加密校验方式外,支持基于自定义证书的JWT Token
加密校验方式,可通过配置动态修改。 - 支持
Opaque Token
(不透明令牌) 格式及校验方式,降低JWT Token
被捕获解析的风险。可通过修改配置参数,设置默认 Token 格式是采用Opaque Token
格式还是JWT Token
格式。 - 全面支持
OpenID Connect
(OIDC) 协议,系统使用时可根据使用需求,通过前端开关配置,快速切换 OIDC 模式和传统 OAuth2 模式 - 深度扩展
Authorization Code
、Resource Ownership Password
、Social Credentials
几种模式,全面融合IdToken
、Opaque Token
、JWT Token
与现有权限体系,同时提供IdToken
和 自定义 Token 扩展两种无须二次请求的用户信息传递方式,减少用户信息的频繁请求。 - 自定义
Spring Authorization Server
授权码模式登录认证页面和授权确认页面,授权码模式登录采用数据加密传输。支持多种验证码类型,暂不支持行为验证码。 - 新增基于
Spring Authorization Server
的、支持智能电视、IoT等物联网设备认证模式 - 无须在代码中配置
Spring Security
权限注解以及权限方法,即可实现接口鉴权以及权限的动态修改。采用分布式鉴权方案,规避 Gateway 统一鉴权的压力以及重复鉴权问题 - OAuth2 UserDetails 核心数据支持直连数据库获取和 Feign 远程调用两种模式。OAuth2 直连数据库模式性能更优,Feign 访问远程调用可扩展性更强。可通过配置动态修改采用策略方式。
[3]全体系化应用和开发特性集成
- 微服务架构全体系 Session 共享,实现 Spring Authorization Server、多实例服务、WebSocket、自定义 Session 以及大前端 Session 的统一。
微服务架构下的 Session 可以选择不用,但是不能没有
。 - 混合国密
SM2
(非对称) 和SM4
(对称加密) 算法,实现基于数字信封技术的秘钥动态生成加密传输。利用“一人一码机制”,实现前后端数据进行动态加密传输与。Spring Authorization Server OAuth 2.1 授权模式深度融合,构建统一体系的数据传输加密。 - 全面整合
@PreAuthorize
注解权限与URL
权限,通过后端动态配置,无须在代码中配置Spring Security
权限注解以及权限方法,可实现接口鉴权以及权限的统一管理和动态修改 - 融合 Spring Cloud Stream 和 WebSocket,以优雅的方式实现 WebSocket 服务多实例环境下,点对点、广播消息跨实例推送,在线用户实时统计,完美支持 WebSocket 集群化应用。
- 借鉴 JPA 标准化设计思想,提取和抽象 OSS 标准化操作,形成统一的 Java OSS API 规范。封装可操作任意厂商的、统一的 REST API,构建定义统一、动态实现的应用模式(类似于 Hibernate 是 JPA 的一种实现,Hibernate 以 Dialect 方式支持不同的数据库一样),在不修改代码的情况下通过修改配置实现 OSS 的无缝切换和迁移
- 自研基于
JetCache
分布式两级缓存,完美实现 JPA Hibernate 二级缓存,支持各类查询数据缓存以及 JPA@ManyToMany
,@ManyToOne
等关联查询。完美解决 Spring Cache 仅使用本地缓存、创建 Key 繁琐和分页数据无法更新的问题。支持多实例服务本地缓存和远程缓存数据同步,同时支持 Mybatis Plus 二级缓存 - 平台统一错误处理,支持自定义错误码体系,有效集成
OAuth2
、Spring Validation
等多方错误体系并有机整合 HTTP 状态码。采用 Customizer 模式,采用错误码自动计算和创建模式,支持代码模块级错误码灵活定义扩展。响应结果更加多样灵活,反馈结果也更加人性化,便于理解和定位问题。 - 全体系 OkHttp 、HttpClient 统一化集成,实现 OkHttp 、HttpClient 与 RestTemplate 、Openfeign 一体化融合。统一使用 Feign 配置参数,对 OkHttp 、HttpClient 进行参数设定,可策略化选择设置使用 OkHttp 或 HttpClient 作为 RestTemplate 、Openfeign 统一的基础 HttpClient
[4]采用 pnpm monorepo
重构前端
- 未使用任何流行开源模版,使用全新技术栈,完全纯"手写"全新前端工程。
- 借鉴参考流行开源版本的使用和设计,新版前端界面风格和操作习惯尽量与当前流行方式统一。
- 充份使用 Typescript 语言特性,解决大量类型校验问题,尽可能规避 "any" 式的 Typescript 编程语言使用方式。
- 充份使用 Composition Api 和 Hooks 等 Vue3 框架新版特性进行代码编写。
- 充份利用 Component、Hooks 以及 Typescript 面向对象等特性,抽取通用组件和代码,尽可能降低工程重复代码。
- 对较多 Quasar 基础组件和应用功能组件进行封装,以方便代码的统一修改维护和开发使用。
- 对生产模式下,对基于 Vite3 的工程打包进行深度性能优化。
- 提供以 docker-compose 方式,对工程生产代码进行容器化打包和部署。
- 该版本基于 pnpm,采用 monorepo 模式对前端工程进行重构。构建 monorepo 版本前端,是为扩展更多功能、增加应用级功能做铺垫
- 抽取 utils、components、apis、bpmn-designer 等相关代码,形成共享模块。
- 共享模块已进行优化配置,可编译成独立的组件,单独以组件形式进行发布。
- 代码以共享模块的方式进行单独维护开发,降低现有工程代码复杂度,便于后续功能的扩展和代码的复用。
[三]技术选型
[1]后端核心技术栈
(1)Spring 相关核心技术及版本
组件 | 版本 |
---|---|
Spring Boot | 3.4.0 |
Spring Cloud | 2024.0.0 |
Spring Cloud Alibaba | 2023.0.1.2 |
Spring Cloud Tencent | 1.14.0-2023.0.0 |
Spring Authorization Server | 1.4.0 |
Spring Boot Admin | 3.4.1 |
Nacos | 2.4.3 |
Sentinel | 1.8.8 |
Seata | 2.1.0 |
(2)涉及的相关的技术
- 服务注册&发现和配置中心:
Alibaba Nacos
&Tencent PolarisMash
&Zookeeper
- 服务消费:
Spring Cloud OpenFeign
&GRPC
- 负载均衡:
Spring Cloud Loadbalancer
- 服务熔断&降级&限流:
Alibaba Sentinel
&Tencent PolarisMash
- API 网关:
Spring Cloud Gateway
- 服务监控:
Spring Boot Admin
&Prometheus + Grafana
- 消息队列:
Spring Cloud Bus
默认Kafka
适配RabbitMQ
- 链路跟踪:
Skywalking
&Micrometer + Zipkin
- 分布式事务:
Seata
- 数据库:
Postgresql
,MySQL
,Oracle
... - 数据缓存:
JetCache
多级缓存 (Redis
+Caffeine
) - 持久层框架:
Spring Data Jpa
&Mybatis Plus
- JSON 序列化:
Jackson
&FastJson
- 文件服务:阿里云 OSS/
Minio
- 数据调试:
p6spy
- 在线文档:
Springdoc
+Swagger 3
+OpenAPI
- 日志中心:
ELK
&loki + Minio
- 日志收集:
Logstash Logback Encoder
& &loki-logback-appender
- 数据同步:
Debezimu
- 外部集成:
JustAuth
,WxJava
,多种短信 API - 消息系统:
WebSocket + Stomp
&RSocket
- 工作流引擎:
Camunda
[2]前端核心技术栈
- Vue 3
- Vite 5
- Typescript 5
- Pinia 2
- Vue-router 4
- Axios
- Quasar 2
- Bpmn.js
- Pnpm
- RSocket.js
[四] 核心组件库
新版核心组件库更名为 Stirrup
(马镫)
为什么起名为 Stirrup
(马镫)
在古代,骑马作战时,骑士们需要用双手紧握缰绳以控制马匹,这就无法释放双手来使用武器或进行其他操作。在这样的背景下,马镫的出现为骑乘者提供了一个稳定的支撑点,使得骑士能够解放双手,更好地发挥战斗力。
项目更名为马镫,寓意赋能开发人员和企业,从常规的基础工作中解放出来,让其可以将更多的精力投入到设计开发更有创意和创新的产品中去
herodotus-stirrup
├── dependencies -- 工程Maven顶级依赖,统一控制版本和依赖
├── readme -- README 相关素材放置目录
├── stirrup-assistant -- 辅助功能模块
├ ├── assistant-sdk-access -- 外部登录接入辅助功能模块
├ ├── assistant-sdk-captcha -- 验证码辅助功能模块
├ ├── assistant-sdk-ip2region -- 离线IP地址定位辅助功能模块
├ ├── assistant-sdk-oss -- AWS SDK V2 对象存储辅助功能模块
├ └── herodotus-servlet-service-archetype -- 阻塞式类型服务创建 Archetype
├── stirrup-cache -- 缓存模块
├ ├── cache-core -- 缓存通用代码模块
├ ├── cache-module-caffeine -- Caffeine 缓存功能封装模块
├ ├── cache-module-jetcache -- JetCache 缓存功能封装模块
├ ├── cache-module-redis -- Redis 缓存功能封装模块
├ └── cache-module-redisson -- Redisson 缓存功能封装模块
├── stirrup-core -- 基础核心模块
├ ├── core-autoconfigure -- 核心自动配置模块
├ ├── core-definition -- 核心定义模块
├ ├── core-foundation -- 基础通用模块
├ └── core-identity -- 身份认证通用模块
├── stirrup-data -- 数据访问模块
├ ├── data-core -- 数据访问通用代码模块
├ ├── data-module-crud -- JPA 增删改查基础操作封装模块
├ ├── data-module-hibernate -- Hibernate 扩展模块
├ └── data-module-jpa -- JPA 扩展配置模块
├── stirrup-grpc -- GRPC定义模块
├ ├── grpc-module-permission -- GRPC用户权限定义模块
├ └── grpc-module-user -- GRPC用户定义模块
├── stirrup-logic -- 系统内置功能业务逻辑模块
├ ├── logic-module-bpmn -- 工作流业务逻辑模块
├ ├── logic-module-client-jpa -- Spring Security OAuth2 Client 基于 JPA 的存储功能逻辑模块
├ ├── logic-module-identity -- 身份认证功能业务逻辑模块
├ ├── logic-module-message -- 系统消息业务逻辑模块
├ ├── logic-module-sas-jpa -- Spring Authorization Server 基于 JPA 的存储功能逻辑模块
├ └── logic-module-upms -- UPMS 业务逻辑模块
├── stirrup-message -- 消息模块
├ ├── message-autoconfigure -- 消息自动配置模块
├ ├── message-core -- 消息通用代码模块
├ ├── message-module-websocket-reactive -- 基于 Reactive 环境下的 Websocket 功能封装模块
├ └── message-module-websocket-servlet -- 基于 Servlet 环境下的 Websocket 功能封装模块
├── stirrup-nosql -- 非结构化数据存储模块
├ ├── nosql-module-cassandra -- Cassandra 封装模块
├ ├── nosql-module-clickhouse -- ClickHouse 封装模块
├ ├── nosql-module-influxdb1 -- InfluxDB 1.X 封装模块
├ ├── nosql-module-influxdb2 -- InfluxDB 2.X 封装模块
├ └── nosql-module-tdengine -- TDengine 封装模块
├── stirrup-oauth2 -- OAuth2 认证模块
├ ├── oauth2-authentication-autoconfigure -- OAuth2 授权服务器基础内容自动配置模块
├ ├── oauth2-authorization-autoconfigure -- OAuth2 资源服务器基础内容自动配置模块
├ ├── oauth2-core -- OAuth2 通用代码模块
├ ├── oauth2-core-authentication -- OAuth2 认证通用代码模块
├ ├── oauth2-module-authentication -- Spring Authorization Server 授权服务器核心功能封装模块
├ ├── oauth2-module-authorization -- Spring Authorization Server 资源服务器核心功能封装模块
├ ├── oauth2-module-client -- Spring Security OAuth2 Client 核心功能封装模块
├ └── oauth2-module-enhance -- Spring Authorization Server 功能扩展模块
├── stirrup-openapi -- 第三方 OpenApi 封装模块
├ ├── openapi-core -- Openapi 通用代码模块
├ ├── openapi-module-aliyun -- Aliyun Open API 封装集成模块(当前仅包含内容审核)
├ ├── openapi-module-baidu -- Baidu Open API 封装集成模块(当前仅包含OCR)
├ ├── openapi-module-easemob -- 环信 Open API 封装集成模块
├ ├── openapi-module-emqx -- Emqx Open API 封装集成模块
├ ├── openapi-module-nacos -- Nacos Open API 封装集成模块
├ ├── openapi-module-polaris -- Polaris Open API 封装集成模块
├ └── openapi-module-tianyan -- 天眼查 Open API 封装集成模块
├── stirrup-rest -- 系统内置功能 REST 接口模块
├ ├── rest-module-oss -- 对象存储功能兼容 Reactive 和 Servlet 环境 REST 接口模块
├ ├── rest-module-reactive-message -- 消息功能 Reactive 环境 REST 接口模块
├ ├── rest-module-reactive-nacos -- Nacos 管理功能 Reactive 环境 REST 接口模块
├ ├── rest-module-servlet-identity -- 身份认证功能 Servlet 环境 REST 接口模块
├ ├── rest-module-servlet-message -- 消息功能 Servlet 环境 REST 接口模块
├ └── rest-module-servlet-upms -- UPMS 功能 Servlet 环境 REST 接口模块
├── stirrup-starter -- Starters
├ ├── cache-spring-boot-starter -- 缓存 Starter
├ ├── captcha-spring-boot-starter -- 验证码 Starter
├ ├── data-spring-boot-starter -- 数据访问 Starter
├ ├── facility-alibaba-spring-boot-starter -- 面向 Spring Cloud Alibaba 的微服务基础设施适配模块
├ ├── facility-gateway-spring-boot-starter -- Alibaba Sentinel 在 Gateway 环境下基础设施适配模块
├ ├── facility-kafka-spring-boot-starter -- 基于 Kafka 的消息事件 Starter
├ ├── facility-original-spring-boot-starter -- 面向 Spring Cloud 原生全家桶的微服务基础设施适配模块
├ ├── facility-rabbitmaq-spring-boot-starter -- 基于 Rabbitmq 的消息事件 Starter
├ ├── facility-tencent-spring-boot-starter -- 面向 Spring Cloud Tencent 的微服务基础设施适配模块
├ ├── logging-spring-boot-starter -- 日志收集和聚合配置 Starter
├ ├── message-mail-sring-boot-starter -- 电子邮件消息 Starter
├ ├── message-mqtt-spring-boot-starter -- Mqtt Starter
├ ├── micrometer-spring-boot-starter -- 链路追踪及度量配置 Starter
├ ├── nosql-spring-boot-starter -- NoSQL 相关组件配置 Starter
├ ├── oauth2-client-spring-boot-starter -- Spring Security OAuth2 客户端 Starter
├ ├── oss-spring-boot-starter -- 基于 AWS SDK V2 兼容 Reactive 和 Servlet 环境的对象存储Starter
├ ├── reactive-container-spring-boot-starter -- Reactive 容器基础配置 Starter
├ ├── reactive-message-spring-boot-starter -- Reactive 环境消息模块配置 Starter
├ ├── servlet-container-spring-boot-starter -- Servlet 容器基础配置 Starter
├ ├── servlet-message-spring-boot-starter -- Servlet 环境消息模块配置 Starter
├ ├── webmvc-spring-boot-starter -- WebMvc 类型应用配置 Starter
├ └── webflux-spring-boot-starter -- WebFlux 类型应用配置 Starter
├── stirrup-transform -- 数据迁移转换集成模块
├ ├── transform-module-bpmn -- 系统用户体系与 BPMN 用户体系数据同步模块
├ └── transform-module-emqx -- 基于 Spring Integration 的 Emqx 数据集成模块
├── stirrup-web -- Web 模块
├ ├── web-core -- Web 通用代码模块
├ ├── web-module-api -- Rest 接口通用代码模块
├ ├── web-module-reactive -- Reactive 环境 Web 服务专有基础代码模块
├ ├── web-module-service -- 微服务通用代码模块
└── └── web-module-servlet -- Servlet 环境 Web 服务专有基础代码模块