Java 后端开发实践 - 项目模板

8年Java后端开发实践之SpringBoot项目模板 在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。 另外,我在工作中也会接触到很多既有项目,公司内部和外部的都有,多数项目的编码实践我都是不满意的。比如,我曾经新加入一个项目的时候,前前后后请教了3位同事才把该项目在本地运行起来;又比如在另一项目中,我发现前端请求对应的Java类命名规范不统一,有 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:llchen60.com/后端开发实践-项目模板/

整理出一套公共性的项目模板,旨在尽量多地包含日常开发所需,减少开发者的重复性工作以及提供一些最佳实践。

1. 从写好README开始

一个好的README给人以项目概览,可以使新人快速上手项目,并降低沟通成本,建议包括:

  • 项目简介

    • 一两句话描述该项目实现的业务功能

  • 技术选型

    • 项目的技术栈,包括语言,框架,中间件等

  • 本地构建

    • 列出本地开发过程中所用到的工具命令

  • 领域模型

    • 核心的领域概念,针对于当前系统所在的领域

  • 测试策略

    • 自动化测试如何分类

  • 技术架构

    • 技术架构图

  • 部署架构

    • 部署架构图

  • 外部依赖

    • 项目运行时所以来的外部集成方

  • 环境信息

    • 各个环境的访问方式,数据库连接

  • 编码实践

    • 统一的编码实践,比如异常处理原则,分页封装等

  • FAQ

    • 开发过程中常见问题的解答

注意保持README的持续更新,一些重要的架构决定可以通过示例代码的形式记录在代码块当中,新开发者可以通过直接阅读这些示例代码快速了解项目的通用实践方式以及架构选择

2. 一键式本地构建

写一个必需的script,自动化完成本地构建的过程

  • run.sh 进行本地调试或者必要的手动测试

  • local-build.sh,完成本地构建

3. 日志处理

  • 在日志中加入请求标识,便于链路追踪。在处理一个请求的过程中有时会输出多条日志,如果每条日志都共享统一的请求ID,那么在日志追踪时会更加方便。此时,可以使用Logback原生提供的MDC(Mapped Diagnostic Context)功能,创建一个RequestIdMdcFilter

    protected void doFilterInternal(HttpServletRequest request,
                                HttpServletResponse response,
                                FilterChain filterChain)
        throws ServletException, IOException {
    //request id in header may come from Gateway, eg. Nginx
    String headerRequestId = request.getHeader(HEADER_X_REQUEST_ID);
    MDC.put(REQUEST_ID, isNullOrEmpty(headerRequestId) ? newUuid() : headerRequestId);
    try {
        filterChain.doFilter(request, response);
    } finally {
        clearMdc();
    }
}
  • 集中式日志管理,在多节点部署的场景下,各个节点的日志是分散的,为此可以引入诸如ELK之类的工具将日志统一输出到ElasticSearch中。

<appender name="REDIS" class="com.cwbase.logback.RedisAppender">
    <tags>ecommerce-order-backend-${ACTIVE_PROFILE}</tags>
    <host>elk.yourdomain.com</host>
    <port>6379</port>
    <password>whatever</password>
    <key>ecommerce-ordder-log</key>
    <mdc>true</mdc>
    <type>redis</type>
</appender>12345678

4. 异常处理

在设计异常处理的框架的时候,需要考虑到:

  • 向客户端提供格式统一的异常返回

  • 异常信息中应该包含足够多的上下文信息,最好是结构化的数据以便于客户端解析

  • 不同类型的异常应该包含唯一标识,以便客户端精确识别

异常处理有两种处理形式,一种是层级式,即每种具体的异常都对应了一个异常类,这些类最终继承自某个父异常;另外一种是单一式,即整个程序中只有一个异常类,再以一个字段来区分不同的异常场景。层级式异常的好处能够显化异常的含义,但是如果设计不好可能会导致程序中大量的异常类。

使用层级式异常的范例:

