基于Springboot的服务端开发脚手架-自动生成工具

news2024/11/17 17:40:35

继之前的

  • 专题系列课程: ​​从零开始搭建grpc分布式应用​​
  • 完整DEMO:​​基于Springboot的Rpc服务端开发脚手架(base-grpc-framework)​​

后带来一款项目自动手成工具(由于包路径等原因,完整demo想应用在实际开发中需要改很多代码),可以设置成自己公司的一些规定包路径等。

  • 自动生成工具源码地址:​​源码下载​​

此为一工具,默认生成java服务工程,但可经过配置生成其它类型的工程或目录结构,如python、recat等。此工具中自带了之前课程中提到的dao操作、http拦截、tracklog日志跟踪、exception切面处理等所有功能。可节省大量的搭建工程和基础工作的开发时间。而且生成的项目文件源文件,可进行二次修改。

一、如何使用

建议下载ReleasesV1.0,解压后先运行包中自带的test.sh脚本,会在解压目录的/output下生成三个预置好的三个工程,restful、grpc、fixed(restful+grpc)。

sh test.sh

截图如下:

二、生成自定义的工程

这一步建议选择一个预置的.setting文件进行修改,配置文件说明如下:

2.1、修改project.setting文件

# project config
project.name = base-grpc-framework   #工程名称
project.groupId = com.zd   #对应pom文件的groupId,全工程所有模块统一
project.version = 1.0-SNAPSHOT #对应pom文件的groupId,全工程所有模块统一
project.packaging = jar  #工程打包类型

project.basePackage = com.zd.baseframework  #源码根目录

