Feign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得更加简单。然而,Feign 本身并不提供内置的缓存功能。要实现缓存,你需要结合 Spring Cloud 的其他组件来实现。
以下是一个使用 Spring Cloud Gateway 和 Spring Cache 实现 Feign 调用缓存的方法:
1、添加依赖
在你的项目中添加 Spring Cloud Gateway 和 Spring Cache 的依赖:
org.springframework.cloud
spring-cloud-starter-gateway
org.springframework.boot
spring-boot-starter-cache
2、配置缓存
在你的 application.yml
或 application.properties
文件中配置缓存:
spring:
cache:
type: caffeine
caffeine:
spec: maximumSize=500,expireAfterAccess=600s
这里我们使用了 caffeine 作为缓存提供者,并设置了缓存的最大大小和过期时间。
3、创建缓存注解
创建一个自定义注解,用于标记需要进行缓存的方法:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cacheable {
}
4、创建缓存管理器
创建一个缓存管理器,用于处理缓存的存储和获取:
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig extends CachingConfigurerSupport {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("cache");
}
}
5、使用缓存注解
在你的 Feign 客户端接口中使用 @Cacheable
注解:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "https://www.yisu.com/ask/service-provider")
public interface ServiceProviderClient {
@GetMapping("/hello/{name}")
@Cacheable(value = "https://www.yisu.com/ask/hello", key = "#name")
String hello(@PathVariable("name") String name);
}
这里我们使用 @Cacheable
注解标记了 hello
方法,表示这个方法的结果需要进行缓存。缓存的 key 是方法参数 name
。
6、配置 Gateway 路由
在你的 Gateway 路由配置文件中,将 Feign 客户端接口暴露为一个 HTTP 端点:
spring:
cloud:
gateway:
routes:
- id: service-provider-route
uri: lb://service-provider
predicates:
- Path=/hello/**
现在,当你调用 /hello/{name}
端点时,Feign 客户端会将结果存储在缓存中,并在后续调用中直接从缓存中获取结果,从而实现缓存。