框架配置文件改造,弃用对象映射

37 阅读10分钟

此前,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);
            }
        }
    }

此上就配置参数的解析完成了改造,后期还会对监控、缓存、三方平台等配置,进行特殊规则处理。