前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从0到1,如何搭建一个好用的springboot开源项目

从0到1,如何搭建一个好用的springboot开源项目

作者头像
java思维导图
发布2019-10-14 23:39:26
1.3K0
发布2019-10-14 23:39:26
举报
文章被收录于专栏:java思维导图java思维导图

脚手架?

git社区有很多好用的开源脚手架项目,一般都是后台管理系统,比如renren-fast、guns等。这里我有两个疑问:

  • 为什么脚手架项目一般都是后台管理系统?
  • 为什么这样的脚手架项目会受到大家的追捧?

答:

因为每个项目都需要一个后台来管理所有资源,必不可少,其中权限模块,文件模块,监控模块、基础数据模块等是几乎是一个完善的后台管理系统的必备功能。而业务是不一定的,每个公司需要开发的业务都不一样,所以无法做到统一,这需要公司定制。

但虽然业务不一样,但是还有些技术上的实现是共同的,比如文件上传、token机制、预防攻击、防注入、动态数据源等等,这些很多业务技术支持上都需要用到,于是,脚手架系统就诞生了。

至于一个脚手架项目为什么会受欢迎,可以总结一下几点:

  • 可插拔式功能拓展,需要与不需要的功能通过一键注解或配置文件控制
  • 基础功能封装完善,可尽量少些代码
  • 安全、性能方面有考虑
  • 主流的框架组合、大量的文档可以搜索
  • 完善的项目文档,让开发者快速入手
  • 代码生成,提高基本功能的开发效率
  • 等等

所以,通常我们从0开始设计一个项目,一般也不会真正从0开始写代码,而是先选择脚手架,然后在基础上添加业务代码,这样可以大大提高项目的开发效率,从而减少成本。

好了,写了一堆的废话,下面我们去分析一下,一个脚手架项目具体需要什么功能模块,然后要做哪些封装,用什么技术能事半功倍。

技术选型

说到技术选型,得考虑一下项目需不需要做前后端分离的?现在很多公司都喜欢前后端分离,一套接口解决pc、app、h5等。从效率上来看的确挺好的,也是趋势。当然了,今天的这篇文章着重点也不会放在前端上,后端的封装才是我们重点之中的重点。

我们以前后端分离项目来选择技术:

前端

vue、vue-element-admin、layui

后端

基本框架:springboot、mybatis plus、shiro、Hibernate Validator、swagger2、quartz

数据库:h2、mysql

搜索引擎:elasticsearch或lucene

缓存:redis

工具集:hutool

身份校验:token或jwt

其他:lombok、Hibernate Validator

写出来之后,我想了想,好像这就是renren-fast了呀,还真是深入我心呀这项目。没关系,不影响我继续的分析,哈哈。

模块封装

好了,下面我分了好多模块,是我认为一个好用的脚手架项目应该具备的功能封装,有了这些之后我们可以直接上手业务代码。

框架整合

项目刚开始,当然是从0开始写代码,这时候我们首先要做的事情就是以springboot作为基础框架,集成第三方框架。

  • 集成mybatis plus
  • 集成shiro
  • 集成swagger2
  • 集成mysql数据库
  • 集成redis缓存

基于springboot集成框架其实都特别简单,一般3步走:

  • 1、导入框架starter的jar包
  • 2、编写必要config,如@EnableXXX、或者自定义Bean
  • 3、yml配置文件写配置,控制框架属性

所以框架集成相对简单,分分钟搞定,nice!

代码生成

ok,上面我们完成了框架,我们需要一个代码生成器,给我们生成一下基础的代码,比如entity、service、mapper等,因为我用的是mybatis plus,它给我们提供了一个代码生成器,所以我们直接使用这个代码生成器来生成代码。

  • 设计数据库表
  • 全局设置包名等参数,生成代码

有了controller这些之后,我们就可以开始编写业务代码了。

异常处理

说到异常处理,之前有篇文章,我详细讲解了异常处理的几种方式:

最常用的方式还是@ControllerAdvice+@ExceptionHandler组合,所以说到这里,我们给项目添加上全局异常处理机制,这样报错了之后我们可以返回统一的页面和json数据。那这里我就不再多说。

结果封装

说到结果封装,不得不提一下restful api,我们经常说rest风格的url更加容易理解和统一,其实不仅仅包括url的设计上需要动词+宾语的结构,请求的状态码也需要明确,而请求结果通常也是一串json数据,那么调用接口返回的结果通常是什么样子的呢?

我们可以看下阮一峰老师的《RESTful API 最佳实践》,返回的结果报文一般长下面的样子:

成功时:

代码语言:javascript
复制
HTTP/1.1 200 OKContent-Type: application/json
{  "status": "success",  "data": {        ...。  }}

失败时:

代码语言:javascript
复制
HTTP/1.1 400 Bad RequestContent-Type: application/json
{  "error": "Invalid payoad.",  "detail": {     "surname": "This field is required."  }}

当我们调用方是页面时候,处理状态码比较麻烦,所以通常会把状态放在json数据中,这样总结出来,结果封装它应该包括以下几个部分:

  • 请求状态码
  • 结果描述信息
  • 请求结果数据

写成实体类应该是这样:

代码语言:javascript
复制
@Data
public class Result<T> implements Serializable {
    private int status;    
    private String message;    
    private T data;
    
    ...  
}

但其实不是很多项目都喜欢这种方式,在业务看来,你只需要告诉我成功与否就行了,我不想去处理你这么多状态码,所以通常结果封装里面会有属性code替代status,而0代表成功,-1代表失败。于是成了这样:

代码语言:javascript
复制
@Data
public class Result<T> implements Serializable {
    private int code; // 0成功,-1失败    private String message;    private T data;
    
