给自己做了一个简单的SpringBoot微服务开发脚手架

3,454 阅读5分钟

本文皆为个人原创,请尊重创作,未经许可不得转载。

本文中代码已上传 GitHub 托管,对您有用的话动动小手给一个star,如有日常可加入的功能idea或使用的问题,可以提PR或Issues,我会认真拜读。

更新记录

日期模块分支更新内容
2024/5/3cloud-cli-modulefeature/freemarker-1.0.0REST Api调用方式生成完整微服务项目代码
2024/5/6cloud-cli-modulefeature/freemarker-1.0.0REST Api调用方式生成完整单体项目代码
2024/5/6cloud-cli-modulefeature/freemarker-1.0.0 master合并freemarker-1.0.0内容到master分支中

^_^

什么是脚手架

百度百科搜索脚手架词条显示,脚手架是为了保证各施工过程顺利进行而搭设的工作平台。

软件的脚手架的作用,维基百科显示

Scaffolding is a meta-programming method of building database-backed software applications. It is a technique supported by some model-view-controller frameworks, in which the programmer may write a specification that describes how the application database may be used. The compiler uses this specification to generate code that the application can use to create, read, update and delete database entries, effectively treating the template as a "scaffold" on which to build a more powerful application.

*译:脚手架是一种构建数据库支持的软件应用程序的元编程方法。它是一些模型-视图-控制器框架支持的一种技术,程序员可以在其中编写描述如何使用应用程序数据库的规范。编译器使用该规范生成应用程序可以用来创建、读取、更新和删除数据库条目的代码,有效地将模板视为构建更强大应用程序的“脚手架”

为什么做

起因是之前接了一些私活的单子,每次接到不同类型的项目的时候都需要新建一个项目,为了节省时间,我为毕业设计的单子做了同类型的基础框架,在不同的类型上创建新分支进行开发。

后续做的不完全是毕业设计的项目,基础框架自然不能覆盖了,某些项目需要更加完备的功能,因此闲来无事,开始研究是否能做一个属于日常开发的通用脚手架。

开始

编写脚手架的步骤大致为编写或者现找一个可用合适的SpringBoot微服务项目,再开发模板引擎,将原有的项目内容替换成自己的。

准备

首先是技术选型,开发对应类型的项目脚手架。根据我个人的开发需求,开发微服务和单体版本,符合不同体量项目的需求,开发小项目时不需要微服务。并且由于学习的需要,则集成技术选用较新的版本。

环境

版本
Java17+
Lombok/
Maven3.5+
SpringBoot3.0.7
SpringCloud-Alibaba2022.0.0.0

集成

版本
mybatis-Plus3.5
redisson/
openfeign3.5+
elastic-search3.0.7
ok-http3.0.7
spring-security6.0.3
mysql8+
jjwt0.9.1
log4j2.20.0
freeMarker2.3.31
jakarta.validation3.0.2
nacos-config2022.0.0.0
nacos-discovery2022.0.0.0

分支

Git管理参考 A successful Git branching model

master # 源分支
├─ feature/freemarker-1.0.0 # 生成器功能开发分支
├─ feature/standalone1.0.0  # 单体功能分支
├─ feature/microservice1.0.0 # 微服务功能分支
# 仅一人开发,故没有开启devlop负分支

目录

此处我使用的是自己开发的项目,项目结构如下。

spring-cloud-security-cli
├─nacos-example
|       └config.yml # nacos参考配置文件
├─ cloud-cli-service # 服务层模块
├─ cloud-cli-security # 安全认证模块
├─ cloud-cli-generate # 代码生成器模块(目前支持RestAPI调用生成微服务项目)
├─ cloud-cli-common # 通用模块(工具、配置)
├─ cloud-cli-bean # 实体类模块
├─ cloud-cli-api # Web api服务
├─ (待定) cloud-cli-pay # 支付SDK分支

结构一览

