服务端模块化架构设计 2.0|项目构建 + 代码生成「插件篇」

我正在参加「掘金·启航计划」

本专栏 将通过以下几块内容来搭建一个 模块化:可以根据项目的功能需求和体量进行任意模块的组合或扩展 的后端服务

项目结构与模块化构建思路

RESTful与API设计&管理

网关路由模块化支持与条件配置

DDD领域驱动设计与业务模块化(概念与理解)

DDD领域驱动设计与业务模块化(落地与实现)

DDD领域驱动设计与业务模块化(薛定谔模型)

DDD领域驱动设计与业务模块化(优化与重构)

RPC模块化设计与分布式事务

v2.0:项目结构优化升级

v2.0:项目构建+代码生成「插件篇」(本文)

v2.0:扩展模块实现技术解耦

未完待续……

在上一篇文章v2.0:项目结构优化升级中,我们将项目的结构进行了优化,优化之后的项目结构如下

项目结构v2.png

同时还遗留了一个问题,那就是当前的项目结构已经比较复杂了,手动创建的难度较高,所以我写了一个插件来一键生成

简单说明

考虑到可能有读者是第一次看这个专栏,所以我还是先简单介绍一下,详细的内容大家可以看我之前的专栏文章

这里模块化的设想其实就是可插拔的功能模块,如果需要这个功能,就把这个模块用GradleMaven的方式编译进来,如果不需要,去掉对应的依赖就行了,避免改动代码,因为一旦涉及到代码改动的话,就会变得“改不断,理还乱”

当然了,需要达到每个模块都能够任意拆卸的程度其实并不简单,所以我借鉴了DDD的思想来达成这个目的,专栏中也有这一块的内容,另外后续也会再写一篇针对DDD优化的文章

所以当我们把所有模块都编译进来的时候,那么就是一个单体应用了,如果把多个模块分开编译,那么就变成了微服务

以我们juejin项目的三个模块(用户,沸点,通知)为例:

在最开始的时候,我们可以将这三个模块打包成一个服务,作为单体应用来运行,适合项目前期体量较小的情况

之后,当我们发现沸点的流量越来越大,就可以将沸点模块拆分出来作为单独的一个服务方便扩容,用户模块和通知模块打包在一起作为另一个服务,这样就从单体应用变成了微服务

注:从单体应用到微服务的切换是不需要修改代码的

插件

先吐槽一下,这插件开发可真不是人干的事,各种文档讲不清楚,各种方法没有注释,各种接口不断更改,只能自己一点一点摸索

那么接下来就是今天的重头戏

插件安装

直接在插件市场搜索Concept Cloud就行啦

plugin.png

需要注意支持的版本在2021.3-2023.1

项目生成

File -> New -> Project -> Concept Cloud

就在新建项目的选项里,会有一个Concept Cloud的项目

plugin-project-create1.png

需要注意的是Server URL这个路径是需要访问Github的,而且构建项目的时候会下载Gradle,所以大家记得先配置好网络

如果真的访问不了,可以将这个路径改成https://cdn.jsdelivr.net/gh/Linyuzai/concept/concept-cloud/pluginew

其他的参数和我们平时创建项目的时候一样,就是jdk至少需要1.8,这里我没有过滤,大家选择的时候需要注意一下

目前只实现了Java + Gradle的方式构建

可能有读者要问了,为什么不支持kotlinMaven

其实支持kotlin的话并不难,就是麻烦一点,相当于重新写一套kt的代码,而我比较懒(bushi

Maven的话说实话就有点麻烦了,因为Gradle支持这样的操作

dependencies {

    if (project.name == 'xxxx') {
        compile 'xxxx:xxxx'
    }
    
    compile 'xxxx:xxxx'
}

Gradle使用Groovy或者Kotlin作为脚本语言,可以在任意地方添加自己的代码逻辑,如果看过之前的专栏文章就会知道,我添加了不少自己的逻辑,Maven在这方面就不太方便了

降维打击有木有!以至于对我来说会更喜欢用Gradle

我们继续点击Next

plugin-project-create2.png

这里是一些可以集成的库,如果有需要可以选择

都是我在平时开发过程中觉得功能实现过于麻烦而封装的

源码都在这里Github(也已经慢慢破百星了,觉得不错的话可以给个Star,嘿嘿)

最后直接点击Create就行了

创建项目.gif

如果Gradle下不下来,可以手动下载之后,修改Gradle版本再重新build

image.png

会默认生成domain-samplemodule-sample这两个模块,主要就是为了给大家提供一个参考示例

同时还会默认生成domain-usermodule-user作为基本的用户模块

启动单体应用

创建完项目之后,在application-boot中的application.yml配置数据库并启动

然后执行sql/sample.sql的脚本文件

打开localhost:8080/swagger-ui/index.html就可以测试示例接口了

image.png

启动微服务

创建完项目之后,在application-cloud-gatewayapplication-cloud-sampleapplication-cloud-user中的bootstrap.yml配置数据库(gateway默认不需要)和注册中心(默认nacos)并启动

然后执行sql/sample.sql的脚本文件

打开localhost:9000/webjars/swagger-ui/index.html就可以测试示例接口了(这里由于动态路由的关系,可能需要等上几十秒,动态路由的内容可以看网关路由模块化支持与条件配置

代码生成

可以使用插件生成domainmodule下的代码

假设我们现在想在sample中实现一个订单Order功能

Domain 代码生成

先来生成domain部分的代码

New order package -> Select order package -> Right click -> Concept Cloud -> Generate Domain Code...

生成domain代码.gif

首先在{group}.{artifact}.domain下新建order

然后选中新建的order,右键,选择Concept Cloud,继续选择Generate Domain Code...

因为选中的是order包,所以会自动生成类名称Order,当然也可以自己手动修改每一项

下面是所有的配置项

plugin-code-domain-config.png

简单解释一下每一项的含义

参数 说明
User Domain Class 当前登录用户的领域模型
生成的代码会引用到
Domain Module(.main) 代码生成的模块
默认会填充选中的包所在的模块
也可以自己修改
Domain Package 就是我们选中的包
代码会生成在这个包下
Domain Object Class Name 领域模型的名称
Domain Collection Class Name 领域模型集合的名称
用于表示多个领域对象
默认直接加s
Domain Class Comment 领域模型注释
Domain Class Prop 领域模型属性
可动态添加

在右手边会有一个预览,但这并不是最终生成的代码,只是伪代码,只是方便确认领域模型的属性等

Module 代码生成

接着生成module部分的代码

New order package -> Select order package -> Right click -> Concept Cloud -> Generate Module Code...

生成module代码.gif

首先在{group}.{artifact}.module.sample.domain下新建order

然后选中新建的order,右键,选择Concept Cloud,继续选择Generate Module Code...

这里的包名最好是一样的,这样选中order之后,就会自动匹配对应的类型,当然也是可以自己手动修改每一项

下面是所有的配置项

plugin-code-module-config.png

简单解释一下每一项的含义

参数 说明
User Domain Class 当前登录用户的领域模型
生成的代码中会引用到
Login Annotation Class 参数注解,可为空
自动注入登录用户的领域模型
生成Controller需要引用到
Module Module(.main) 代码生成的模块
默认会填充选中的包所在的模块
也可以自己修改
Module Package 包名,这里注意是我们选中包的上两层目录
会在config下生成配置代码
会在infrastructure下生成基础设施代码
Domain Object Class 领域模型类
生成的代码中会引用到
Domain Collection Class 领域模型集合类
生成的代码中会引用到
Domain Repository Class 领域模型仓储类
生成的代码中会引用到
Domain Service Class 领域服务类
生成的代码中会引用到
Domain Description 领域模型注释
默认获取领域模型第一行注释
Swagger的注解会用到
Infrastructure(MyBatisPlus) 生成MBP相关代码

注意事项

该项目默认引入Concept Cloud Web拦截请求与响应

  • 会拦截Token,大家可以再Swagger-ui上看到登录接口,可以通过登录接口获得Token

  • 会在返回值外面包装一层,需要注意

总结

算是一个后端项目的脚手架吧

不过生成的VOPO并没有生成对应的字段,因为领域模型中是有复杂类型的,所以觉得的不好处理

但是现在倒觉得不如全部生成然后不需要的手动删掉可能更方便一点,后续会考虑加上

做个推广恰个饭IntelliJ IDE 插件开发指南

嗯。过段时间应该会再出一篇文章,说说这个插件的实现细节

插件源码

上一篇:v2.0:项目结构优化升级

下一篇:v2.0:扩展模块实现技术解耦

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYH95lG4' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片