使用十一种设计模式实现 基于Jackson注解的 完美数据脱敏方案


前言

又是好长时间没有写分享了,对我来说,写博客消耗的心力太大了,只能偶尔心血来潮了,没法收回曾经立下的Flag了。


一、背景

最近有数据脱敏的需求,我三下五除二就解决了,就是太丑了,直接耦合在业务处理中。所以我一直在寻找更加优雅的方案,例如 Mybatis 插件了,工具类等等,但都感觉差点意思。终于 当我看到了这篇博文:自定义注解实现数据序列化时进行数据脱敏,这就是我想要的,使用 Jackson 注解。但当我看完后马上意识到,他的方式还不够灵活。
我 立刻就有了改造的灵感,下文就是 使用 外观 + 策略 + 命令 + 工厂 + 静态代理 + 装饰器 + 解释器 + 适配器 + 享元 + 桥接 + 模板(有点牵强了,就是为了硬凑贯口) 改造后的成品,提供更强的灵活性。

通过这个样例,可以学习三个事情

  1. 学习Jackson 这种提供扩展的方式,太方便了
  2. 设计模式只是参考,六大原则才是核心目标,没有必要太教条。
  3. lambda 相关技术太方便了, 尤其对设计模式的实现,如果可以尽量多用。

二、代码实现

2.1 对脱敏操作抽象出函数式接口

这个接口 是 策略 + 命令 结合后的抽象,并通过 default 函数实现装饰功能。使用注解Sensitive 实例来实现了命令模式 ,可以更灵活的控制脱敏执行。

@FunctionalInterface
public interface SensitiveDeal {
   
	String apply(String source, Sensitive sensitive);

	default SensitiveDeal compose(SensitiveDeal before) {
   
		Objects.requireNonNull(before);
		return (source, sensitive) -> apply(before.apply(source, sensitive), sensitive);
	}

	default SensitiveDeal andThen(SensitiveDeal after) {
   
		Objects.requireNonNull(after);
		return (source, sensitive) -> after.apply(apply(source, sensitive), sensitive);
	}
}

2.2 Jackson自定义注解

@Documented 表示该注解会生成到 javaDoc中
@Retention(RetentionPolicy.RUNTIME) 表示该注解在运行时生效
@Target(ElementType.FIELD) 表示注解作用于字段上
@JacksonAnnotationsInside 这个注解用来标记Jackson复合注解,当你使用多个Jackson注解组合成一个自定义注解时会用到它
@JsonSerialize(using = SensitiveJsonSerializer.class) 指定使用自定义的序列化器
参数说明见源码注释。

Sensitive 可以使用相同的一套参数来配置脱敏实现,可以说 当前的脱敏方案 提供了 统一的外观。
Strategy.CUSTOMER 策略提供了适配的支持,使用Sensitive.dealType 就可以将第三方实现嵌入当前框架。
重点注意一下 Strategy 继承了 SensitiveDeal,实现了静态代理,体会这种写法的便利。
Strategy 的实例化使用了 简单工厂,策略 + 命令模式,稍微有点复杂,但是对外暴露的时候,就是普通的策略,使用者并不关心策略本身是如何被创建的。
Sensitive.regular 正则表达式 使用了 解释器模式,这个使用有点过于划水了。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = SensitiveJsonSerializer.class)
public @interface Sensitive {
   

	/**
	 * 脱敏策略,参考{@link Sensitive.Strategy}
	 */
	Strategy value();

	/**
	 * 有无参构造函数的{@link SensitiveDeal}实现类,用于完全自定义脱敏,参考
	 * {@link Sensitive.Strategy#CUSTOMER}
	 */
	Class<? extends SensitiveDeal> dealType() default SensitiveDeal.class;

	/**
	 * 正则表达式,参考具体策略的注释。
	 */
	String regular() default "";

	/**
	 * 替换后显示,与 {@link Sensitive#regular()}配合可以实现更方便的正则替换。<br>
	 * 剩余情况默认只取首位字符来填充。
	 */
	String replacement() default "*";

