我正在参加「掘金·启航计划」
本专栏 将通过以下几块内容来搭建一个 模块化:可以根据项目的功能需求和体量进行任意模块的组合或扩展 的后端服务
v2.0:项目构建+代码生成「插件篇」(本文)
v2.0:扩展模块实现技术解耦
未完待续……
在上一篇文章v2.0:项目结构优化升级中,我们将项目的结构进行了优化,优化之后的项目结构如下
同时还遗留了一个问题,那就是当前的项目结构已经比较复杂了,手动创建的难度较高,所以我写了一个插件来一键生成
简单说明
考虑到可能有读者是第一次看这个专栏,所以我还是先简单介绍一下,详细的内容大家可以看我之前的专栏文章
这里模块化的设想其实就是可插拔的功能模块,如果需要这个功能,就把这个模块用Gradle
或Maven
的方式编译进来,如果不需要,去掉对应的依赖就行了,避免改动代码,因为一旦涉及到代码改动的话,就会变得“改不断,理还乱”
当然了,需要达到每个模块都能够任意拆卸的程度其实并不简单,所以我借鉴了DDD
的思想来达成这个目的,专栏中也有这一块的内容,另外后续也会再写一篇针对DDD
优化的文章
所以当我们把所有模块都编译进来的时候,那么就是一个单体应用了,如果把多个模块分开编译,那么就变成了微服务
以我们juejin
项目的三个模块(用户,沸点,通知)为例:
在最开始的时候,我们可以将这三个模块打包成一个服务,作为单体应用来运行,适合项目前期体量较小的情况
之后,当我们发现沸点的流量越来越大,就可以将沸点模块拆分出来作为单独的一个服务方便扩容,用户模块和通知模块打包在一起作为另一个服务,这样就从单体应用变成了微服务
注:从单体应用到微服务的切换是不需要修改代码的
插件
先吐槽一下,这插件开发可真不是人干的事,各种文档讲不清楚,各种方法没有注释,各种接口不断更改,只能自己一点一点摸索
那么接下来就是今天的重头戏
插件安装
直接在插件市场搜索Concept Cloud
就行啦
需要注意支持的版本在2021.3-2023.1
项目生成
File -> New -> Project -> Concept Cloud
就在新建项目的选项里,会有一个Concept Cloud
的项目
需要注意的是Server URL
这个路径是需要访问Github
的,而且构建项目的时候会下载Gradle
,所以大家记得先配置好网络
如果真的访问不了,可以将这个路径改成https://cdn.jsdelivr.net/gh/Linyuzai/concept/concept-cloud/pluginew
其他的参数和我们平时创建项目的时候一样,就是jdk
至少需要1.8
,这里我没有过滤,大家选择的时候需要注意一下
目前只实现了Java + Gradle
的方式构建
可能有读者要问了,为什么不支持kotlin
和Maven
呢
其实支持kotlin
的话并不难,就是麻烦一点,相当于重新写一套kt
的代码,而我比较懒(bushi
而Maven
的话说实话就有点麻烦了,因为Gradle
支持这样的操作
dependencies {
if (project.name == 'xxxx') {
compile 'xxxx:xxxx'
}
compile 'xxxx:xxxx'
}
Gradle
使用Groovy
或者Kotlin
作为脚本语言,可以在任意地方添加自己的代码逻辑,如果看过之前的专栏文章就会知道,我添加了不少自己的逻辑,Maven
在这方面就不太方便了
降维打击有木有!以至于对我来说会更喜欢用Gradle
我们继续点击Next
这里是一些可以集成的库,如果有需要可以选择
都是我在平时开发过程中觉得功能实现过于麻烦而封装的
源码都在这里Github(也已经慢慢破百星了,觉得不错的话可以给个Star,嘿嘿)
最后直接点击Create
就行了
如果Gradle
下不下来,可以手动下载之后,修改Gradle
版本再重新build
会默认生成domain-sample
和module-sample
这两个模块,主要就是为了给大家提供一个参考示例
同时还会默认生成domain-user
和module-user
作为基本的用户模块
启动单体应用
创建完项目之后,在application-boot
中的application.yml
配置数据库并启动
然后执行sql/sample.sql
的脚本文件
打开localhost:8080/swagger-ui/index.html
就可以测试示例接口了
启动微服务
创建完项目之后,在application-cloud-gateway
,application-cloud-sample
和application-cloud-user
中的bootstrap.yml
配置数据库(gateway
默认不需要)和注册中心(默认nacos
)并启动
然后执行sql/sample.sql
的脚本文件
打开localhost:9000/webjars/swagger-ui/index.html
就可以测试示例接口了(这里由于动态路由的关系,可能需要等上几十秒,动态路由的内容可以看网关路由模块化支持与条件配置)
代码生成
可以使用插件生成domain
和module
下的代码
假设我们现在想在sample
中实现一个订单Order
功能
Domain 代码生成
先来生成domain
部分的代码
New order package -> Select order package -> Right click -> Concept Cloud -> Generate Domain Code...
首先在{group}.{artifact}.domain
下新建order
包
然后选中新建的order
,右键,选择Concept Cloud
,继续选择Generate Domain Code...
因为选中的是order
包,所以会自动生成类名称Order
,当然也可以自己手动修改每一项
下面是所有的配置项
简单解释一下每一项的含义
参数 | 说明 |
---|---|
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...
首先在{group}.{artifact}.module.sample.domain
下新建order
包
然后选中新建的order
,右键,选择Concept Cloud
,继续选择Generate Module Code...
这里的包名最好是一样的,这样选中order
之后,就会自动匹配对应的类型,当然也是可以自己手动修改每一项
下面是所有的配置项
简单解释一下每一项的含义
参数 | 说明 |
---|---|
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
-
会在返回值外面包装一层,需要注意
总结
算是一个后端项目的脚手架吧
不过生成的VO
和PO
并没有生成对应的字段,因为领域模型中是有复杂类型的,所以觉得的不好处理
但是现在倒觉得不如全部生成然后不需要的手动删掉可能更方便一点,后续会考虑加上
做个推广恰个饭IntelliJ IDE 插件开发指南
嗯。过段时间应该会再出一篇文章,说说这个插件的实现细节
上一篇:v2.0:项目结构优化升级
下一篇:v2.0:扩展模块实现技术解耦