本项目是完全基于Spring Boot2和Springcloud Finchley所进行了开发的,目的是简化和统一公司内部使用微服务框架的使用方法
本项目升级到基于Spring Boot 2.2版本和Spring Cloud Hoxton所进行了开发的
目的是简化和统一微服务框架Spring Boot和Spring Cloud的使用方法
通过一定的规则来统一编写各种依赖的Starter,方便在企业内部进行规则的统一,配置的统一,用法的统一,监控的统一,部署的统一
方便再进一步的简化Spring Boot和Spring Cloud的使用,进一步分离通用框架代码和业务代码的耦合
屏蔽一部分的基础内容,减少业务开发对底层基建处技术的了解, 更加专注于业务的开发
/actuator/**
, /v3/api-docs
, /webjars/**
)flatten-maven-plugin
插件pom.xml中加入parent
<parent>
<groupId>com.github.lord-of-code</groupId>
<artifactId>loc-framework-starter-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath></relativePath>
</parent>
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>
具体代码可以参考
docker-compose -f docker/mysql.yml up -d
端口为 3306
docker-compose -f docker/redis.yml up -d
端口为 6379
docker-compose -f docker/zk.yml up -d
端口为 2181, 2182, 2183
docker-compose -f docker/kafka.yml up -d
端口为 9092
docker-compose -f docker/es.yml up -d
端口为 9200
docker-compose -f docker/job.yml up -d
端口为 8899 用户名 root 密码 root123
docker-compose -f docker/zipkin.yml up -d
端口为 9411
docker-compose -f docker/keycloak.yml up -d
端口为 7777
docker-compose -f docker/influxdb.yml up -d #启动influxdb和grafana
loc-cloud-component
里面主要包括了eureka
、config
、sleuth
、zuul
等基础组件的docker部署
添加了统一的Response返回的数据格式,利用Problem来完成response的返回数据结构
请求日志的相关配置
logbook:
filter.enabled: true
format.style: json
exclude:
- /acutotor/**
- /admin/**
write:
category: com.loc.framework.accesslog
level: INFO
max-body-size: 2048
加入了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 = “dragonlong1986@126.com”;
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的starter统一日志标准(依赖logback日志框架)
* 统一了logger的输出格式,主要考虑到后续的日志采集、统计、分析的统一
[%d{yyyy-MM-dd HHss.SSS}] [%t] [%X{traceId}] %-5level %logger{50} - %msg%n
* 默认了logger的输出,分为console和file,默认的file存储在`./logs/loc.log`目录,可以通过配置文件`logging.file`进行修改
* 日志按小时进行切割,切割后存放目录,默认是`./logs`目录,可以通过`logging.path`进行修改
* 日志文件备份默认存放720小时(30天)
## shutdown的starter来进行优雅的停机操作
* 完成了tomcat的优雅停机策略
loc.tomcat.shutdown.enabled: true #默认优雅停机策略是打开的
loc.tomcat.shutdown.waitTime: 30 #默认30s的优雅停机等待时间,超过时间强行关闭
## jdbc的starter的统一标准
* springboot从2.0开始使用HikariCP作为默认的DataSource
关于HikariCP的配置可以参考[官方配置文档](https://github.com/brettwooldridge/HikariCP)
程序启动的时候,通过实现`BeanFactoryPostProcessor`接口,来读取配置文件里面特定的字段来实现多数据源的加载
loc.dataSource:
firstDs:
username: root
password:
jdbcUrl: jdbc//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定义文件](https://github.com/lord-of-code/loc-framework/blob/master/loc-autoconfigure/src/main/resources/META-INF/spring-configuration-metadata.json)
* 可以通过logging级别来控制数据库日志的输出
logging.level.jdbc:
sqlonly: ‘OFF’
sqltiming: INFO
audit: ‘OFF’
resultset: ‘OFF’
resultsettable: ‘OFF’
connection: ‘OFF’
## mybatis的starter的统一标准
* mybatis的starter依赖了jdbc的starter, 所以一些配置是使用jdbc的配置
* mybatis的starter同样支持多数据源的配置
* mybatis的starter支持xml配置文件和注解的两种配置方式具体使用方式可以参考samples里面的:
1. [mybatis-xml例子](https://github.com/lord-of-code/loc-framework/tree/master/loc-samples/loc-framework-mybatis-xml-sample)
2. [mybatis-annotation例子](https://github.com/lord-of-code/loc-framework/tree/master/loc-samples/loc-framework-mybatis-annotation-sample)
* 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的starter的统一标准
* 加入了okhttp的client的构造,用于发起http请求,并且用于记录请求和回应的日志
loc.okhttp:
connectTimeout: 5000
readTimeout: 30000
writeTimeout: 30000
retryOnConnectionFailure: true
followRedirects: true
followSslRedirects: true
connection:
maxIdleConnections: 5
keepAliveDuration: 60000
## redis的starter的统一标准
* 修改了一下cache manager的序列化方式, 把默认的value的序列化方式从jdk的序列化方式改成了json的序列化方式, 主要是为了方便redis存储数据的可读性
* 重新封装了cache manager的使用方式,对于redis不可用的时候,还可以继续进行后续操作,认为缓存是可能出问题的,但是不会影响具体的业务逻辑操作
* 下列事例配置参数
spring:
cache:
redis:
time-to-live: 100s #默认的超时ttl时间
cache-names:
- redis-demo-1 #需要自定义的value的name
- redis-demo-2 #需要自定义的value的name
redis:
host: 127.0.0.1
port: 6379
timeout: 2s #操作超时的情况,默认60s
lettuce:
pool:
max-active: 10
max-idle: 10
max-wait: "1000"
loc.customCache:
redis-demo-1: #对应上面 cache-names
time-to-live: 200s #针对特殊的cache-name来进行自定义参数
redis-demo2-:
time-to-live: 300s #针对特殊的cache-name来进行自定义参数
## kafka的starter的统一标准
* 用kafka来作为主要的的消息队列
* 统一定义k,v 使用 byte[] 数组来定义消息的key和value,方便统一处理
* 给producer在发送的时候头里面加上了messageid、trace相关的信息、记录发送的日志和进行json转换,
* 给consumer在处理消息错误的时候记录日志,处理完消息的时候记录日志,接受到消息的时候记录日志、处理trace的信息,对消息进行json转换等功能
## elasticjob的starter的统一标准
* 利用elasticjob组件完成分布式的调度
* 提供注解来进行任务的配置
## keycloak的starter的统一标准
* keycloak是一个开源的统一认证的安全框架, 现在由于框架是基于springboot2进行开发的,keycloak-springboot-adapter的是基于springboot 1.x的版本来做的,所以出现了无法使用的情况,这个问题已经上报给keycloak官方了
* 等待keycloak针对springboot2提供了adapter后会继续进行跟进此模块
## metrics的starter的统一标准
* SpringBoot2使用micro meter来作为连接底层的facade
* 屏蔽掉了一些额外的没有意义的request path
* 相关配置
management:
endpoints.web.exposure.include:
- metrics
metrics:
export: #上报配置
influx:
uri: http://127.0.0.1:8086
step: 5s //5秒上报一次
db: locMetrics
web:
server:
auto-time-requests: true
requests-metric-name: loc_http_requests
client:
max-uri-tags: 1000
binders:
logback:
enabled: false #暂时关闭logback的metrics
uptime:
enabled: false #暂时关闭uptime的metrics
files:
enabled: false #暂时关闭files的metrics
integration:
enabled: false
enable:
tomcat: false #暂时关闭tomcat的metrics
hikaricp: false #暂时关闭hikaricp的metrics (SpringBoot2.0.0版本, 目前这个上报有bug,)
jdbc: false #暂时关闭jdbc的metrics
distribution:
percentiles:
loc_http_requests: #上报的分位数
- 0.5
- 0.75
- 0.9
- 0.95
- 0.99
## sleuth的starter的统一标准
spring:
sleuth:
sampler:
probability: 0
scheduled:
enabled: false
enabled: true
## eureka的starter的统一标准
# 源码编译
如果你想了解最新的一些功能和改动,可以通过编译源码来进行使用和测试
* 如果使用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.