	/**
	 * 左侧需要保留几位明文字段,参考具体策略的注释。
	 */
	int maskStart() default 0;

	/**
	 * 右侧最多保留几位明文,参考具体策略的注释。
	 */
	int keepTail() default 0;

	/**
	 * 具体的脱敏策略实现
	 * 
	 * @author zkr-liuchunming
	 * @see SensitiveDeals
	 * @see SensitiveDeal
	 *
	 */
	enum Strategy implements SensitiveDeal {
   

		// 以下是 与业务字段相关的策略
		/**
		 * 性别
		 */
		SEX(SensitiveDeals::none),
		/**
		 * 用户名
		 */
		USERNAME(SensitiveDeals::userName),
		/**
		 * 密码
		 */
		PASSWORD(SensitiveDeals::none),
		/**
		 * 证件号码
		 */
		IDNO(SensitiveDeals.createWrap(6, 4)),
		/**
		 * 座机号
		 */
		FIXED_PHONE(SensitiveDeals.createSuffix(4)),
		/**
		 * 手机号
		 */
		MOBILE_PHONE(SensitiveDeals.createWrap(3, 4)),
		/**
		 * 邮箱
		 */
		EMAIL(SensitiveDeals::email),
		/**
		 * 银行账号
		 */
		BANK_ACCNO(SensitiveDeals.createWrap(6, 4)),
		/**
		 * 地址
		 */
		ADDRESS(SensitiveDeals.createRegular("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****")),

