在之前的文章中已经陆陆续续讲解了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生产者和消费者,配置如下:
生产者服务:
消费者服务: