加密解密方案
- 通过实现
mybatis
的拦截器Interceptor
接口,在sql执行前后对参数执行 自定义的加密解密逻辑,确保落库的数据安全性。 - 通过在实体标注自定义注解,识别需要加解密的类和字段。
自定义的拦截器:com.pagoda.data.security.mybatis.interceptor.EncryptInterceptor#intercept
String参数加密具体实现:com.pagoda.data.security.mybatis.interceptor.EncryptInterceptor#decrypt
数据脱敏方案
- 在Controller层的web接口中添加注解,触发脱敏。
- 只在对接前端或者外部接口的时候脱敏,对内部rpc不脱敏。
- 通过yml配置脱敏的字段,常用脱敏字段:用户id、中文名、身份证号、座机号、手机号、地址、电子邮件、密码 3. 脱敏模式——无效化:【手机号码】前三位,后4位,其他隐藏,比如135****2210
- 通过Util包形式提供全公司使用
<dependency>
<groupId>com.pagoda.util</groupId>
<artifactId>pagoda-sensitive</artifactId>
<version>1.0.4-SNAPSHOT</version>
</dependency>
脱敏切面:com.pagoda.sensitive.aop.SensitiveFieldAspect#around
脱敏策略:com.pagoda.sensitive.common.SensitiveUtil#desensitized
异步导入导出方案
相关组件
- Xxl-Job
- EasyExcel
- 文件服务系统
执行过程
- 抽象异步任务表,记录任务信息,任务类型有导入、导出、其它等等。
- 导入时创建一个异步任务,后端将入参记录到异步任务表中,返回异步任务ID。
- 创建导入任务:通过EasyExcel批量读取Excel数据存储到异步任务明细表
- 创建导出任务:记录入参到异步任务头表
- 前端处理:前端通过异步任务ID轮询查询导入/出的进度(或者后台提供一个下载中心)
- 后端根据异步任务ID 查询 导入/出成功的下载地址、导入/出异常条数、成功条数返回。
- 通过XXL-Job定时任务平台触发异步任务的调用,查询近七天的异步任务,根据不同的任务类型执行不同的逻辑
- 导入任务:分批查询异步任务明细表,执行对应的业务实现导入类的处理。
- 导入异常同步记录到明细表,最后统一导出为Excel文件,上传到文件系统,得到下载链接,再返回下载链接给前端。
- 导出任务:通过入参查询业务表,只查询单据ID,再根据ID分批处理。
- 组装数据写入到Excel,再上传到文件系统,得到下载链接,再返回下载链接给前端。
- 导入任务:分批查询异步任务明细表,执行对应的业务实现导入类的处理。
设计模式实现:模板方法模式
- 异步任务处理抽象类:com.pagoda.purchase.service.asynctask.handler.AbstractAsyncTaskHandler
- 导入异步任务处理抽象类:ImportAsyncTaskHandler
- 业务实现导入类:xxxx
- 业务实现导入类:xxxx
- 导出异步任务处理抽象类:ExportAsyncTaskHandler
- 业务实现导出类:xxxx
- 业务实现导出类:xxxx
CICD
CI/CD 是一种现代软件开发实践,它通过将代码的集成和部署过程自动化,提高了软件开发的速度和质量。
CI 代表“持续集成”(Continuous Integration)
CD 可以代表“持续交付”(Continuous Delivery)或“持续部署”(Continuous Deployment)
https://www.cnblogs.com/xurongze/articles/15834553.html
ELK
在Kubernetes上的微服务架构系统上接入EFK日志系统。
https://www.cnblogs.com/xurongze/articles/15889890.html
实现方案
使用Kubernetes的DaemonSet应用类型部署filebeat,负责收集docker容器内部
/var/lib/docker/containers
的日志,再推送到Elasticsearch。- 收集日志的方案有很多,因为是kuberetes形式的微服务系统 ,最终选择使用官方最为推荐的方案
- DaemonSet:k8s的一种应用类型,简单来说就会自动在每一台k8s工作节点上启动一个守护进程
ELasticsearch,负责存储日志,提供强大的搜索功能
Kibana,负责提供可视化的搜索操作页面
异步事件机制
源文档:https://xf12607haf.feishu.cn/wiki/ZaePwLTNyiVfW8kKt4BczjSinjf
目的
为了解决业务操作过程中对某些调用三方系统的、实时性不高的任务异步化,并且支持异常自动重试和异常手动重试,减少研发人员的介入,提高系统的容错性。
事件模式
- 使用事件机制生产异步事件
- 异步事件生成 RocketMQ 消息
- 消费者消费事件,如异常使用 MQ 重试机制进行重试
- 当重试次数等于 6 次时,生成异步任务保存到数据库中
- 业务单据,通过单据号查询异常的任务,进行手动重推
- 与主业务解耦。
- 通过MQ异常重试机制 进行自动重试。
- 重试超过指定次数时,落库异常,前端查询异常记录表展示,用户可以直接手动操作重试。
中台上线方案(概括)
源文档1:https://xf12607haf.feishu.cn/wiki/wikcnjtC7vmR0WnRDfSeSTkgfmh
源文档2:https://xf12607haf.feishu.cn/wiki/J6gLw0EJniEYHMkRRi4cnKFenBc
目的
项目中台化(统一使用平台组提供的最新框架Java Framework、项目结构)
合并多个项目(ERP采购平台、质检平台 、供应商平台、采购员平台、交易平台APP端)
- 数据迁移、合并
- 业务合并、重构
价值
缩减业务服务(下线10+个服务)
缩减业务表(移除30+张表)
优化用户体验、降低系统复杂度
降低维护成本、增强系统扩展性
符合集团规划(大力发展ToB业务)
上线步骤
为分散风险,分三阶段上线
阶段一:前置阶段
- 上线老系统:兼容新系统的防腐层、迁移开关等(支持读写)
- 数据迁移:历史数据全量迁移,实时数据增量迁移
阶段二:灰度阶段
- 上线新系统:验证所有新功能(只读)
阶段三:全量阶段
- 老系统切换开关:
- 老系统流量全部转移至新系统
- 关闭老系统写的功能,只允许读数据,确保老系统不会产生新数据
- 新系统正式全面使用(支持读写)
后续阶段
- 老系统移除防腐层:配合上下游系统对接新中台的接口
- 下线老系统
设计模式的应用
模板方法
- 异步任务抽象类:com.pagoda.purchase.service.asynctask.handler.AbstractAsyncTaskHandler
- 内部声明了通用的模板方法
- 导出异步任务抽象类:com.pagoda.purchase.service.asynctask.handler.ExportAsyncTaskHandler
- 内部声明了通用的模板方法、属性
- 声明了导出流程,由具体的子类实现对应导出方法
适配器/装饰器模式
- 各种Remote接口:内部对外部HTTP接口(PRC)、三方应用接口进行了重新封装、兼容改造、增强对应功能。
- com.pagoda.purchase.remote.impl.OrgRemoteServiceImpl
- com.pagoda.purchase.remote.DataDictRemoteService
观察者模式
- 业务单据创建成功事件:com.pagoda.purchase.service.arrival.event.PurArrivalEventListener
- 通过Spring内部的@EventListener注解使用
- 与业务主流程解耦,可支持 同步、异步、MQ方式调用(MQ用于重试)