public abstract class AppException extends RuntimeException {
    private final ErrorCode code;
    private final Map<String, Object> data = newHashMap();
}

这里,ErrorCode枚举中包含了异常的唯一标识、HTTP状态码以及错误信息;而data字段表示各个异常的上下文信息。

public class OrderNotFoundException extends AppException {
    public OrderNotFoundException(OrderId orderId) {
        super(ErrorCode.ORDER_NOT_FOUND, ImmutableMap.of("orderId", orderId.toString()));
    }
}

在返回给客户端的时候,通过一个ErrorDetail类来统一异常格式:

public final class ErrorDetail {
    private final ErrorCode code;
    private final int status;
    private final String message;
    private final String path;
    private final Instant timestamp;
    private final Map<String, Object> data = newHashMap();
}

最终返回给客户端的数据为:

{
  requestId: "d008ef46bb4f4cf19c9081ad50df33bd",
  error: {
    code: "ORDER_NOT_FOUND",
    status: 404,
    message: "没有找到订单",
    path: "/order",
    timestamp: 1555031270087,
    data: {
      orderId: "123456789"
    }
  }
}

5. 统一代码风格

除了Checkstyle以外,项目中有些通用的公共编码实践方式也需要进行统一。

  • 客户端的请求数据类统一使用相同后缀,比如Command

  • 返回给客户端的数据统一使用相同后缀,比如Represetation

  • 统一对请求处理的流程框架,比如采用传统的3层架构或者DDD战术模式

  • 提供一致的异常返回(请参考“异常处理”小节)

  • 提供统一的分页结构类

  • 明确测试分类以及统一的测试基础类(请参考“自动化测试分类”小节)

Reference

https://insights.thoughtworks.cn/backend-development-iteration0/



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,艿一口,点个赞!????

后端开发实践系列——Spring Boot项目模板 在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。 另外,我在工作中也会接触到很多既有项目,公司内部和外部的都有,多数项目的编码实践我都是不满意的。比如,我曾经新加入一个项目的时候,前... 阅读详情

相关推荐

AXI VIP配置全指南:从报错到成功仿真的完整流程(Vivado 2023版)

本文详细解析了在Vivado 2023环境中配置AXI Verification IP(VIP)进行协议仿真的完整流程。针对常见的include和import报错问题,提供了具体的解决方案和代码示例,指导用户从IP核创建、参数化配置,到构建可工作的仿真测试平台,最终实现成功仿真。

gpt4scribbler的博客 236

8个Java实践项目:平均半个小时就可干完~

最近有很多看过Java300集小伙伴私信我说推荐几个Java实践练手项目,在这里我收集了8个可以供大家在平时学习过程中进行练手的项目!平均每个项目,半个小时即可完成!!! 最近学习Java的小伙伴们快来练练看看自己的水平到什么地步啦! 大二、大三的宝宝们,你们的Java学的怎么样呢?快来检验一下!!! 我可是学习啦一遍和才你们分享的哦! Java项目: 为大家找到的这几款Java项目,都是我们都是我们生活中常用到系统项目,做起来会有生活的亲切感,能更好的学习和应用所学的Java内容,能够更

weixin_43390504的博客 1万+

内部威胁论文阅读笔记(CMU-CERT专场)

在网上看了很多介绍该数据集的博客,一直有个疑问,这个数据集的标注在哪,本着先入为主的想法结合现有的资料对这个数据集的结构做了一下猜测(可能还是不严谨和正确)1.标注在哪2.什么是密集针模型3.场景文章连接内部人员由于可以绕过安全检测发起攻击,通常最有害的攻击被认为是内部人员发起。通过分析用户行为来检测内部威胁,主要分析一些类时间和活动进行特征选择。选择特征向量用于训练。采用cmu-certr4.2用于训练。提出的算法与。

Jerry的博客 2805

12个Java实践项目:练完变学神