    ...
}

实体校验

上面我们说完了结果封装,有了结果vo之后,controller就可以返回统一格式的数据给前端,前端可以展示出列表、详情等页面,这时候如果涉及到表单提交,比如发布一篇文章,发布评论等。这时候我们需要做表单校验。而校验不仅仅前端需要,后端的表单字段校验更为重要。字段不符合要求通常会引起必要字段为空等状态。

前端的校验我们可以使用一些类似于jQuery Validate等js插件实现,那么后端我们可以使用什么来做校验呢?

如果表单需要校验字段比较少,我建议直接使用if条件判断一下就可以了。当字段比较多时候我们可以使用Hibernate validatior框架。

我们使用springboot框架作为基础,那么就已经自动集成了Hibernate validatior。

那么用起来啥样子的?

上面图中,通过在实体中添加Hibernate Validator校验框架的相关注解,另外,校验还可以分组,图上分为了AddGroup和UpdateGroup,为什么需要分组?因为保存和修改有时候需要校验的字段是不一样的!

然后通过下面代码可以校验实体:

代码语言:javascript
复制
Set<ConstraintViolation<Object>> constraintViolations =
validator.validate(object, groups);

constraintViolations为空时候,说明是符合要求的表单提交。

身份校验

所谓身份校验指的就是如何获取当前登录的用户,而通常只是获取到用户信息是还不过的,因为我们现在做的时候后台管理系统,会涉及到权限等模块,这时候我们需要集成shiro或者spring security框架,我比较喜欢shiro,简单易用。

如果涉及到负载均衡或集群,那么我们就需要提前做好会话共享,所以shiro集成redis。这时候我们可以使用一个第三方的整合包:

  • https://github.com/alexxiyang/shiro-redis

有了这个包之后我们只需要按照官方一下简单的配置即可。

有人说,如果我用了shiro框架,那么如果后面我要做单点登录,这怎么办?shiro能集成cas?

其实可以,有shiro-cas这么一个整合包,但这里我给你一个介绍一个更加好用的单点登录框架xxl-sso,我们项目可以集成xxl-sso。那么如何整合项目、xxl-sso、还有shiro呢?

这里会涉及到几个拦截器,因为shiro本身就是一系列的拦截器链,我们必须保证xxl-sso的过滤器在shiro过滤器前执行,所以应该这样配置:

  • xxlFilter:单点登录的拦截器
  • ssoFilter:单点登录与shiro集成实现自动登录的过滤器

这样,我们就保证了过滤器的顺序,只要保证了顺序之后,先通过xxl的拦截器,然后获取到了用户信息之后进入ssoFilter。

在shiro之中,有几个过滤器我们需要懂的,shiro的过滤器自NameableFilter之后都提供了一定的过滤逻辑,如OncePerRequestFilter、AdviceFilter、PathMathingFilter等。而其中说到shiro自动登录,我们就必须要想到这个过滤器:

  • AuthenticatingFilter:提供了一定自动登录逻辑的过滤器

ssoFilter只要继承了AuthenticatingFilter,然后在获取到xxlFitler上获取到的用户信息,然后封装成token调用executeLogin方法即可实现整合。

基本功能

好了,有了权限框架之后,我们就可以开发后台的基本功能啦,基本功能包括哪些?

  • 用户管理
  • 权限管理
  • 资源管理
  • 角色管理
  • 注册登录

这部分都是很基础的功能,我建议大家不要自己开发一遍了,做个优秀的搬运工,参考别人的代码,然后修改一下就好啦。

注意使用代码生成工具哈。

定时任务

说到定时任务,不知道都用过什么框架,其实很多开源项目都针对定时任务模块做了个系统,而定时任务我们完全可以抽取出来单独一个系统的,当然这里说从0到1,那么来介绍一下定时任务可以用啥来做吧:

  • 单机可以使用@EnableScheduling+@Scheduled
  • 集群可以使用Quartz

@Scheduled太简单了,给个导图你吧:

Quartz,有点东西,当定时任务服务做了分布式之后,我们必须保证定时任务之间不会重复运行。

而Quartz支持分布式,可以帮助我们实现分布式定时任务,一般我们可以通过数据库表来协调任务之间。

要弄懂quartz,我们先要弄懂quartz的三大组件,然后自己去找个例子来熟悉。

好了,我就不展开来讲了,每个模块的东西其实都很多。

我就吊吊你们胃口,别打我!

图片存储

  • 阿里云存储
  • 腾讯云存储
  • 七牛云存储
  • 本地存储

写个抽象类,然后搞不同的实现吧,通过配置选择具体的实现。

多数据源

说起多数据源,那也是一个项目重点,公司要发展通常都需要大量的用户,大量的用户就必须良好的系统支持,所以分布式是在所难免的演变过程。在一开始压力还不是特别大,我们可以做数据库主从结构,然后项目读写分离,这样我们减轻主库的压力,可以缓一缓项目的过度。

那么多数据源有多少种方式实现,我们说出至少4种,你信不信?

更高级一下的我还可以这样来:

总之呀,学不动!!!阿弥陀佛!

预防攻击

好了,项目基本框架搭建好了之后,还有一步别忘记,预防攻击,不可忽视的安全隐患预防!关于这个模块,我专门写过一篇文章,去看看吧,说不定能学点什么!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java思维导图 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 脚手架?
  • 技术选型
    • 前端
      • 后端
      • 模块封装
        • 框架整合
          • 代码生成
            • 异常处理
              • 结果封装
                • 实体校验
                  • 身份校验
                    • 基本功能
                      • 定时任务
                        • 图片存储
                          • 多数据源
                            • 预防攻击
                            相关产品与服务
                            对象存储
                            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档