手写企业级 Starter:ark-redis-starter(缓存 + 开关 + 降级策略)

张开发
2026/4/19 20:00:37 15 分钟阅读

分享文章

手写企业级 Starter:ark-redis-starter(缓存 + 开关 + 降级策略)
一、前言在使用 Spring Boot 的过程中我们经常会遇到这样的需求想快速接入 Redis 缓存想通过配置控制开关想在 Redis 不可用时自动降级如果每个项目都手写这些逻辑会非常重复。 这时候就可以用Starter来解决。二、本篇目标实现一个企业级简化版 Starterark-redis-starter具备能力✅ 自动注入缓存服务✅ 支持 application.yml 配置✅ 支持开关控制✅ 支持降级策略Redis不可用时走本地缓存三、最终使用效果用户只需要1️⃣ 引入依赖dependency groupIdcom.ark/groupId artifactIdark-redis-starter/artifactId version1.0.0/version /dependency2️⃣ 写配置ark: redis: enabled: true fallback: true prefix: ark:3️⃣ 直接使用Autowired private ArkCacheService cacheService; cacheService.set(key, value);四、整体结构ark-redis-starter ├── service │ ├── ArkCacheService.java │ ├── RedisCacheService.java │ └── LocalCacheService.java ├── properties │ └── ArkRedisProperties.java ├── autoconfigure │ └── ArkRedisAutoConfiguration.java └── resources └── META-INF/spring/ └── AutoConfiguration.imports五、第一步配置类核心package com.ark.starter.properties; import org.springframework.boot.context.properties.ConfigurationProperties; ConfigurationProperties(prefix ark.redis) public class ArkRedisProperties { private boolean enabled true; private boolean fallback true; private String prefix ark:; public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled enabled; } public boolean isFallback() { return fallback; } public void setFallback(boolean fallback) { this.fallback fallback; } public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix prefix; } }六、第二步定义统一接口package com.ark.starter.service; public interface ArkCacheService { void set(String key, Object value); Object get(String key); }七、第三步Redis 实现package com.ark.starter.service; import org.springframework.data.redis.core.StringRedisTemplate; public class RedisCacheService implements ArkCacheService { private final StringRedisTemplate redisTemplate; private final String prefix; public RedisCacheService(StringRedisTemplate redisTemplate, String prefix) { this.redisTemplate redisTemplate; this.prefix prefix; } Override public void set(String key, Object value) { redisTemplate.opsForValue().set(prefix key, value.toString()); } Override public Object get(String key) { return redisTemplate.opsForValue().get(prefix key); } }八、第四步本地缓存降级实现package com.ark.starter.service; import java.util.concurrent.ConcurrentHashMap; public class LocalCacheService implements ArkCacheService { private final ConcurrentHashMapString, Object cache new ConcurrentHashMap(); Override public void set(String key, Object value) { cache.put(key, value); } Override public Object get(String key) { return cache.get(key); } }九、第五步自动配置类核心package com.ark.starter.autoconfigure; import com.ark.starter.properties.ArkRedisProperties; import com.ark.starter.service.*; import org.springframework.boot.autoconfigure.condition.*; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.StringRedisTemplate; Configuration EnableConfigurationProperties(ArkRedisProperties.class) ConditionalOnProperty(prefix ark.redis, name enabled, havingValue true, matchIfMissing true) public class ArkRedisAutoConfiguration { Bean ConditionalOnClass(StringRedisTemplate.class) public ArkCacheService redisCacheService(StringRedisTemplate redisTemplate, ArkRedisProperties properties) { return new RedisCacheService(redisTemplate, properties.getPrefix()); } Bean ConditionalOnMissingBean(ArkCacheService.class) ConditionalOnProperty(prefix ark.redis, name fallback, havingValue true, matchIfMissing true) public ArkCacheService localCacheService() { return new LocalCacheService(); } }十、第六步注册自动配置文件路径src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports内容com.ark.starter.autoconfigure.ArkRedisAutoConfiguration十一、核心运行流程1. 引入 starter 2. Spring Boot 启动 3. 加载 AutoConfiguration 4. 判断 Redis 是否存在 5. 存在 → 用 RedisCacheService 6. 不存在 → fallback → LocalCacheService 7. 注入 ArkCacheService十二、核心设计点总结 1. 条件装配ConditionalOnClass 判断 Redis 是否存在 2. 开关控制ConditionalOnProperty 控制是否启用功能 3. 降级策略ConditionalOnMissingBean Redis 不可用 → 自动 fallback 4. 配置驱动ConfigurationProperties application.yml 控制行为十三、你可以怎么讲这个项目面试标准话术我实现了一个自定义 Starter用于统一缓存访问。通过 ConditionalOnClass 判断 Redis 是否存在使用 ConditionalOnProperty 控制开关同时提供本地缓存作为降级策略最终通过接口抽象实现可插拔缓存架构。十四、总结一句话❗ Starter 的本质让用户“引依赖 写配置”就能获得完整能力十五、最后重点做完这个 Starter其实已经具备自动装配能力条件装配理解配置驱动能力基础架构设计能力 这已经是中级后端 架构意识的水平。

更多文章