project.app.tokenKey = token  #token的key,用于http拦截器访问端验证用
project.app.apiPath = /api/** #用于http拦截器使用

#module config
project.modules = api, proto, app, common, core, dao #所有模块名称

#模块类型,可选的有 proto, api, application, common, restful, grpc, fixed,persistence
#PS:一个完整工程最好的实践是由API, SERVER, COMMON, APP, DAO 5个大类型的模块组成,所以在同一个配置文件中会有如下互斥约束
#API模块:(proto, api)二选一,
#SERVER模块:restful, grpc, fixed 三选一,
#必要模块:application,启动
#可选模块:persistence, common 持久化和工具类
api.module.type = api 
api.module.artifactId = base-grpc-framework-api

proto.module.type = proto
proto.module.artifactId = base-grpc-framework-proto

common.module.type = common
common.module.artifactId = base-grpc-framework-common

app.module.type = application
app.module.artifactId = base-grpc-framework-app

core.module.type = fixed
core.module.artifactId = base-grpc-framework-core
core.moudle.port = 18080 #http服务端口
core.moudle.grpc.port = 9090 #grpc服务端口

dao.module.type = persistence
dao.module.artifactId = base-grpc-framework-dao
dao.module.mysql.dbIp = 127.0.0.1
dao.module.mysql.dbPort = 3306
dao.moudle.mysql.dbName = badCase
dao.module.mysql.dbUsername = root
dao.module.mysql.dbPassword = 12345678
dao.module.mysql.mapper = mybatis #mapper文件存放位置

2.2、生成自定义项目

java -jar grpc-framework-project-generator-1.0-SNAPSHOT-jar-with-dependencies.jar [setting=project_fixed.setting] [slt=/slt/source/]
setting默认值为:project.setting
slt默认值为:/slt/source/ 注意最后的/不要丢掉

2.3、打包运行

需要本机装有maven,执行以下命令:

cd /output/xxxxProject
mvn clean install -Dmaven.test.skip=true
mvn clean package -Dmaven.test.skip=true
java -jar -Dspring.profiles.active=dev xxxxProject.jar

# Step3: Test
open http://localhost:18080/swagger-ui.html

比如上述文件中

  1. project.name = base-grpc-framework
  2. project.version = 1.0-SNAPSHOT
  3. app.module.artifactId = base-grpc-framework-app

则执行以下命令:

cd /output/base-grpc-framework
mvn clean install -Dmaven.test.skip=true
mvn clean package -Dmaven.test.skip=true
java -jar -Dspring.profiles.active=dev 1. base-grpc-framework-app-1. 1.0-SNAPSHOT.jar

# Step3: Test
open http://localhost:18080/swagger-ui.html

三、配置符合公司个性的默认工程

上述工具中笔者内置了一些类和文件,这些文件是可以被编辑和替换的,也可基于笔者内置的类来扩展。

3.1、扩展基础文件

扩展配置文件 slt/source/sltext.json,因工具本身内置了一些java实现,基于规范的述求一般公司对这些文件是不允许修改的,如果使用部门有个性化需求的话,比如增加一个基础类,就可以通过这个功能来实现个性化和扩展但又不影响基础版本。

{
  "proto": [
    {"name": "GrpcAccessInterceptor.java", "packagePath": "/grpc/interceptor", "fileType": "source", "fileOperatorType": "create"}
  ]
}
[options]
moduleType: proto, application, persistence, common, restful, grpc, fixed
name: fileName
packagePath: file path 
fileType:  source, yml, xml or config
fileOperatorType: create, copy or append

3.2、重新制定基础文件

基础文件存储路径:slt/source,笔者现在的版本有一个限制就是内置的文件不允许缺失只能改写,否则会报错。如果想配置成公司内部的文件或对基础文件有修改,可以下载笔者的源码后进行修改,或是把源码中所有的配置全部删除,全部用sltext.json的方式来实现

  1. 源码修改位置:

com.zd.tools.project.generator.model.module 包中的所有文件

下面类用于生成src/main和src/resources目录,如果不需要的话可以注释掉其中的代码
com.zd.tools.project.generator.analysis.process.SettingFileConvert.configOwnAttr()

2、源码修改说明,可根据文件名对应各个类型模块的配置

ModuleApi.java          :对应api类型的模块
ModuleApplication.java  :对应application类型的模块
ModuleCommon.java        :对应common类型的模块
ModuleFixed.java        :对应fixed类型的模块
ModuleGrpc.java          :对应grpc类型的模块
ModulePersistence.java  :对应persistence类型的模块
ModuleProto.java        :对应proto类型的模块
ModuleRestful.java      :对应restful类型的模块

源码如下:

public class ModuleRestful extends AbstractModule {

    private String port;
   
    //预生成目录结构
    @Override
    public void configOwnDir() {
        super.configOwnDir();
        getDirs().add(getPackagePath() + File.separator + "server");
        getDirs().add(getPackagePath() + File.separator + "restful");
        getDirs().add(getPackagePath() + File.separator + StrFormatterUtil.replaceSlash("restful/config"));
        getDirs().add(getPackagePath() + File.separator + StrFormatterUtil.replaceSlash("restful/advice"));
        getDirs().add(getPackagePath() + File.separator + StrFormatterUtil.replaceSlash("restful/interceptor"));
        getDirs().add(getPackagePath() + File.separator + StrFormatterUtil.replaceSlash("restful/model"));
    }

    //预生成文件
    @Override
    public void configOwnSourceFile(){
        super.configOwnSourceFile();
        getSourceFiles().add(new SourceFile("log4j2.xml",                      getResourcesPath(), "", GenEnum.fileType.config, GenEnum.fileOperatorType.copy));

        getSourceFiles().add(new SourceFile("RestfulHttpExceptionAdvice.java", getPackagePath(), StrFormatterUtil.replaceSlash("/restful/advice"),      GenEnum.fileType.source, GenEnum.fileOperatorType.create));
        getSourceFiles().add(new SourceFile("RestfulAccessInterceptor.java",   getPackagePath(), StrFormatterUtil.replaceSlash("/restful/interceptor"), GenEnum.fileType.source, GenEnum.fileOperatorType.create));
        getSourceFiles().add(new SourceFile("RestfulInterceptorRegister.java", getPackagePath(), StrFormatterUtil.replaceSlash("/restful/interceptor"), GenEnum.fileType.source, GenEnum.fileOperatorType.create));
        getSourceFiles().add(new SourceFile("RestfulTokenInterceptor.java",    getPackagePath(), StrFormatterUtil.replaceSlash("/restful/interceptor"), GenEnum.fileType.source, GenEnum.fileOperatorType.create));
        getSourceFiles().add(new SourceFile("SwaggerConfig.java",              getPackagePath(), StrFormatterUtil.replaceSlash("/restful/config"),      GenEnum.fileType.source, GenEnum.fileOperatorType.copy));

        getSourceFiles().add(new SourceFile("application-restful.properties",getResourcesPath(), "", GenEnum.fileType.yml, GenEnum.fileOperatorType.append));

        getSourceFiles().add(new SourceFile("pom_restful.xml", getBasePath() ,"", GenEnum.fileType.xml, GenEnum.fileOperatorType.copy));
    }
}

3.3、编写基础文件

基础文件可参考笔者预置的文件进行修改,主要是用占位符替换.java文件中的package, import和className。示例如下:

package ${package};  #固定写法

#common为模块类型(proto, api, application, common, restful, grpc, fixed,persistence)中选一个, 
# "Module"为固定后缀,例子中${commonModule}表示引入common模块的一个类
import ${commonModule}.spring.ApperProperties;  
import ${commonModule}.spring.grpc.AbstractGrpcAccessInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @Title: ${package}.${className}
 * @Description
 * @author liudong
 * @date 2022/1/13 4:40 PM
 */