# 省略api、service模块
├─cloud-cli-security # 安全认证
|         ├─pom.xml
...
|         |  |  |  |  |  ├─cli
|         |  |  |  |  |  |  ├─security
|         |  |  |  |  |  |  |    ├─model
|         |  |  |  |  |  |  |    |   └SysUser.java
|         |  |  |  |  |  |  |    ├─manager
|         |  |  |  |  |  |  |    |    ├─AuthenticationProviderImpl.java
|         |  |  |  |  |  |  |    |    ├─AuthenticationTokenImpl.java
|         |  |  |  |  |  |  |    |    └PasswordManager.java
|         |  |  |  |  |  |  |    ├─jwt
|         |  |  |  |  |  |  |    |  ├─JWTAuthenticationFilter.java
|         |  |  |  |  |  |  |    |  ├─JWTLoginFilter.java
|         |  |  |  |  |  |  |    |  └RecruitTokenService.java
|         |  |  |  |  |  |  |    ├─controller
|         |  |  |  |  |  |  |    |     └LoginController.java
|         |  |  |  |  |  |  |    ├─config
|         |  |  |  |  |  |  |    |   ├─CorsConfig.java
|         |  |  |  |  |  |  |    |   ├─JwtConfig.java
|         |  |  |  |  |  |  |    |   └SecurityConfig.java
|         |  |  |  |  |  |  |    ├─adapter
|         |  |  |  |  |  |  |    |    ├─AuthConfigAdapter.java
|         |  |  |  |  |  |  |    |    ├─CustomAuthenticationEntryPoint.java
|         |  |  |  |  |  |  |    |    └ResourceServerAdapter.java
├─cloud-cli-generate # 生成器,支持生成微服务项目
├─pom.xml
├─src
|  ├─main
|  |  ├─resources
|  |  |     ├─template
|  |  |     |    ├─logback.ftl
|  |  |     |    ├─standalone
|  |  |     |    |     └application.ftl
|  |  |     |    ├─service
|  |  |     |    |    ├─IUsersService.ftl
|  |  |     |    |    ├─pom.ftl
|  |  |     |    |    ├─resources
|  |  |     |    |    |     ├─CommonMapper.xml.ftl
|  |  |     |    |    |     └UsersMapper.xml.ftl
|  |  |     |    |    ├─mapper
|  |  |     |    |    |   ├─CommonMapper.ftl
|  |  |     |    |    |   └UsersMapper.ftl
|  |  |     |    |    ├─impl
|  |  |     |    |    |  └UsersServiceImpl.ftl
|  |  |     |    ├─security
|  |  |     |    |    ├─pom.ftl
|  |  |     |    |    ├─model
|  |  |     |    |    |   └SysUser.ftl
|  |  |     |    |    ├─manager
|  |  |     |    |    |    ├─AuthenticationProviderImpl.ftl
|  |  |     |    |    |    ├─AuthenticationTokenImpl.ftl
|  |  |     |    |    |    └PasswordManager.ftl
|  |  |     |    |    ├─jwt
|  |  |     |    |    |  ├─JWTAuthenticationFilter.ftl
|  |  |     |    |    |  ├─JWTLoginFilter.ftl
|  |  |     |    |    |  └RecruitTokenService.ftl
|  |  |     |    |    ├─controller
|  |  |     |    |    |     └LoginController.ftl
|  |  |     |    |    ├─config
|  |  |     |    |    |   ├─CorsConfig.ftl
|  |  |     |    |    |   ├─JwtConfig.ftl
|  |  |     |    |    |   └SecurityConfig.ftl
|  |  |     |    |    ├─adapter
|  |  |     |    |    |    ├─AuthConfigAdapter.ftl
|  |  |     |    |    |    ├─CustomAuthenticationEntryPoint.ftl
|  |  |     |    |    |    └ResourceServerAdapter.ftl
|  |  |     |    ├─project
|  |  |     |    |    └pom.ftl
|  |  |     |    ├─common
|  |  |     |    |   ├─pom.ftl
|  |  |     |    |   ├─xss
|  |  |     |    |   |  ├─XssUtil.ftl
|  |  |     |    |   |  └XssWrapper.ftl
|  |  |     |    |   ├─utils
|  |  |     |    |   |   ├─CommonUtils.ftl
|  |  |     |    |   |   └SpringContextUtils.ftl
|  |  |     |    |   ├─redis
|  |  |     |    |   |   └RedisComponent.ftl
|  |  |     |    |   ├─model
|  |  |     |    |   |   └Result.ftl
|  |  |     |    |   ├─handler
|  |  |     |    |   |    └HttpHandler.ftl
|  |  |     |    |   ├─filter
|  |  |     |    |   |   └XssFilter.ftl
|  |  |     |    |   ├─exception
|  |  |     |    |   |     └BusinessException.ftl
|  |  |     |    |   ├─enums
|  |  |     |    |   |   └ResponseEnum.ftl
|  |  |     |    |   ├─config
|  |  |     |    |   |   ├─GlobalExceptionHandlerConfig.ftl
|  |  |     |    |   |   ├─JacksonConfig.ftl
|  |  |     |    |   |   ├─MbpConfig.ftl
|  |  |     |    |   |   └RedisConfig.ftl
|  |  |     |    |   ├─aop
|  |  |     |    |   |  ├─AopLog.ftl
|  |  |     |    |   |  └LogAspect.ftl
|  |  |     |    ├─cloud
|  |  |     |    |   ├─application.ftl
|  |  |     |    |   └bootstrap.ftl
|  |  |     |    ├─bean
|  |  |     |    |  ├─pom.ftl
|  |  |     |    |  ├─model
|  |  |     |    |  |   └Users.ftl
|  |  |     |    ├─api
|  |  |     |    |  ├─Application.ftl
|  |  |     |    |  ├─pom.ftl
|  |  |     |    |  ├─resources
|  |  |     |    |  |     ├─application.yml.ftl
|  |  |     |    |  |     ├─bootstrap.yml.ftl
|  |  |     |    |  |     ├─logback
|  |  |     |    |  |     |    └logback-dev.xml.ftl
|  |  |     |    |  ├─controller
|  |  |     |    |  |     └ExampleController.ftl
|  |  |     ├─logback
|  |  |     |    └logback-dev.xml
|  |  ├─java
|  |  |  |  |  ├─Main.java
|  |  |  |  |  ├─generate
|  |  |  |  |  |    ├─service
|  |  |  |  |  |    |    ├─BaseGenerateService.java
|  |  |  |  |  |    |    ├─CodeGenerator.java
|  |  |  |  |  |    |    ├─CommonModuleGenerate.java
|  |  |  |  |  |    |    ├─CommonProjectGenerate.java
|  |  |  |  |  |    |    ├─module
|  |  |  |  |  |    |    |   ├─ApiModuleGenerator.java
|  |  |  |  |  |    |    |   ├─BeanModuleGenerator.java
|  |  |  |  |  |    |    |   ├─CommonModuleGenerator.java
|  |  |  |  |  |    |    |   ├─ProjectGenerator.java
|  |  |  |  |  |    |    |   ├─SecurityModuleGenerator.java
|  |  |  |  |  |    |    |   └ServiceModuleGenerator.java
|  |  |  |  |  |    ├─model
|  |  |  |  |  |    |   ├─ApplicationInfo.java
|  |  |  |  |  |    |   ├─ModuleFtlModel.java
|  |  |  |  |  |    |   ├─ModuleInfo.java
|  |  |  |  |  |    |   └ProjectInfo.java
|  |  |  |  |  |    ├─enums
|  |  |  |  |  |    |   └TypeEnum.java
|  |  |  |  |  |    ├─controller
|  |  |  |  |  |    |     └GenerateController.java
|  |  |  |  |  |    ├─consts
|  |  |  |  |  |    |   └CommonConst.java
|  |  |  |  |  |    ├─config
|  |  |  |  |  |    |   └SpringContextHolder.java
├─cloud-cli-common # 通用模块
|        ├─pom.xml
...
|        |  |  |  |  |  ├─cli
|        |  |  |  |  |  |  ├─common
|        |  |  |  |  |  |  |   ├─xss
|        |  |  |  |  |  |  |   |  ├─XssUtil.java
|        |  |  |  |  |  |  |   |  └XssWrapper.java
|        |  |  |  |  |  |  |   ├─utils
|        |  |  |  |  |  |  |   |   └CommonUtils.java
|        |  |  |  |  |  |  |   ├─redis
|        |  |  |  |  |  |  |   |   └RedisComponent.java
|        |  |  |  |  |  |  |   ├─prop
|        |  |  |  |  |  |  |   |  └ElasticSearchProp.java
|        |  |  |  |  |  |  |   ├─model
|        |  |  |  |  |  |  |   |   └Result.java
|        |  |  |  |  |  |  |   ├─handler
|        |  |  |  |  |  |  |   |    └HttpHandler.java
|        |  |  |  |  |  |  |   ├─filter
|        |  |  |  |  |  |  |   |   └XssFilter.java
|        |  |  |  |  |  |  |   ├─exception
|        |  |  |  |  |  |  |   |     └BusinessException.java
|        |  |  |  |  |  |  |   ├─es
|        |  |  |  |  |  |  |   | └ElasticSearchComponent.java
|        |  |  |  |  |  |  |   ├─enums
|        |  |  |  |  |  |  |   |   └ResponseEnum.java
|        |  |  |  |  |  |  |   ├─config
|        |  |  |  |  |  |  |   |   ├─BeanDefinitionCondition.java
|        |  |  |  |  |  |  |   |   ├─ElasticSearchConfig.java
|        |  |  |  |  |  |  |   |   ├─GlobalExceptionHandlerConfig.java
|        |  |  |  |  |  |  |   |   ├─JacksonConfig.java
|        |  |  |  |  |  |  |   |   ├─MbpConfig.java
|        |  |  |  |  |  |  |   |   ├─RedisConfig.java
|        |  |  |  |  |  |  |   |   └SpringContextUtils.java
|        |  |  |  |  |  |  |   ├─aop
|        |  |  |  |  |  |  |   |  ├─AopLog.java
|        |  |  |  |  |  |  |   |  └LogAspect.java