【尚学堂Java游戏项目“超级玛丽“】Java实战教程 最近有很多看过java300集小伙伴私信我说推荐几个Java实践练手项目,在这里我收集了12个可以供大家在平时学习过程中进行练手的项目! 尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受https://www.bilibili.com/video/BV1qL411u7eE 11.4万2054 尚学堂官方 最近学习Java的小伙伴们快来练练看看自己的.

weixin_43390504的博客 1万+

RGB接口电容触摸屏驱动(一)模块介绍

RGB接口电容触摸屏驱动(一)模块介绍

杰克拉力船长个人博客 7880

华为OD机试双机位C卷-员工派遣(Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷【员工派遣】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试- 员工派遣,华为OD机考 - 员工派遣。

qq_45776114的博客 1671

Java 后端开发实践 - 项目模板(16 步)

本文通过一个示例项目谈及到了项目之初开发者搭建后端工程的诸多方面,其中的绝大多数实践均在笔者的项目中真实落地。读完本文之后你可能会发现,文中的很多内容都是很基础很简单的。没错,的确没有什么难的东西,但是要系统性地搭建好后端项目的基础框架却不见得是每个开发团队都已经做到的事情,而这恰恰是本文的目的。最后,需要提醒的是,本文提到的实践方式只是一个参考,一方面依然存在考虑不周的地方,另一方面示例项目中用到的技术工具还存在其他替代方案,请根据自己项目的实际情况进行取舍。httpshttpshttps。...

m0_67698950的博客 4555

YOLOv11改进策略【模型轻量化】| 替换骨干网络为 GhostNet V1 基于 Ghost Module 和 Ghost Bottlenecks的轻量化网络结构

本文记录的是基于的YOLOv11网络模型轻量化方法研究。GhostNet中的Ghost模块和Ghost瓶颈结构是其轻量化的关键。Ghost模块克服了传统卷积层计算资源需求大的问题,Ghost瓶颈则合理设计了通道数量的变化以及与捷径连接的方式,能更好地在减少计算成本的同时保持较高性能,从而提升模型在移动设备上的应用能力和效率。

Limiiiing的博客 1431

个 java的_20个Java练手项目,献给嗜血如狂的你

给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础、JDK、JDBC、正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习。最后再通过有趣的练手项目进行巩固。JAVA基础1.Java编程语言(新版2. Java进阶之设计模式3. JDK 核心 API4. MySQL 基础课程5. 正则表达式基础6. JDBC 入门教程J2SE & SSH框架7. Java 函数式...

weixin_29063979的博客 1364

【技术科普】破解政务跨系统数据壁垒!亘川一网统管平台多源数据同步技术解析

本文解析亘川一网统管平台多源数据同步技术,针对政务跨系统数据壁垒难题,介绍组件的数据采集、校验、审计留痕等核心能力,结合营商环境项目落地案例,对比传统开发模式差异,讲解开源组件的实践价值,为政务项目开发者提供落地参考。

weixin_67440240的博客 637

YoloV8改进策略:基于双层路由注意力的视觉Transformer提升YoloV8的检测能力

本文使用2023年最新提出的BiFormer,实现对YoloV8的改进。目前,BiFormer还有在显存占用,还有性能存在问题。我们先试试效果,期待作者在Pytoch上早日实现优化。论文链接:https://arxiv.org/abs/2303.08810代码链接:https://github.com/rayleizhu/BiFormer作为视觉transformer的核心构建模块,注意力是捕捉长程依赖关系的强大工具。

m0_47867638的博客 2845

Java项目开发全流程实践

具体选择什么样的设计模式,需要根据程序(系统)所处的环境、技术、资源来决定,例如:一个程序(系统)在交付日期已经确定,项目进度紧张,而技术和人力资源又出现问题的情况下,应以设计实用性、编程效率方面考虑,反之则应从可维护性和扩展性上考虑。算式计算用例包含5个子用例,其中用例、用例、用例和使用者有交互行为,用例和用例为内部用例,由用例调用并使用,用例扫描算式,如果发现算式错误,由算式求解返回错误给使用者。

weixin_53791735的博客 530

Agentic RL: 大模型后训练 SFT、PPO和GRPO

本文介绍了从LLM训练到Agentic RL的发展过程。传统LLM训练包括预训练和后训练两个阶段,其中后训练通过监督微调、奖励建模和强化学习等技术优化模型表现。针对智能体在复杂任务中的不足,提出了Agentic RL新范式,将LLM嵌入强化学习框架,通过多步交互、工具使用和环境反馈来优化长期目标。相比传统单轮对话优化(PBRFT),Agentic RL具有状态包含历史上下文、行动类型多样、动态状态转移等特点,更适合解决需要多步推理和规划的任务。这种新方法为开发更强大的智能体系统提供了可能。

Cachel Wood的博客 700

Java后端开发实践-项目模板

整理出一套公共性的项目模板,旨在尽量多地包含日常开发所需,减少开发者的重复性工作以及提供一些最佳实践。 从写好README开始 一个好的README给人以项目概览,可以使新人快速上手项目,并降低沟通成本,建议包括: 项目简介 一两句话描述该项目实现的业务功能 技术选型 项目的技术栈,包括语言,框架,中间件等 本地构建 列出本地开发过程中所用到的工具命令 领域模型 核心的领域概念,针对于当前系统所在的领域 测试策略 自动化测试如何分类 技术架构 技术架构图 部署架构 部署架构图 外部依赖 项目运行时所以来的

m0_52184104的博客 593

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java 后端开发 HR 面试回答模板

摘要: 本文为Java开发者的求职面试模板,适用于有微服务项目经验的候选人。内容涵盖个人介绍、职责描述(基于若依微服务框架开发汽车租赁系统,集成Netty/JT808协议、高德地图等)、技术亮点(协议解析优化、Redis/Kafka性能提升)、离职原因与发展诉求。重点突出STAR法则的项目成就(如将JT808协议解析延迟从500ms降至50ms),以及技术栈与岗位的匹配度(SpringCloud、物联网协议、AI技术探索)。同时包含职业规划(技术专家路线)、团队协作案例(接口设计优化)及反问建议(团队技术栈

2503_94519591的博客 700

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

后端开发实践:Spring Boot项目模板

来源:cnblogs.com/davenkin/p/spring-boot-template.html在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施...

java思维导图 323

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

告别本地环境灾难:Java 后端实战 Sealos DevBox,一套云端开发到上线完整闭环

新同事入职,配置 JDK8/17、Maven、Redis、MySQL、中间件折腾 2 天,本地各种版本冲突;笔记本性能孱弱,同时跑项目 + Docker + 数据库,风扇狂转、卡顿崩溃;本地与测试、生产环境不一致,本地正常,一上测试就报依赖缺失、端口冲突;做完功能后打包、镜像、部署一套流程繁琐,还要手动配置域名、SSL 证书、K8s 资源。直到深度使用云端标准化 Java 开发环境 + 本地 IDE 无缝连接 + 开发完成一键打包镜像、直接部署上线。

qq_51321722的博客 423

【后端java】构建工具maven

通常是jar,除非你的文件是其他类型的包,如pom。是你的项目的Artifact ID。是你的jar文件的路径。是你的项目的组ID。是你的jar包的版本号。

qq_26127905的博客 462

SpringBoot项目,yml文件常用配置

SpringBoot项目,yml文件常用配置

质量不太好的博客 890

Springboot集成Thymeleaf模板

开发步骤1、在pom.xml中引入thymeleaf依赖2、编写html模板3、编写Controller方法4、效果测试 1、在pom.xml中引入thymeleaf依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter...

攀登Fox的博客 453
上一篇: SpringBoot 集成 Swagger-Bootstrap-UI,页面更清爽!
下一篇: 52 条 SQL 语句性能优化策略,建议收藏!
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值