OpenFeign 缓存

OpenFeign 是一个声明式的 Web 服务客户端,它让编写 Web 服务客户端变得更加容易。它通过接口和注解的方式,简化了对远程服务的调用过程,常用于微服务架构中,服务之间的通信。

在一些场景下,为了提高性能,减少重复的网络请求和服务端的负载,缓存机制是很有必要的。例如,当对同一个远程服务接口的相同参数的请求在短时间内多次发起时,如果能够缓存第一次请求的结果,后续的请求直接使用缓存数据,就可以大大提高响应速度。

用 Caffeine 实现缓存

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>

配置缓存管理器(CacheManager)

创建一个配置类来配置 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 秒过期。

使用 @Cacheable 注解

假设你有一个服务类,其中有一个方法需要缓存结果,如下:

@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 的缓存中。之后再次调用该方法时,如果缓存中有对应的值,就直接从缓存中获取,而不会执行方法体中的代码。

调用 Feign 客户端

使用 @Autowired 注解注入 AdvancedFeign 的实例,调用方法:

@GetMapping(path = "/advanced/demo4")
public String demo4() {
    return advancedFeign.demo4();
}

输出结果如下图:

f3b2c2ec9e337603cbd44f11b53b2230_1731316889579-63b1fce8-4b85-4370-a536-639b69d700f6.gif

注意:你也可以通过属性 spring.cloud.openfeign.cache.enabled=false 来禁用该功能。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号