在之前的文章中已经陆陆续续讲解了Java开发的一些基础知识,今天来整合这些知识,从无到有完整地搭建一个小型项目,把所讲解的内容逐一融合进去。技术选型是Spring+SpringBoot+Mybatis+MySQL+Maven+Redis+Kafka+Zookeeper+Junit。

打开网易新闻 查看精彩图片

一、框架选型说明

先简单地阐述一下我选择这套框架的原因:

1、总体框架是SSM,即Spring+SpringBoot+Mybatis,Springboot是一个微服务框架,延续了spring框架的核心思想IOC和AOP,简化了应用的开发和部署。再搭配Mybatis,简单易上手,目前又有很多的插件来实现自动生成代码,解决了代码繁琐的问题,更多的只关注于核心业务。

2、数据库使用MySQL开源数据库,比较适合个人开发,部署起来也比较容易,前面已经介绍了使用docker-compose可以快速地搭建mysql服务。

3、缓存数据库使用Redis,可以由浅到深,从单机版的redis再到集群版的redis,不断地加强个人对redis的理解和掌握,不管是windows还是linux,不管是单节点还是集群,小编都有接触和实战过,最终还是倾向于使用docker-compose进行部署安装,配置简单操作方便。

4、使用maven作为依赖,来快速地引入jar包进行开发,自动构建部署,参考之前详细的描述《Maven项目管理工具的介绍和使用》

5、集成junit单元测试框架,用于编写和运行可重复的测试,方便调试,参考《SpringBoot框架集成JUnit单元测试》

6、服务通信,使用消息队列MQ,这里使用Kafka,跟redis类似,我们从单机版再到集群版学习逐渐提升拔高,3.0版本目前还不是特别成熟,因此我们使用2.0版本,需要搭配Zookeeper一起使用,使用zookeeper来保存Kafka的元数据、监控Broker和分区的存活状态,并利用ZooKeeper来进行选举,参考《docker-compose部署Kafka》

本次搭建的是一个比较简单的独立小项目,因此暂时不考虑集群和多服务的场景,如果服务较多的话,建议使用注册中心统一管理,可以使用dubbo+zookeeper,再配合haproxy或者nginx,这些之前已有讲解。

二、开发工具和版本

小编使用的是市场上比较通用的一些开发工具,这个按照个人习惯和熟练度,仅作为参考:

1、代码开发工具,使用 IntelliJ IDEA。

2、MySQL使用5.7版本或者8.0版本均可,这两个版本有一定差异。根据官方说法,MySQL 8 要比 MySQL 5.7 快 2 倍,我这里主要搭建框架,暂不论证性能问题。客户端使用navicat 作为可视化工具,方便执行增删改查。可以使用 select version();命名查看MySQL的版本。

打开网易新闻 查看精彩图片

3、jdk使用jdk 8 或者 jdk 11。这两个版本都是稳定版本。可以使用 java -version (或者javac -version)命令查看版本。

打开网易新闻 查看精彩图片

4、redis 客户端可以使用Redis Desktop

打开网易新闻 查看精彩图片

三、框架搭建

1、创建SpringBoot项目

(1)首先打开 IntelliJ IDEA 编辑器创建项目,选择File ->New ->Project,选择 Spring Initializr,选择jdk版本,点击Next。

打开网易新闻 查看精彩图片

(2)配置项目信息,Artifact为项目名称 ,group为项目组名,language设置为java ,packaging为打包方式(可选择Jar或者War),注意Type选择Maven Project(我们搭建的是Maven项目)。

打开网易新闻 查看精彩图片

(3)选择相应的依赖,选中Lombok、MyBatis、MySQL驱动、Redis、Kafka,当然也可以自己导入,注意默认导入的可能存在版本不匹配的问题,不太推荐这种方式引入依赖。

打开网易新闻 查看精彩图片

(4)输入项目名称,创建完成,点击Finish

打开网易新闻 查看精彩图片

2、项目配置

项目刚开始搭建完成时,只有一个配置文件application.properties,并且这个配置文件一开始是没有任何内容的,我们把需要的配置加上去,配置文件可以是application.properties格式,也可以是application.yml格式,小编更倾向于application.yml格式,层次更清晰。

项目配置主要包含以下几个方面的内容:

(1)项目的名称、上下文、端口号;

(2)MySQL数据库连接的类型、地址、端口号,以及用户名和密码;

(3)缓存redis数据库连接的ip、端口,密码等,注意redis的单机版和集群版配置差异较大;

(4)日志文件的配置,需要单独配置一个日志的配置类文件logback-spring.xml

(5)mybatis的配置

(6)kafka消息队列的配置

综上,application.yml的配置内容如下:

打开网易新闻 查看精彩图片

日志的配置类文件logback-spring.xml内容如下:

打开网易新闻 查看精彩图片

3、代码集成

编写代码时,我们往往按照entity->Controller->Service/ServiceImpl->Dao->Xml这样的层次来编写业务模块,其他的还会涉及配置模块Config以及工具类Util。

打开网易新闻 查看精彩图片

整体结构如下,逐一在过程中根据提示引入maven仓库的jar包:

打开网易新闻 查看精彩图片

接下来我们注意看下每个模块的配置:

(1)启动类SpringBootDemoApplication(命名没有特殊要求)

我们要在外层(相对于config、controller这些文件夹来说的,就是跟controller包同级)写个启动类SpringBootStart。启动main方法,为什么要在controller包同级的地方写个启动类SpringBootStart,这是为了让SpringBootStart处于最外层,这样他能够读取到Controller里面所有的配置文件,当然啦,你也可以在controller下面去写启动方法,不过这样不利于后面测试,因为你每写一个controller都需要改SpringBootStart方法

打开网易新闻 查看精彩图片

(2)controller类详细信息如下:

打开网易新闻 查看精彩图片

(3)service接口层

打开网易新闻 查看精彩图片

serviceImpl接口实现层

打开网易新闻 查看精彩图片

(4)dao层

打开网易新闻 查看精彩图片

(5)集成mybatis

刚开始创建Maven类型Springboot框架项目的时候,已经添加了Mybatis依赖,也可以手动在pom.xml中添加mybatis的jar依赖。以下是pom.xml文件中添加的所有依赖。

打开网易新闻 查看精彩图片

然后在resources下创建mybatis文件夹,编写xml文件,主要就是SQL语句。

打开网易新闻 查看精彩图片

4、运行项目

启动项目,配置启动服务SpringBootDemoApplication

打开网易新闻 查看精彩图片

使用右侧的maven快捷进行清理、编译和打包,本地运行时先不用打包,运行后控制台会打印相关日志。

打开网易新闻 查看精彩图片

5、集成AOP

(1)pom.xml中已添加spring切面aop依赖

(2) 创建日志实体类

打开网易新闻 查看精彩图片

(3) 使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类

打开网易新闻 查看精彩图片

(4) 创建aop切面实现类

打开网易新闻 查看精彩图片

写入日志表,需要编写SysLogService和dao层以及xml层,这个跟其他业务的写法类似,这里不做赘述。

(5) 在需要监控的方法上添加 aop的自定义注解

格式为 @+自定义注解的类名 例如:@MyLog

打开网易新闻 查看精彩图片

6、事务回滚

(1)、启动类添加注解@EnableTransactionManagement 开启事务支持。

(2)、在方法上添加注解@Transactional

如果想要对抛出的任何异常都进行自动回滚(而不是只针对RuntimeException),需要在使用@Transactional(rollbackFor = Exception.class),并throw抛出。可参考上面添加AOP的例子中的手动事回滚。

7、集成Junit

在test目录下,编写Junit测试类,需要在maven引入junit依赖包,示例如下:

打开网易新闻 查看精彩图片

8、集成Redis

(1)首先编写redis静态变量配置类(基于我使用的Redis哨兵集群),后面需要用到这里的参数。

打开网易新闻 查看精彩图片

(2)Redis配置类

打开网易新闻 查看精彩图片

(3)redis 带有分片的哨兵连接池

打开网易新闻 查看精彩图片

(4)redis 服务实现

打开网易新闻 查看精彩图片

9、集成Kafka

主要是Kafka生产者和消费者,配置如下:

打开网易新闻 查看精彩图片

生产者服务:

打开网易新闻 查看精彩图片

消费者服务:

打开网易新闻 查看精彩图片