Done

基于Spring Security + JJWT 的登录认证和安全拦截

aspect log4j的全局控制层日志打印

common模块下的其他配置、工具类…

RestAPI调用模式生成微服务项目

Developing

生成器模块通过控制台交互生成自定义项目。

TODO

(待定)自定义Crud mapper(个人觉得mybatis-plus功能够用)

加入消息队列、Web Socket功能模块

包装支付宝、微信支付功能的支付模块

REST API生成项目

运行cloud-cli-generate模块的GeneratorApplication

发送http请求

path: /generate/project
body:{
    "projectInfo": {
        "groupId": "org.test", // 项目groupId
        "artifactId": "standalone", // 项目artifactId
        "applicationName": "standalone-test", // 应用名称
        "author": "test", // 作者 默认=default
        "childModuleDirPrefix": "standalone-test-cli", // 子模块名称前缀
        "childLastPackage": "cli", // 子模块包名后缀
        "root":"C:\\TEST", // 项目路径
        "mode":"0" // 1-微服务 0-单体 不填默认微服务
        "version":"" // 默认1.0.0-SNAPSHOT
    }
}

image.png

参数

image.png

生成内容

image.png

微服务项目

image.png

单体项目

启动输出(微服务运行前需要在nacos上添加配置,内容参考 nacos-example 文件夹下的config.yml、standalone需要启动redis服务)

standalone分支使用

启动redis服务。

修改api模块下application.yml文件里的数据源信息为你的地址。

image.png

microservice分支使用

参考配置文件为nacos-example文件夹下的config.yml

启动nacos、redis服务。

修改api模块下bootstrap.yml的配置信息。

image.png

仓库地址

项目仍在开发维护,感兴趣可以参与贡献。

GitHub地址:github.com/IsNott/spri…

image.png

本文皆为个人原创,请尊重创作,未经许可不得转载。