SpringBoot+Caffeine+Micrometer:多缓存配置与可观测性实现
实现两个独立配置的Caffeine缓存+Micrometer监控
1. 缓存配置类实现
创建配置类,为两个第三方服务分别定义独立的缓存实例,同时绑定Micrometer指标采集:
import com.github.benmanes.caffeine.cache.Caffeine; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.cache.CaffeineCacheMetrics; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.caffeine.CaffeineCache; import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @Configuration @EnableCaching public class CacheConfig { // 第三方服务1缓存:1小时过期,最大容量1000 @Bean public Cache service1Cache(MeterRegistry meterRegistry) { Caffeine<Object, Object> caffeineConfig = Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.HOURS) .maximumSize(1000) .recordStats(); // 开启缓存统计 CaffeineCache cache = new CaffeineCache("service1-cache", caffeineConfig.build()); // 绑定Micrometer指标,指定缓存标识 CaffeineCacheMetrics.monitor(meterRegistry, cache, "service1-cache"); return cache; } // 第三方服务2缓存:2小时过期,最大容量500 @Bean public Cache service2Cache(MeterRegistry meterRegistry) { Caffeine<Object, Object> caffeineConfig = Caffeine.newBuilder() .expireAfterWrite(2, TimeUnit.HOURS) .maximumSize(500) .recordStats(); CaffeineCache cache = new CaffeineCache("service2-cache", caffeineConfig.build()); CaffeineCacheMetrics.monitor(meterRegistry, cache, "service2-cache"); return cache; } // 将两个缓存注册到CacheManager @Bean public CacheManager cacheManager(List<Cache> caches) { SimpleCacheManager manager = new SimpleCacheManager(); manager.setCaches(caches); return manager; } }
2. 服务层绑定缓存
在调用第三方服务的方法上,指定对应缓存名称即可:
import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class ThirdPartyCallerService { @Cacheable(value = "service1-cache", key = "#requestParam") public String callService1(String requestParam) { // 调用第三方服务1的逻辑(原耗时超5秒) return "service1-response"; } @Cacheable(value = "service2-cache", key = "#requestParam") public String callService2(String requestParam) { // 调用第三方服务2的逻辑(原耗时超5秒) return "service2-response"; } }
3. 监控指标说明
Micrometer会自动生成带缓存标识的核心指标(以Prometheus格式为例):
cache_gets_total{cache="service1-cache",result="hit"}:缓存命中次数cache_gets_total{cache="service1-cache",result="miss"}:缓存未命中次数cache_size{cache="service2-cache"}:缓存当前存储量cache_load_duration_seconds{cache="service2-cache"}:缓存加载耗时
这些指标可通过Spring Boot的/actuator/prometheus端点获取(需引入spring-boot-starter-actuator和micrometer-registry-prometheus依赖)。
注意事项
- 确保已引入依赖:
spring-boot-starter-cache、com.github.benmanes.caffeine:caffeine、micrometer-core - 缓存key需根据实际请求参数合理设计,避免缓存击穿/雪崩
- 如需基于访问时间过期,可替换
expireAfterWrite为expireAfterAccess
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

