第1节 前言
1 背景:
2018.8需要为新公司的某项目中某部分逻辑独立出来当作独立服务器,为以后的分布式做准备。有些框架我也是第一次用,所以在此整理了我做的项目,并做出详细的讲解,此项目基本包含了现在web后端服务的最新框架(需要用到哪部分,直接去对应章节拿就行,当然你要是觉得好,要赏我,我也同意)。
github源码地址: https://github.com/gyb123456/MySpringBootFrame
源码里面还有我这里没说的知识点,比如普通类如何获取spring的bean,调用里面的方法的(因为不能用自动注入@Autowire的方式)
2 框架
项目:前后端分离
后端:Springboot2.0+Spring+Mybatis+Redis+Socket+Log4J+Maven
前端:vue+node(编译后放在tomcat中运行)
3 运行环境
开发电脑:win7
JDK:1.8(Springboot2.0需jdk为1.8以上!!!)
Tomcat:8
本机:用的maven的spring-boot-starter-tomcat插件
正式服:docker的tomcat镜像跑的jenkins自动部署的war包
开发工具:IDEA2018
Maven:3.5
4 持续集成:jenkins+docker
开发、打包发布流程:
5 调试工具:
http请求调试:postman工具
socket调试:sockit工具
6 吐槽:
1 有些人写文章都不知道把图截全了的吗,有些人写文章就说加上这段代码,然后仅仅把代码部分截图出来,丫的,到底该把你代码放到哪里,鬼知道啊
2 还有啥来着
第2节 项目源码讲解
* 重点来了,在上代码讲解之前,如果上面说的你不太懂,比如docker是啥,那最好先查下
* 为了防止有很多人下载源码后不能导入项目或者各种奇怪问题,我在github已经将整个项目的内容全部上传了,这是本地项目文件目录结构如果运行不了,注意一定要保持配置环境啥的和我一样,比如jdk1.8,maven3.5
* 打开我的项目源码时,如果用的idea编辑器会发现service层的@Autowired注解会报红的,不影响运行。
1 项目目录结构:
第3节 配置
1 spring、SpringMVC配置
为啥用springboot呢?
1 还不是因为配置简单,免去配置application.xml文件,xml文件我看着难受,有点丑
2 也不用配置SpringMVC扫描注解的包,你创建项目时,选择spring 时,人家自动给你搞好了!我就问你,你能不去百度,直接对着xml文件,撸出来类似这样的东西吗?
你直接在Application启动类的平级目录建一个包,写controller、service、dao层就ok了。项目一运行,浏览器上输入ctrl层地址就能访问了,不像以前还要各种配置
注意:包要在Application启动类的平级目录,因为springboot默认会扫描Application启动类的平级目录的所有包和子包,被坑过才知道
如何新建springboot项目?看我这篇 IDEA新建springboot的Web项目
2 springboot多环境配置:
关于springboot的多环境配置和如何获取配置文件的值,我还专门写了一篇文章,相对这里会更详细: springboot多环境配置+如何获取配置文件的值
1 在application.properties文件平级新建这3个配置文件用来区分不同的开发环境,注意命名格式,原理是springboot会自动读取这种格式的文件,就不用你在再配置了,爽歪歪,很简单。
*application.properties里面就写通用的配置
*application-dev.properties里面就写dev环境的配置
2 在application.properties文件中用spring.profiles.active=dev来指定运行时的环境,但是企业级项目需要在源码相同的情况下,在maven编译打包时,根据maven命令传入的不同值进行动态打包,所以spring.profiles.active的值得是变量,用spring.profiles.active=@activatedProperties@解决
使用命令mvn clean package -Pdev就打包dev环境,我们需要根据这个值动态指定生效的配置文件,具体的看我源码,里面都写了注释的,大致内容如下:
3 配置pom.xml文件,添加如下代码,具体见我的https://github.com/gyb123456/SpringBoot2.0/blob/master/pom.xml文件
这里我用的是spring-boot-maven-plugin插件,就怕你们看不懂,来个详细说明吧,苦口婆心!
#特别说明!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#mvn打包命令是用的spring-boot-maven-plugin插件
查看打包时的打印信息,你会发现打包时还是依赖maven-compiler-plugin插件(好像会自动去下载这个)
spring-boot打包命令是:
mvn clean install spring-boot:repackage -Pdev
#或者不用spring-boot,用的maven-compiler-plugin插件
mvn clean package -Pdev
#或者不指定打包环境,则默认打包dev的
mvn clean package
遇坑:
1如果你打包不了,设置relativePath的值,参考我的pom
2可以用finalName属性设置打包后war包的名字,参考我的pom
tips:
我平时直接用的idea工具右侧的编译,很方便,点一下就ok了,如下:
3 mybatis、mysql 、redis配置 (注意配置后记得在pom中加上对应插件!!!)
本节第1步已经实现了通过浏览器能访问项目ctrl层,我并没有做任何配置。实际开发肯定要连数据库的,下面是配置:
我本来把数据库、redis等配置放到application.properties里的,因为自己开发,但是后来要区分dev、prod、preview等环境,我现在做的测试项目,所有数据库连的是一样的,就写到application.properties里吧。
application.properties或 application-dev.properties文件里添加如下代码:
# Mybatis配置
springboot会自动根据mybatis.的前缀去读取mybatis的配置:
#配置扫描的实体类路径
mybatis.typeAliasesPackage=com.demo.gyb.entity
#配置mapper路径,mapper是在resources目录下
mybatis.mapperLocations=classpath:mapper/**/*.xml
mybatis.dialect=MYSQL
#Mybatis就这样配好了,记得在pom中加上对应插件,插件见源码的pom
# mysql 配置
springboot会自动加载spring.datasource.*相关配置,数据源就会自动注入到sqlSessionFactory中
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=xxxxx
spring.datasource.username=xxxxx
spring.datasource.password=xxxxx
#mysql 就这样配好了,记得在pom中加上对应插件,插件见源码的pom
# redis配置
springboot会自动读取spring.开头的属性
spring.redis.database=1
spring.redis.host=xxxxx
spring.redis.port=6379
spring.redis.password=xxxxx
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=1000
#jedis连接池
###############################
#最大等待时间
#spring.redis.jedis.pool.max-wait=1000ms
##最小空闲数量
#spring.redis.jedis.pool.min-idle=1
##最大空闲数量
#spring.redis.jedis.pool.max-idle=10
##最大连接数量
#spring.redis.jedis.pool.max-active=1000
#redis就这样配好了,记得在pom中加上对应插件,插件见源码的pom
为了防止乱码,需配置序列化,配置类如下,具体代码见github:
redis的详细使用(如RedisTemplate)见测试类:
说明:config包下全是配置类,具体功能打开源码查看
4 Log4j配置
这里是log4j的配置,后期我又研究了log4j2配置和logback配置,你们可以看看
在resources目录下新建文件log4j.properties,注意名字必须是这个,springboot会自动识别此文件,网上说springboot里推荐的名字是类似spring-log4j.properties,我试下来是不行的。具体配置log4j.properties里面已经也得很清楚了,自己看去,记得在pom中加上对应插件,插件见源码的pom
配置的日志文件路径改为电脑根目录了,比如windows系统你的项目在D盘,log就会在D:/log/下,Linux会在/log/目录下,log的使用方法:
20180831更新bug
由于对log4j理解的加深,发现之前pom.xml里log4j部分的包不对
1 log4依赖的springboot的jar是 spring-boot-starter-log4
2 spring-boot-starter-web里是要去除springboot自身的日志jar的,之前去除的没写对
之前去除的是:
改成这样(github上已经更新了):
3 log4j.properties的配置也更新了,配置成只打印我需要的信息,如去除spring的、sql的、mybatis的,配制成只有报错时才打印,具体见github.
5 pom文件配置
具体配置详见源码,tomcat用的是spring-boot-starter-tomcat插件,可以直接跑项目,不需要自己再配置tomcat了
在我电脑上用idea右侧自带的maven工具点击运行即可
也可执行maven命令: mvn clean spring-boot:run -Pprod
遇坑
1 在我电脑上用idea右侧的工具点击运行,或者部署啥的都没问题,放到jenkins服务器上执行自动打包,报错原因jenkins上的jdk和maven版本和我电脑上的不一致导致的,jenkins服务器最后改成jdk1.8,maven是3.3.9版本(3.5版本执行不了,坑爹)
6 socket
未完待续(20180820)
更新20180919----------------
差不多1个月过去了,得到不少赞,所以继续更新下socket部分内容,正好最近研究这个
首先
我项目的socket入口部分在listen包里,项目启动后listen监听器(使用@WebListener注解)会自动执行,进而开启socket连接(总是忍不住字体加粗,怕你们不注意踩坑。。。。但是排版又不好看了)
socket部分的项目结构如下:
看我项目源码之前可以先参考下这个socket文章,先入门
更深一步的可以看下socket线程的理解
我在UpdateZNettyServer类里面指定了socket的端口是7073,所以服务跑起来以后,在sokit调试工具上可以这么测试
至于代码部分,我这篇文章是富文本模式,不适合贴代码,所以直接看我的源码和那个参考网址就差不多了
7 docker
看我的docker文集