本项目是完全基于Spring Boot 2.0版本和Spring Cloud Finchley所进行了开发的 目的是简化和统一微服务框架Spring Boot 2和Spring Cloud的使用方法
通过一定的规则来统一编写各种依赖的Starter,方便在企业内部进行规则的统一,配置的统一,用法的统一,监控的统一,部署的统一 方便再进一步的简化Spring Boot和Spring Cloud的使用,进一步分离通用框架代码和业务代码的耦合
Spring Boot 2目前版本是m7版本, 很快rc1版本就要发布, 大概2018年3月左右会发布RELEASE版本 对于之前使用Spring Boot 1.x的同学如果要进行升级到Spring Boot 2的话,需要改动的地方还是很多的
- Spring Boot 2是完全基于java8,这也就证明了java8已经被大家全面接受和普及, 虽然java9也已经发布, 但是java9的普及可能还需要一段时间,但是现在Spring Boot 2也同时对java9做了一些支持。
- http请求方面, 引入了Webflux, 他是基于Spring Webflux, 它是一个新的非堵塞函数式 Reactive Web 框架,可以用来建立异步的,非阻塞,事件驱动的服务,并且扩展性非常好。性能对比于之前的同步方式有了一定的提高
- db方面,默认引入了HikariCP,替代了之前的tomcat-pool作为底层的数据库连接池, 对比于tomcat-pool, HikariCP拥有更好的性能,总而言之就是提高了db的访问速度。
- redis方面, 默认引入了Lettuce, 替代了之前的jedis作为底层的redis链接方式, 同样Lettuce底层基于netty框架,使用异步的方式,访问redis,并且如果结合之前的Webflux, 可以达成请求的全异步, 同样对比于之前的jedis,统一了redis和redis-cluster的访问方式,简化了开发人员的使用方式,同时也提高了redis的访问速度
- es方面,默认也从之前的支持es2升级到了es5+, es5也出来了一段时间, 大部分的人应该也是通过自己实现来完成es5的对接, 现在springboot2也是进行了es5的支持。
- metrics方面,Spring Boot 2引入了Micrometer,来统一metrics的规范,使得开发人员更好的理解和使用metrics的模块,而不需要关心对接的具体存储是什么东西。
- Spring Boot 2 同时也加入了 对于OAuth 2.0的支持, 使得开发人员更加友好的和方面的使用spring-security来完成权限模块的开发
- pom.xml中加入parent
<parent>
<groupId>com.github.lord-of-code</groupId>
<artifactId>loc-framework-starter-parent</artifactId>
<version>0.1.1.RELEASE</version>
<relativePath/>
</parent>
- pom.xml中指定仓库地址(因为Spring Boot 2在中央仓库还没有,所以需要指定仓库)
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
- pom.xml加入相关插件(插件打出的uber.jar可以直接通过
java -jar uber.jar
来启动)
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
具体代码可以参考
- springmvc
- logger
- shutdown
- jdbc
- mybatis
- okhttp
- redis
- keycloak
- ...
- 增加了http请求的accesslog的记录的Filter,记录的request和response的关键信息
- 添加了ExceptionHandler,增加了异常情况的处理
- 添加了统一的Response返回的数据格式
private int code; #返回的状态码
private String msg; #返回的信息,用于前端进行展示
private String detailMsg; #返回的详细信息,用户内部调试和排查问题
private T data; #返回的具体数据(泛型)
- 添加了统一的业务异常类
LocCommonException
对于抛出这种异常框架会进行转换,这种异常为业务异常,返回的response status为200, 返回的code码可以根据业务情况自行定义
- response状态码大类分类
2xx 正常返回, 通过LocCommonException抛出的异常
4xx 客户端请求失败,如http method错误,参数错误,MediaType错误 等
5xx 服务端错误,如Runtime Exception错误 等
- 加入了cors跨域相关的Filter的配置
loc.web.springmvc.cors.enabled: false #默认为false,默认不开启cors跨域的配置, 如果要开启,改成true
loc.web.springmvc.cors.allowOrigins: #默认为*, 可以通过数组进行添加
- ...
- ...
loc.web.springmvc.cors.allowHeaders: #默认为*, 可以通过数组进行添加
- ...
- ...
loc.web.springmvc.cors.allowMethods: #默认为*, 可以通过数组进行添加
- GET
- POST
- ...
loc.web.springmvc.cors.allowExposeHeaders: #默认没有,可以通过数组进行添加
- ...
- ...
- 加入了swagger的相关配置
loc.web.springmvc.swagger2.enabled: true #默认为true, 表示是否开启swagger功能
loc.web.springmvc.swagger2.apiinfo.title = "project title";
loc.web.springmvc.swagger2.apiinfo.description = "project description";
loc.web.springmvc.swagger2.apiinfo.version = "v1";
loc.web.springmvc.swagger2.apiinfo.termsOfServiceUrl = "https://github.com/lord-of-code/loc-framework";
loc.web.springmvc.swagger2.apiinfo.contactName = "loc project";
loc.web.springmvc.swagger2.apiinfo.contactUrl = "https://github.com/lord-of-code/loc-framework";
loc.web.springmvc.swagger2.apiinfo.contactEmail = "[email protected]";
loc.web.springmvc.swagger2.apiinfo.license = "project license";
loc.web.springmvc.swagger2.apiinfo.licenseUrl = "https://github.com/lord-of-code/loc-framework";
loc.web.springmvc.swagger2.restapi.basePackage #扫描的包路径,默认为all
loc.web.springmvc.swagger2.restapi.paths #扫描的paths,默认为all
- 统一了logger的输出格式,主要考虑到后续的日志采集、统计、分析的统一
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] %-5level %logger{50} - %msg%n
- 默认了logger的输出,分为console和file,默认的file存储在
/tmp/loc.log
目录,可以通过配置文件logging.file
进行修改 - 日志按小时进行切割,切割后存放目录,默认是
./logs
目录,可以通过logging.path
进行修改 - 日志文件备份默认存放720小时(30天)
- 完成了tomcat的优雅停机策略
loc.tomcat.shutdown.enabled: true #默认优雅停机策略是打开的
loc.tomcat.shutdown.waitTime: 30 #默认30s的优雅停机等待时间,超过时间强行关闭
- springboot从2.0开始使用HikariCP作为默认的DataSource 关于HikariCP的配置可以参考官方配置文档
程序启动的时候,通过实现BeanFactoryPostProcessor
接口,来读取配置文件里面特定的字段来实现多数据源的加载
loc.dataSource:
firstDs:
username: root
password:
jdbcUrl: jdbc:mysql://127.0.0.1:3306/test
jdbcPool:
maximumPoolSize: 30
driverClassName: com.mysql.jdbc.Driver
因为都是通过手动进行读取的配置然后加载的,而没有走默认的DataSourceAutoConfiguration
和DataSourceTransactionManagerAutoConfiguration
所以在使用的时候exclude
排出掉DataSourceAutoConfiguration.class
和DataSourceTransactionManagerAutoConfiguration.class
-
通过利用log4jdbc给HikariCP做相关的日志记录 关于log4jdbc的配置可以参考log4jdbc定义文件
-
可以通过logging级别来控制数据库日志的输出
logging.level.jdbc:
sqlonly: OFF
sqltiming: INFO
audit: OFF
resultset: OFF
resultsettable: OFF
connection: OFF
-
mybatis的starter依赖了jdbc的starter, 所以一些配置是使用jdbc的配置
-
mybatis的starter同样支持多数据源的配置
-
mybatis的starter支持xml配置文件和注解的两种配置方式具体使用方式可以参考samples里面的:
- myabtis的starter新增了和数据源相关的配置, 默认值都为null
loc.dataSource:
firstDs:
configLocation: # datasource对应的mybatis-config.xml文件
basePackage: # 接口所在的项目包
mapperLocations: #
typeAliasesPackage: #
executorType: #
configurationProperties: #
configuration: #
- mybatis的starter新增了分页插件的相关的全局配置
loc.pagehelper:
helperDialect = "mysql";
offsetAsPageNum = false;
rowBoundsWithCount = false;
pageSizeZero = false;
reasonable = false;
params = "pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero";
supportMethodsArguments = false;
autoRuntimeDialect = false;
closeConn = true;
- 加入了okhttp的client的构造,用于发起http请求,并且用于记录请求和回应的日志
loc.okhttp:
connectTimeout: 5000
readTimeout: 30000
writeTimeout: 30000
retryOnConnectionFailure: true
followRedirects: true
followSslRedirects: true
connection:
maxIdleConnections: 5
keepAliveDuration: 60000
level: BASIC # 记录请求日志级别
-
修改了一下cache manager的序列化方式, 把默认的value的序列化方式从jdk的序列化方式改成了json的序列化方式, 主要是为了方便redis存储数据的可读性
-
重新封装了cache manager的使用方式,对于redis不可用的时候,还可以继续进行后续操作,认为缓存是可能出问题的,但是不会影响具体的业务逻辑操作
-
下列事例配置参数
spring:
cache:
redis:
time-to-live: 100s
redis:
host: 127.0.0.1
port: 6379
timeout: 2s #操作超时的情况,默认60s
# cluster.nodes:
# - 10.10.3.51:2001
# - 10.10.3.51:2002
# - 10.10.3.51:2003
lettuce:
pool:
max-active: 10
max-idle: 10
max-wait: "1000"
- keycloak是一个开源的统一认证的安全框架, 现在由于框架是基于springboot2进行开发的,keycloak-springboot-adapter的是基于springboot 1.x的版本来做的,所以出现了无法使用的情况,这个问题已经上报给keycloak官方了
- 等待keycloak针对springboot2提供了adapter后会继续进行跟进此模块
如果你想了解最新的一些功能和改动,可以通过编译源码来进行使用和测试
- 如果使用mvn wrapper来进行编译,你需要确保使用的JDK版本为1.8以上
$ ./mvnw clean install
- 如果使用mvn来进行编译,你需要确保使用的mvn为Apache Maven v3.5.0 +
$ mvn clean install
- 如果使用windows系统,编译的时候需要跳过测试
$ mvn clean install -Dmaven.test.skip=true
Loc Framework is Open Source software released under the MIT license.