Spring 扩展 @AutoConfiguration 开关
背景Spring Boot Starters 提供了很多常用的组件,有些组件例如 Kafka 和 RocketMQ,引入到工程后会自动装配,它会检查您的配置,跟外部的组件创建一些连接,这个时候,我们很难控制 Kafka 关闭,RocketMQ 开启。 目标给 Spring Boot Starters 的组件提供一个开关,控制自动装配。 实现Spring Boot AutoCofiguration 提供了 AutoConfigurationImportFilter 过滤器,用来控制 @Configuration 配置类是否生效。查看 AutoConfigurationImportSelector 的源码,它会去调用 AutoConfigurationImportFilter 过滤器,传入所有的 @Configuration 配置类,通过 filter 方法筛选掉不需要的配置类,返回最新的配置类集合。 12345678910111213141516171819202122232425262728293031323334353637383940414243public class Au...
使用 binlog2sql 工具在线恢复数据
背景生产数据库执行 SQL 脚本,一般会经过正规的审批流程才能运行。但有些情况是例外的,业务部门在提出一些删除数据的需求后打算撤回,或者在运营后台不小心删除了一些数据,然后找到 DBA 团队协助,希望能恢复数据。 经调研,binlog2sql 是大众点评开源的一款用于解析 MySQL binlog 的工具,根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL 等,适用于数据快速回滚(闪回)和主从切换后新 Master 丢数据的修复工作。 目标验证 binlog2sql 工具是否可以快速恢复数据。 步骤准备工作安装 binlog2sql 工具。 123456> git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql# > yum install python3-pip# > whereis pip# > pip3.6 install -r requirements.txt> pip install -r requirement...
搜索自动补全系统设计
场景设计一个搜索自动补全系统,支持 Top k 查询词或者 k 个最常被搜索的查询词。 需求点: 仅支持前缀匹配。 输入查询词,在 100 毫秒内返回结果。 系统返回 5 条自动补全建议,基于历史的查询频率决定。 支持 1000 万活跃用户(DAU)。 估算假设每个用户每天搜索 20 次,每次搜索 4 个字。按 UTF8 字符编码,每个字占用 3 个字节,每次查询占用 4 * 3 = 12 字节。 每当在搜索框中输入一个字符,客户端就会向后端发送一个请求以获取自动补全建议。假设,输入完 “原神启动”,客户端会发送 4 个请求到服务端。 1234_search?q=原_search?q=原神_search?q=原神启_search?q=原神启动 根据每天有 1000 万活跃用户,系统需要承载的 QPS 为 10,000,000 * 20 次 * 4 个请求 / 24 小时 / 60 分 / 60 秒 = 9200 次/秒,则峰值 QPS 按两倍计算,约 18,400 次/秒。 设计总结
Spring 扩展 AOP 自定义切面路径
背景看到有些框架在实现日志切面时,直接编写一个切面类,在 @Aspect 注解指定好 package 路径,然后通过 @EnableAspectJAutoProxy 开启 AOP。业务代码引入这个框架,必须按照框架约定好的 package 路径匹配,才能生效。这样的框架对业务代码有较大的侵入性,不适合所有场景。 目标实现一个可配置的日志切面路径组件,对业务代码零侵入性。 实现实现切面路径自定义的方式有两种:Annotation 注解和 AutoConfiguration 自动装配,前者对代码有较小的侵入性。先说说 Annotation 注解怎么实现。 以日志切面为例,先设计配置属性类 AccessLogConfig。 123456789101112131415161718192021222324252627282930@EqualsAndHashCode@ToString@Setter@Getterpublic class AccessLogConfig { /* 是否保存到 MDC */ private boolean enabledMdc = true;...
Log4j2 零停机动态加载配置文件
背景有时候生产环境需要临时调整日志级别 Level 或者修改日志输出路径 Appender,使用 Spring Boot 提供的日志刷新不能满足这个需求,最终还是重启服务才能生效。为了解决这个问题,需要实现 log4j2 配置文件的动态加载。 目标实现零停机修改 log4j 配置,动态配置日志级别和输出路径。 实现Nacos 配置监听通过 NacosConfigManager.getConfigService().addListener() 实现,为了避免 Nacos 服务端宕机,Nacos Client 实现了本地缓存机制,配置文件保存路径如下: ${user.home}/nacos/config/fixed-host_port-namespace_tenant/snapshot-tenant/namespace/group,将配置文件转化为 URI,利用 log4j2 的 API 重新加载日志配置 Configurator.reconfigure(uri)。 首先,定义配置属性类 Log4j2NacosProperties。 123456789101112...
News Feed 系统设计
场景估算设计总结
URL 短链系统设计
场景估算设计总结
唯一ID生成器设计
场景估算设计总结
消息推送系统设计
场景估算设计总结
网络爬虫系统设计
场景估算设计总结



