		// 以下是 与业务无关的通用策略,如果经常脱敏某种业务字段,建议抽成 业务字段策略,更有可读性
		/**
		 * 全部隐藏,例如密码之类
		 */
		NONE(SensitiveDeals::none),
		/**
		 * 只留结尾四个字符
		 */
		SUFFIX_4(SensitiveDeals.createSuffix(4)),
		/**
		 * 只保留结尾的通用脱敏,使用 {@link Sensitive#keepTail()}
		 */
		
<think>好的,我现在需要帮用户介绍Java项目的常用亮点。首先,用户可能是在准备面试或者项目总结,想要突出自己的项目经验,所以需要了解哪些方面能体现技术深度和解决问题的能力。 首先想到的是架构设计方面,比如微服务架构,Spring Cloud相关的组件如Eureka、Feign这些,还有分布式系统的CAP理论,负载均衡策略。另外,单体的模块化设计,比如Spring Boot的模块划分,以及DDD领域驱动设计,这些都是常见的架构亮点。 然后是性能优化,比如JVM调优,GC日志分析,内存泄漏排查,线程池参数优化,还有数据库方面的索引优化、慢查询处理,缓存技术如Redis、Memcached的应用,以及异步处理如消息队列的使用,这些都是提升项目效率的关键点。 接着是核心技术,高并发场景下的解决方案,比如锁机制、原子类、线程池、CompletableFuture,分布式锁用Redis或ZooKeeper实现。还有分布式事务的处理,比如Seata、消息队列的事务消息,TCC模式。微服务治理中的限流熔断、链路追踪、配置中心,这些都属于核心技术点。 安全性也不能忽视,比如Shiro或Spring Security的权限控制,OAuth2、JWT的应用,数据加密和SQL注入防范,这些都是项目安全性的体现。 代码质量方面,单元测试的覆盖率,代码规范工具Checkstyle、SonarQube的使用设计模式的应用,重构技巧,这些能展示开发者的代码管理能力。 运维部署方面,CI/CD流程,Docker和Kubernetes的使用,监控系统如Prometheus,日志管理ELK,这些属于DevOps的内容,现在很多项目都需要这些技能。 新技术整合,比如响应式编程WebFlux,云原生技术,AI集成,大数据处理框架,这些能体现对新技术的掌握和应用能力。 业务价值方面,复杂业务逻辑的实现,多系统集成,数据分析和可视化,用户体验优化,这些直接关联项目实际效果,展示解决实际问题的能力。 最后是项目管理,敏捷开发经验,文档管理,风险控制,跨团队协作,这些软技能也是项目成功的重要因素。 需要把这些点结构化,每个大类下分小点,用例子具体说明,比如在微服务架构里提到具体组件,性能优化里提到实际调优步骤。同时注意使用LaTeX格式的公式,比如在算法优化时提到时间复杂度,用$$O(n^2)$$,但用户的问题可能不太需要数学公式,不过系统指令要求行内公式用$...$,独立公式用$$...$$。可能需要在适当的地方加入,比如提到算法优化时时间复杂度,或者某些数学模型,但需要自然融入,不显突兀。 还要检查语法正确,结构清晰,分点明确,用中文回答。用户可能需要这些亮点来优化简历或面试回答,所以需要实用、具体,有实际案例更好。但用户没有提供具体项目,所以需要通用性的亮点,用户可以根据自己项目情况选择适用的部分。</think>以下是为Java项目提炼常用亮点的结构化整理,结合技术深度与业务价值,可供面试或项目总结参考: --- ### 一、架构设计亮点 1. **微服务架构** - 使用Spring Cloud Alibaba/Netflix组件(如Nacos/Eureka注册中心、OpenFeign声明式调用、Gateway网关) - 遵循CAP理论设计分布式系统(如AP架构采用Raft算法实现最终一致性) - 动态负载均衡策略(如加权轮询、一致性哈希) 2. **模块化与DDD** - 通过Spring Boot模块化拆分(如`domain`、`application`、`infrastructure`分层) - 领域驱动设计(DDD)落地,明确聚合根、值对象、领域事件等概念 --- ### 二、性能优化实践 1. **JVM调优** - 分析GC日志(如G1堆内存分配策略优化,Young GC频率降低30%) - 内存泄漏排查(借助MAT工具定位未释放的`ThreadLocal`引用) 2. **数据库优化** - 索引优化(覆盖索引解决回表问题,查询耗时从2s降至50ms) - 分库分表(ShardingSphere实现水平分片,TPS提升至5k+) 3. **高并发处理** - 缓存穿透/雪崩防护(Redis布隆过滤器 + 热点数据永不过期策略) - 异步削峰(RocketMQ事务消息保证最终一致性,QPS承载能力提高4倍) --- ### 三、核心技术深度 1. **分布式解决方案** - 分布式锁(Redisson `RLock`实现自动续期,避免业务超时导致锁失效) - 分布式事务(Seata AT模式 + 全局锁冲突检测,事务成功率99.98%) 2. **微服务治理** - 熔断降级(Sentinel配置慢调用比例阈值,异常流量自动熔断) - 全链路追踪(SkyWalking实现调用链染色,定位超时问题效率提升70%) --- ### 四、安全与代码质量 1. **安全防护** - OAuth2授权码模式实现单点登录(SSO) - 数据脱敏Jackson注解动态屏蔽敏感字段) 2. **代码规范** - 单元测试覆盖率 >80%(Jacoco报告 + Mockito模拟依赖) - 代码坏味道治理(SonarQube检测圈复杂度 >15的方法并重构) --- ### 五、运维与新技术 1. **DevOps实践** - CI/CD流水线(Jenkins + GitLab自动构建镜像,K8s滚动更新) - 监控告警(Prometheus + Grafana监控JVM指标,企业微信实时通知) 2. **云原生技术** - 服务网格(Istio实现流量镜像到测试环境) - Serverless函数(阿里云函数计算处理突发流量) --- ### 六、业务价值体现 - **复杂业务建模** 使用状态模式实现订单多状态流转(如`待支付`→`已发货`→`售后中`) - **数据分析能力** Elasticsearch聚合分析用户行为日志,生成商品推荐画像 --- ### 公式示例(技术场景关联) - **算法优化时间复杂度** 优化前:$O(n^2)$ 双层循环匹配数据 优化后:$O(n \log n)$ 通过空间换时间(HashMap缓存预处理) --- 通过以上维度的组合描述,既能体现技术深度,又能关联业务价值,建议根据实际项目挑选3-5个重点展开。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值