OpenFeign 是一个声明式的 Web 服务客户端,它让编写 Web 服务客户端变得更加容易。它通过接口和注解的方式,简化了对远程服务的调用过程,常用于微服务架构中,服务之间的通信。
在一些场景下,为了提高性能,减少重复的网络请求和服务端的负载,缓存机制是很有必要的。例如,当对同一个远程服务接口的相同参数的请求在短时间内多次发起时,如果能够缓存第一次请求的结果,后续的请求直接使用缓存数据,就可以大大提高响应速度。
Caffeine 是一个高性能的 Java 缓存库,它在许多方面类似于 Guava Cache,但在性能和功能上有自己的特点。Caffeine 是基于 Java 8 编写的,充分利用了 Java 8 的新特性,如Lambda表达式、Streams等来提供高效、灵活的缓存功能。
在 pom.xml 文件中添加 Spring Boot Cache 和 Caffeine 的相关依赖,如下:
<!-- 缓存 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.1.8</version> </dependency>
创建一个配置类来配置 Caffeine 缓存管理器,如下:
@Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder() .expireAfterWrite(60, TimeUnit.SECONDS) .maximumSize(100)); return cacheManager; } }
上述代码中:
@Configuration 注解表明这是一个配置类。
@EnableCaching 注解开启 Spring 的缓存支持。使用 @EnableCaching 注解,就会创建并注册一个 CachingCapability Bean,这样你的 Feign 客户端就能识别其接口上的 @Cache* 注解。
cacheManager 方法创建了一个 CaffeineCacheManager 实例。通过 setCaffeine 方法设置了 Caffeine 缓存的构建器。这里设置了缓存的最大容量为 100 个元素,并且元素在写入后 60 秒过期。
假设你有一个服务类,其中有一个方法需要缓存结果,如下:
@FeignClient(value = "SERVICE-DEMO", contextId = "advancedFeign", path = "/simple", configuration = AdvancedFeign.AdvancedFeignConfig.class) public interface AdvancedFeign { // @Cacheable 注解可以开启缓存 @Cacheable("info") @GetMapping(path = "/info") String demo4(); }
上述例子中:
@Cacheable 注解用于标记 demo4() 方法的结果可以被缓存。
“info”是缓存的名称,当第一次调用 demo4() 方法时,方法的结果会被存储到名为 info 的缓存中。之后再次调用该方法时,如果缓存中有对应的值,就直接从缓存中获取,而不会执行方法体中的代码。
使用 @Autowired 注解注入 AdvancedFeign 的实例,调用方法:
@GetMapping(path = "/advanced/demo4") public String demo4() { return advancedFeign.demo4(); }
输出结果如下图:
注意:你也可以通过属性 spring.cloud.openfeign.cache.enabled=false 来禁用该功能。