@Slf4j
public class ${className} extends AbstractGrpcAccessInterceptor { #固定写法

    @Autowired
    private ApperProperties apperProperties;

    @Override
    protected String tokenKey() {
        return apperProperties.getTokenKey();
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1352372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…

免费邮件系统hMailServer本地部署并实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

Python算法例32 统计数字

1. 问题描述 计算数字k在0~n中出现的次数,k可能是0~9中的一个数字。 2. 问题示例 n12,k1,在[0,1,2,3,4,5,6,7,8,9,10&a…

野生菌行业第一品牌,让世界爱上“野生菌,好宝贝”

近年来,随着人们对健康和美食的追求不断升温,野生菌作为一种珍贵的食材备受瞩目。在这个行业中,一个名为菌贝的品牌正在崭露头角。作为专注于野生菌产业和产品的领军品牌,菌贝由互联网知名人士贤哥、付颖和飘云等创始人于2018年10…

高压继电器,未来几年市场将保持稳定增长

高压继电器是一种用于控制大功率电气设备的开关装置,广泛应用于电力系统、轨道交通、工业自动化等领域。随着各行业对电气控制需求的不断增加,高压继电器市场也在不断扩大。全球高压继电器市场分析: 在全球市场中,目前主要的高压继…

MidTool图文创作-GPT-4与DALL·E 3的结合

GPT-4与DALLE 3的结合 GPT-4是由OpenAI开发的最新一代语言预测模型,它在前代模型的基础上进行了大幅度的改进,不仅在文本生成的连贯性、准确性上有了显著提升,还在理解复杂语境和执行多步骤指令方面表现出了更高的能力。而DALLE 3则是一个创…

Flutter 混合开发 - 动态下发 libflutter.so libapp.so

背景 最近在做包体积优化,在完成代码混淆、压缩,裁剪ndk支持架构,以及资源压缩(如图片转webp、mp3压缩等)后发现安装包的中占比较大的仍是 so 动态库依赖。 具体查看发现 libflutter.so 和 libapp.so 的体积是最大的&…

solidity显示以太坊美元价格

看过以太坊白皮书的都知道,以太坊比较比特币而言所提升的地方中,我认为最重要的一点就是能够访问外部的数据,这一点在赌博、金融领域应用会很广泛,但是区块链是一个确定的系统,包括里面的所有数值包括交易ID等都是确定…

pyqt6 + pycharm 搭建+使用入门

首先安装PyQt6和PyQt6-tools。使用如下命令: pip install PyQt6 PyQt6-tools 但是运行后会报如下错误: 这个时候按照提示执行命令升级pip即可 python.exe -m pip install --upgrade pip 配置pycharm: 打开pycharm,进入setting&am…

STM32 ESP8266 物联网智能温室大棚 (附源码 PCB 原理图 设计文档)

资料下载: https://download.csdn.net/download/vvoennvv/88680924 一、概述 本系统以STM32F103C8T6单片机为主控芯片,采用相关传感器构建系统硬件电路。其中使用DHT11温湿度传感器对温度和湿度的采集,MQ-7一氧化碳传感器检测CO浓度,GP2Y101…

SpringCloud微服务架构,适合接私(附源码)

一个由商业级项目升级优化而来的微服务架构,采用SpringBoot 2.7 、SpringCloud 等核心技术构建,提供基于React和Vue的两个前端框架用于快速搭建企业级的SaaS多租户微服务平台。 架构图 项目介绍 用户权益 仅允许免费用于学习、毕设、公司项目、私活等。…

软件测试之---测试设计方法

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

studio3T mongodb 根据查询条件去更新集合

mongodb 等于、不等于$ne、不包含 $nin 以及批量更新数据的使用。 业务场景: 在集合中,根据查询条件,更新数据状态。 实现代码: 1. 部门名称为XXX、状态不等于“完好”的、并且不包含这些编码的数据先查询出来2. 再把状态更新成…

STM32入门教程-2023版【3-2】推挽输出和开漏输出驱动问题

关注 点赞 不错过精彩内容 大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 二、正式点亮一个LED灯 (4)推挽输出和开漏输出驱动问题 把LED的正负极对换&…

Sharding Sphere 教程 简介

一 文档简介 1.1 分库分表诞生的前景 随着系统用户运行时间还有用户数量越来越多,整个数据库某些表的体积急剧上升,导致CRUD的时候性能严重下降,还容易造成系统假死。 这时候系统都会做一些基本的优化,比如加索引…

Linux之下载安装

rpm包管理 rpm介绍 rpm用于互联网下载包的打包及安装工具,他包含在某些linux分发版本中。他生成具有.rpm扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似windows的steup.exe。 rpm包的查询指令 查询已经安装…

MFC综合实验二学习记录

文章目录 虚函数和纯虚函数的区别?MFC中什么是UPDATE_COMMAND_UI 消息如何查看控件对应的成员变量模态对话框的理解HGDIOBJ" 类型的值不能用于初始化 "CBrush *" 类型的实体错误MFC编程中CDC类型和HDC类型有什么区别?关于WIDING和ALTERNA…

深挖小白必会指针笔试题<一>

目录 引言 关键解决办法: 学会画图确定指向关系 例题一: 画图分析: 例题二: 画图分析: 例题三: 注:%x是按十六进制打印 画图分析: 例题四: 画图分析&…

常见的算法交易类型,一文看懂个人如何开通算法交易程序?

算法交易是指由计算机系统根据证券的历史数据分析、实时市场行情和交易员选择的策略及参数等,利用计算机程序和数学模型来决定交易下单的时机、价格和数量等,通过将大单拆为小单,以减小市场冲击成本,提高交易效率和交易隐蔽性的智…

裂变新模式:分销市场的翘楚

在当今的商业世界,推荐机制已经成为一种重要的营销策略。通过用户推荐,企业不仅能够扩大品牌影响力,还能有效降低获客成本。然而,如何设计一个合理的推荐机制,使得用户有足够的动力去推荐新人,同时保持团队…