字典翻译在我们应用里是一个很正常普遍的需求。
对于小型项目我们可能在数据库设计层面通常不会进行分库处理,那么对于此类项目,通常字典翻译会通过sql语句的子查询来处理,如果业务系统中存在较多的字段为code值时,我们需要编写大量的子查询用于code->name 的代码。在代码层面上造成代码的冗余,在查询数据体量较大的情况并且编写sql人员的能力的不足导致查询性能问题。
对于中大型项目我们可能数据库设计层面进行分库处理,在业务应用层面会通过使用微服务对其业务分割化(尤其现在微服务学习使用成本较低,有成熟的开源应用框架供我们使用-springcloud,dubbo)。那么对于字典这一所属公共服务,通常和业务库进行分库处理,那么使用sql语句进行代码翻译的途径也就无法使用,我们通常会将字典翻译暴露出内部公共api接口,通过内部调用(springcloud使用feign)对字段进行翻译,会造成代码的大量冗余(需要对进行翻译的对象进行迭代获取需要翻译的数据聚合一起调用接口返回数据,再迭代进行字段翻译)。会导致系统的不稳定性,业务系统存在大量的请求到公共服务,导致压力剧增。一旦公共服务挂掉会导致对外业务服务不可用(通过服务降级和增加公共服务集群数据可一定缓解压力)
DTC(Dictionaries Transformation Controller):通过简单配置(注解方式),非嵌入式代码(不想用时可直接关闭),无感知(对于使用者只需要编写一句调用方法即可)对javaBean对向进行字典翻译(满足嵌套复杂结构,支持字典本地-redis缓存)
如何使用DTC组件(spring Starter项目)
定义基础配置和测试环境配置():
##定义测试数据库地
spring:
#mysql数据库连接池配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://******:3306/***?useUnicode=true&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true
username:***
password:****
filters: stat
maxActive: 20
initialSize: