背景
此篇给公司研发部新入职的后端java开发程序猿使用,帮助新人快速上手,避免口口相传和从代码中找规范。当然老员工也可以看看,加深对项目结构的理解,如有不对,欢迎指出。
先看框架代码,git地址在此
样例项目基于SpringBoot和SpringCloud框架,SpringBoot采用的是1.5.12.RELEASE版本,SpringCloud版本是Edgware.SR3,Java版本1.8。
微服务架构图
下图是一个SpringCloud微服务环境。这其中有网关、注册中心、配置中心和各业务项目。业务项目在启动时从配置中心获取配置,并将自己注册到注册中心中,业务项目之间通过Feign来进行接口调用。
一个已登录的用户从前端发来的HTTP请求会携带jwt,jwt在网关解密成userId和role并放入HTTP请求的header,然后转发给各业务项目。业务项目无需操作jwt,只需专注业务处理。
代码结构
先来看看代码包结构,如下图
java代码:
- api:供微服务环境下其他微服务调用的接口
- bean:java bean对象,一般会与数据库中的某张表对应
- common:一些公共处理的类,包括自定义异常,异常处理,接口返回对象,Aop日志打印等
- config:一些配置类,包括Redis配置、MQ配置、数据库配置、线程池配置等
- controller:SpringMvc中的控制器,处理前端过来的请求
- dao:数据访问层,包里是MyBatis的interface
- mapper:供Mybatis用的SQL语句
- remote:微服务接口访问层,包里是Feign的interface
- service:定义服务接口类
- service.impl:服务实现类,实现主要的业务逻辑
- util:一些工具类
配置文件:
SpringBoot的配置文件有两种,application.properties和bootstrap.properties,bootstrap访问优先级高于application。项目中主要的配置从SpringCloud的配置中心获取,配置中心的url、端口、获取配置中心哪些配置文件必须配置在bootstrap.properties中。以下是配置文件说明:
- templates:代码自动生成器的模板文件
- application.properties:定义了项目独有的一些配置
- bootstrap.properties:就一个配置,spring.profiles.active,指定使用哪个配置文件来运行当前项目
- bootstrap-xxx.properties:xxx指对应的环境,文件定义了从对应环境配置中心的地址获取配置。可以通过http://domain:8761/baseConfig/dev来查看配置文件的内容。其中domain是配置中心对应的ip地址,baseConfig是配置文件名,dev是运行环境。
- logback-spring.xml:日志打印配置文件,运行配置和springProfile相对应
- mybatis-config.xml:mybatis一些基础配置,运行时会加载
说明
过滤器。AuthFilter,它的功能就是将header中的userId和role塞入HttpServletRequest,这样在controller中就可以直接在方法上定义userId和role,如下是示例。这其中userId和role是在网关gateway中解密jwt而来的,然后塞入请求的header。
RequestMapping("/sysUser")
public MyResEntity sysUser(Integer userId){
SysUser sysUser = sysUserService.sysUser(userId);
return new MyResEntity(sysUser);
}
MyBatis配置和使用。MyBatis的配置在config包里的MyBatisConfig.java中,其中加入了一些Druid数据源的配置。MyBatis使用样例可查看TestService和TestMapper两个类。
Redis配置和使用。Redis的配置类在config包里的CacheConfig.java中,其中要注意的是需要在expiresMap中加入需要使用的key的超时时间。Redis的使用样例可查看RedisDemoService这个类。
MQ配置和使用。MQ的配置类在config包里的MqConfig.java中。MQ的使用样例可查看MqDemoService这个类。目前我们使用的MQ只有一个topic,通过tag来区分不同的业务。
OSS配置和使用。OSS的配置和一些基础方法在util包的OssClient.java中。其中OSS的使用分为前端上传和后端上传两种,两种上传的样例代码可查看OssController。
日志。日志配置在logback-spring.xml中,通过springProfile来对应SpringBoot的运行环境。目前在RestControllerAop中已info级别打印了每个请求的参数、返回结果、响应时间等,在MyExceptionHandler中以error级别打印了异常日志。
异常处理。若是已知的自定义异常,抛BaqiException。BaqiException有两个参数,code和message,对应返回码和错误信息。所有的Exception都在MyExceptionHandler类中处理,不同的Exception对应着MyExceptionHandler中不同的方法,会有不同的处理。
接口暴露及访问。使用的是SpringCloud的Feign组件。需在启动类上增加@EnableDiscoveryClient和@EnableFeignClients两个注解。微服务中暴露的接口在api包中,调用其他微服务接口的实现在remote包中。
代码自动生成。生成器为MyBatisPlusGenerator.java,这是个main方法,可直接执行,需要填入数据源配置和包路径。执行完成后生成了bean、dao、service、controller层的代码,包含了基础的增删改查和查列表方法。
单元测试。单元测试类在test包中,使用的是JUnit,基础方法在BaseJunitTest中,样例代码可查看PatientControllerTest类。
Idea一些配置
设置vm options和Environment variables。项目启动多了后,特别占内存,可以在Run/Debug Configurations中设置启动参数。另外,可在配置中指定启动的配置文件,如下图所示: