Skip to content

加密解密方案

  1. 通过实现mybatis的拦截器Interceptor接口,在sql执行前后对参数执行 自定义的加密解密逻辑,确保落库的数据安全性。
  2. 通过在实体标注自定义注解,识别需要加解密的类和字段。

自定义的拦截器:com.pagoda.data.security.mybatis.interceptor.EncryptInterceptor#intercept

String参数加密具体实现:com.pagoda.data.security.mybatis.interceptor.EncryptInterceptor#decrypt

数据脱敏方案

  1. 在Controller层的web接口中添加注解,触发脱敏。
    1. 只在对接前端或者外部接口的时候脱敏,对内部rpc不脱敏。
    2. 通过yml配置脱敏的字段,常用脱敏字段:用户id、中文名、身份证号、座机号、手机号、地址、电子邮件、密码 3. 脱敏模式——无效化:【手机号码】前三位,后4位,其他隐藏,比如135****2210
  2. 通过Util包形式提供全公司使用
xml
<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
  • 文件服务系统

执行过程

  1. 抽象异步任务表,记录任务信息,任务类型有导入、导出、其它等等。
  2. 导入时创建一个异步任务,后端将入参记录到异步任务表中,返回异步任务ID。
    1. 创建导入任务:通过EasyExcel批量读取Excel数据存储到异步任务明细表
    2. 创建导出任务:记录入参到异步任务头表
    3. 前端处理:前端通过异步任务ID轮询查询导入/出的进度(或者后台提供一个下载中心)
      1. 后端根据异步任务ID 查询 导入/出成功的下载地址、导入/出异常条数、成功条数返回。
  3. 通过XXL-Job定时任务平台触发异步任务的调用,查询近七天的异步任务,根据不同的任务类型执行不同的逻辑
    1. 导入任务:分批查询异步任务明细表,执行对应的业务实现导入类的处理。
      1. 导入异常同步记录到明细表,最后统一导出为Excel文件,上传到文件系统,得到下载链接,再返回下载链接给前端。
    2. 导出任务:通过入参查询业务表,只查询单据ID,再根据ID分批处理。
      1. 组装数据写入到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

目的

为了解决业务操作过程中对某些调用三方系统的、实时性不高的任务异步化,并且支持异常自动重试和异常手动重试,减少研发人员的介入,提高系统的容错性。

事件模式

  1. 使用事件机制生产异步事件
  2. 异步事件生成 RocketMQ 消息
  3. 消费者消费事件,如异常使用 MQ 重试机制进行重试
  4. 当重试次数等于 6 次时,生成异步任务保存到数据库中
  5. 业务单据,通过单据号查询异常的任务,进行手动重推
  • 与主业务解耦。
  • 通过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用于重试)

工厂方法

策略模式