此前,fly-coding一直采用将yml配置文件内容与对象直接映射关联。
造成每次新增配置参数的时候,需要定义新增关联对应对象属性,使用体验效果不好,而且如果使用此框架也无法自定义配置。
以下是之前的一些配置示例与映射对象。
#======================================#
#========== 驱动库配置 ==========#
#======================================#
engine:
# 驱动模型文件地址配置
enginePath: /Users/zhaoquben/Documents/web_project/library-2.0/WebModelDrivenLibrary
# 配置模式 参考值 dev 开发版本 release 发行版本
configModel: dev
# 驱动管理数据库配置地址
manageDBConfigName: db_config
# 全局扩展类
overallExtend:
# 用户信息处理扩展类
userExtend:
# 允许跨域的地址配置 文字集合
crossDomainUrls:
- 192.168.6.187
# 常量类配置包名 集合
constantPackNames:
# 用户扩展配置类名称
userExtendConfigClassNames:
#======================================#
#========== 项目配置 ==========#
#======================================#
project:
# 是否debugger
isDebugger: true
# 版本号
versionName: 1.0.3.5
# ICP备案号码
icpNumber:
# 版权年份
copyrightYear: 2022
# 产品名称
productName: 三牛模型驱动系统
# 机构名称
companyName:
# 表单展示模式 tab 标签 popup 弹窗
formShowMode: tab
# api访问地址
apiUrl: http://127.0.0.1:8888/api
# 文件访问地址
fileAccessUrl: http://192.168.7.166:8888/files
## 分页配置
paging:
# 第几页参数名称
pageName: page
# 默认每页多少条
pageNumber: 15
# 每页多少条参数名称
pageNumberName: pageNumber
#======================================#
#========== web配置 ==========#
#======================================#
web:
# 网站标题
title: 三牛模型驱动系统
# 网页访问地址
webUrl: http://127.0.0.1:8888
# 网站作者
author:
# 网站关键字
keyWords: 三牛模型驱动系统
# 网站介绍
description: 想飞一样编程
#======================================#
#========== web资源配置 ==========#
#======================================#
webResources:
# web目录
- webFolder: webapp
# 扫描的目录
scanFolder:
# 引擎目录
engineFolder: webapp
# 头部模板
headerTemplate:
# 不引入引擎资源的目录
notImportEngineFolders:
- protocol
#======================================#
#========== 密钥配置 ==========#
#======================================#
secret:
# 接口密钥配置
api:
# 账号密码密钥配置
passWord:
#======================================#
#========== 鉴权配置 ==========#
#======================================#
auth:
# 功能鉴权配置
func:
# 密钥配置
secret:
# 是否启用
isStart: true
# 鉴权时间间隔 分钟 默认3分钟
timeInterval: 3
# api鉴权配置
api:
# 密钥配置
secret:
# 是否启用
isStart: true
# 鉴权时间间隔 分钟 默认3分钟
timeInterval: 3
# 时间戳的参数key 默认 timestamp
timeStampKey: timestamp
# 授权需要拼接的参数key
authParams:
- userId
# 文件鉴权配置
file:
# 密钥配置
secret:
# 是否启用
isStart: true
# 鉴权时间间隔 分钟 默认3分钟
timeInterval: 3
# 授权需要拼接的参数key
authParams:
#======================================#
#========== 日志配置 ==========#
#======================================#
logger:
# 是否输出到控制台
isOutPutConsole: true
#控制台输出级别配置 DEBUG INFO WARN ERROR
consoleLevel: DEBUG
#数据库存储输出日志级别 DEBUG INFO WARN ERROR
dataBaseLevel: DEBUG
#是否输出到数据库中
isOutPutDataBase: true
#======================================#
#========== 数据库配置 ==========#
#======================================#
database:
# 不包含基础字段表名
notContain:
# 所有基础字段均不存在
base:
# 用户字段不存在
user:
# 时间字段不存在
date:
# 主键生成规则
primaryKeyRules:
#======================================#
#========== 监控配置 ==========#
#======================================#
monitor:
#==========api配置=========#
api:
## 是否监控
isMonitor: true
## 监控内容文件配置
file:
# 是否保存用户代理信息
userAgent: true
# 是否保存异常信息
throwable: true
# 是否保存请求客户端信息
requestContent: true
# 是否保存请求参数
requestParams: true
# 是否保存返回结果
returnResults: true
#==========api配置=========#
#==========sql配置=========#
sql:
## 是否监控
isMonitor: true
## 监控内容文件配置
file:
# 是否保存sql语句
sql: true
# 是否保存用户代理信息
userAgent: true
# 是否保存异常信息
throwable: true
# 是否保存请求客户端信息
requestContent: true
# 是否保存执行参数
executeParams: true
# 是否保存返回结果
returnResults: true
#==========sql配置=========#
#=========func配置=========#
func:
## 是否监控
isMonitor: true
## 监控内容文件配置
file:
# 是否保存用户代理信息
userAgent: true
# 是否保存异常信息
throwable: true
# 是否保存请求客户端信息
requestContent: true
# 是否保存请求参数
requestParams: true
# 是否保存返回结果
returnResults: true
#=========func配置=========#
#========logger配置========#
logger:
## 是否监控
isMonitor: true
## 监控内容文件配置
file:
# 是否保存用户代理信息
userAgent: true
# 是否保存异常信息
throwable: true
# 是否保存请求客户端信息
requestContent: true
# 是否保存日志内容
loggerContent: true
#========logger配置========#
#=======account配置========#
account:
## 是否监控
isMonitor: true
## 监控内容文件配置
file:
# 是否保存用户代理信息
userAgent: true
# 是否保存异常信息
throwable: true
# 是否保存请求客户端信息
requestContent: true
#=======account配置========#
#======================================#
#========== 缓存配置 ==========#
#======================================#
cache:
#==========api配置=========#
api:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 2000
# 过期类型
durationType: INFINITE
#==========api配置=========#
#==========角色配置=========#
role:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 10
# 空闲时间 (分钟)
idleTime: 10
#==========api配置=========#
#==========用户配置=========#
user:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 5000
# 空闲时间 (分钟)
idleTime: 10
#==========用户配置=========#
#==========配置数据=========#
config:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 1000
# 空闲时间 (分钟)
durationType: INFINITE
#==========用户配置=========#
#==========请求配置=========#
request:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 2000
# 过期类型
durationType: INFINITE
#==========请求配置=========#
#==========扩展配置=========#
extend:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 5000
# 过期类型
durationType: INFINITE
#==========扩展配置=========#
#=========自定义配置========#
custom:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 10
# 空闲时间 (分钟)
idleTime: 30
#=========自定义配置========#
#==========功能配置=========#
function:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 100
# 空闲时间 (分钟)
idleTime: 30
#==========功能配置=========#
#========数据库配置=======#
dataBase:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 100
# 过期类型
durationType: INFINITE
#========数据库配置=======#
#=========短信验证码=========#
smsVerifyCode:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 5000
# 持续时间 (分钟)
duration: 5
#=========短信验证码=========#
#========三方平台授权凭证配置=======#
accessToken:
# 堆缓存,受到jvm的管控
heap:
# 池大小
size: 5
# 持续时间 (分钟)
duration: 120
#========三方平台授权凭证配置=======#
#======================================#
#========== 短信配置 ==========#
#======================================#
sms:
# 验证码数字
verifyCodeNumber: 5
# 是否校验短信验证码
isVerifySmsCode: true
#======================================#
#========= 开放平台配置 =========#
#======================================#
openPlatform:
# 开发平台别名
hyixue:
## 微信appid
wxAppId:
## 微信app密钥
wxAppSecret:
## 百度appid
bdAppId:
## 百度appkey
bdAppKey:
## 百度app密钥
bdAppSecret:
#===========腾讯短信配置==========#
# CAM密匙查询: https://console.cloud.tencent.com/cam/capi #
## 腾讯云 secretId
tencentSecretId:
## 腾讯云 secretKey
tencentSecretKey:
## 腾讯短信appId
tencentSmsAppId:
## 腾讯短信签名内容
tencentSmsSignName:
## 腾讯验证码短信模板id
tencentSmsTemplateId:
#===========腾讯短信配置==========#
可以看到对应的配置与对象映射写了一大堆。
改造思路
为了解决这种问题,我准备将配置直接映射至Map中,这样做不仅不需要在新增配置时定义相关对象,而且使用用户还可以新增自己的配置相关信息。
功能改造
一、配置文件
1、配置文件改造
fly-coding:
#======================================#
#========== 驱动库配置 ==========#
#======================================#
engine:
# 驱动模型文件地址配置
engine-path: /Users/zhaoquben/Documents/web_project/library-2.0/fly-coding/demo/_datas
# 配置模式 参考值 dev 开发版本 release 发行版本
config-model: dev
# 驱动管理数据库配置地址
manage-db-config-name: db-config
# 全局扩展类
overall-extend:
# 用户信息处理扩展类
user-extend:
# 允许跨域的地址配置 文字集合
cross-domain-urls:
- 192.168.6.187
# 常量类配置包名 集合
constant-pack-names:
# 用户扩展配置类名称
user-extend-config-class-names:
#======================================#
#========== 项目配置 ==========#
#======================================#
project:
# 是否debugger
is-debugger: true
# 版本号
version-name: 1.0.3.5
# ICP备案号码
icp-number:
# 版权年份
copyright-year: 2022
# 产品名称
product-name: 三牛模型驱动系统
# 机构名称
company-name: 赵屈犇
# 表单展示模式 tab 标签 popup 弹窗
form-show-mode: tab
# api访问地址
api-url: http://127.0.0.1:8888/api
# 文件配置
file:
# 文件访问地址
access-url: http://192.168.7.166:8888/files
# 文件上传地址
upload-path:
## 分页配置
paging:
# 第几页参数名称
page-name: page
# 默认每页多少条
page-number: 15
# 每页多少条参数名称
page-number-name: pageNumber
#======================================#
#========== web配置 ==========#
#======================================#
web:
# 网站标题
title: 三牛模型驱动系统
# 网页访问地址
web-url: http://127.0.0.1:8888
# 网站作者
author: 赵屈犇
# 网站关键字
key-words: 三牛模型驱动系统
# 网站介绍
description: 驱动解决一切开发问题
#======================================#
#========== web资源配置 ==========#
#======================================#
web-resources:
# web目录
- webFolder: webapp
# 扫描的目录
scanFolder:
# 引擎目录
engineFolder: webapp
# 头部模板
headerTemplate:
# 不引入引擎资源的目录
notImportEngineFolders:
- protocol
#======================================#
#========== 密钥配置 ==========#
#======================================#
secret:
# 接口密钥配置
api: 02D2308E315E860BE26D9D1FC68AD8F90
# 账号密码密钥配置
pass-word: 7BF1ACCDB244E9B50CF31A21F31B070B1
#======================================#
#========== 鉴权配置 ==========#
#======================================#
auth:
# 功能鉴权配置
func:
# 密钥配置
secret: AA8E14FED130ABECC23B2FB485B26FE4A
# 是否启用
is-start: true
# 鉴权时间间隔 分钟 默认3分钟
time-interval: 3
# api鉴权配置
api:
# 密钥配置
secret: 9664430EF4587F01712ED162CBF09AAD9
# 是否启用
is-start: true
# 鉴权时间间隔 分钟 默认3分钟
time-interval: 3
# 时间戳的参数key 默认 timestamp
time-stampkey: timestamp
# 文件鉴权配置
file:
# 密钥配置
secret: 4A512252A1D336AB2653567C120CCB81
# 是否启用
is-start: true
# 鉴权时间间隔 分钟 默认3分钟
time-interval: 3
#======================================#
#========== 日志配置 ==========#
#======================================#
logger:
# 是否输出到控制台
is-output-console: true
#控制台输出级别配置 DEBUG INFO WARN ERROR
console-level: DEBUG
#数据库存储输出日志级别 DEBUG INFO WARN ERROR
database-level: DEBUG
#是否输出到数据库中
is-output-database: true
#======================================#
#========== 数据库配置 ==========#
#======================================#
database:
# 不包含基础字段表名
not-contain:
# 所有基础字段均不存在
base:
# 用户字段不存在
user:
# 时间字段不存在
date:
# 主键生成规则
primary-key-rules:
#======================================#
#========== 短信配置 ==========#
#======================================#
sms:
# 验证码数字
captcha-number: 5
# 是否校验短信验证码
is-verify-sms-code: true
# 验证码检验时间
captcha-valid-time: 5
#======================================#
#========= 开放平台配置 =========#
#======================================#
platform:
# 开发平台别名
hyixue:
## 微信渠道配置
wx:
# 小程序配置
applet:
# appid
app-id:
# app密钥
app-secret:
# 商户平台
mch:
#===========百度配置==========#
bd:
# 小程序配置
applet:
## 百度appid
app-id:
## 百度appkey
app-key:
## 百度app密钥
app-secret:
#===========百度配置==========#
#===========短信配置==========#
sms:
# 腾讯 CAM密匙查询: https://console.cloud.tencent.com/cam/capi #
tencent:
## 腾讯短信appId
app-id:
## 腾讯短信签名内容
sign-name:
## 腾讯云 secretId
secret-id:
## 腾讯云 secretKey
secret-key:
## 腾讯验证码短信模板id
template-id:
#===========短信配置==========#
此次改造将所有的配置内置入fly-coding内部,并将历史配置命名规则进行修改。
2、部分参数说明
fly-coding.engine.config-model:此配置的引用为了区分不同的渠道,当使用者定义了此配置之后,框架将会去对应的配置目录找配置文件。
比如,我在上面配置了dev,在进行解析时,会找对应dev目录下的driver-config.yml配置文件,并进行参数合并。
再者上方的配置中可以看到未定义数据库相关信息,此框架目前内置Druid框架,需要在对应的渠道配置目录中,自己直接指定的数据相关配置。
以下是mysql配置,其他可以参考druid文档。
# 数据库驱动
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&allow&allowPublicKeyRetrieval=true
# 数据库用户名
username=root
# 数据库密码
password=121212
# 连接池初始化大小
initialSize=10
# 连接池最大连接数
maxActive=20
# 获取连接最大等待时间
maxWait=6000
# 获取连接时是否检测连接是否有效
testOnBorrow=false
# 回收连接时是否检测连接是否有效
testWhileIdle=false
# 连接再线程池中最小存活时间
minEvictableIdleTimeMillis=300000
# 创建连接校验连接是否有效执行的sql语句
validationQuery=SELECT 1
二、配置文件解析
此下函数,对需要解析的文件进行处理,并采用递归方式将其变为.号拼接的形式。
/**
* 加载引擎配置
*
* @param configPath
* @throws Exception
*/
private void loadEngineConfig(String configPath) throws Exception {
InputStream inputStream = null;
try {
StringBuffer enginePath = new StringBuffer("/engine/config/");
if (StringUtils.isNotEmpty(configPath)) {
enginePath.append(configPath).append("/");
}
enginePath.append("driver-config.yml");
// 解析yml文件
Yaml yaml = new Yaml();
inputStream = getClass().getResourceAsStream(enginePath.toString());
Map<String, Object> result = yaml.loadAs(inputStream, Map.class);
result.forEach((key, value) -> cacheConfig(key, value, null));
} catch (Exception e) {
throw e;
} finally {
CloseUtils.closeIO(inputStream);
}
}
/**
* 缓存配置
*
* @param key
* @param value
* @param cacheKey
*/
private void cacheConfig(String key, Object value, String cacheKey) {
if (value != null) {
String childCacheKey;
if (StringUtils.isNotEmpty(cacheKey)) {
childCacheKey = StringUtils.appendStrings(cacheKey, ".", key);
} else {
childCacheKey = key;
}
if (value instanceof Map) {
Map<String, Object> child = (Map<String, Object>) value;
for (String childKey : ((Map<String, Object>) value).keySet()) {
cacheConfig(childKey, child.get(childKey), childCacheKey);
}
} else {
configMap.put(childCacheKey, value);
}
}
}
此上就配置参数的解析完成了改造,后期还会对监控、缓存、三方平台等配置,进行特殊规则处理。