1. 程式人生 > 其它 >介面訪問次數_spring boot 流量控制 控制使用者訪問api的次數

介面訪問次數_spring boot 流量控制 控制使用者訪問api的次數

技術標籤:介面訪問次數

FlowControl(流量控制)

FlowControl想要解決的問題是控制api訪問次數,防止惡意呼叫api。支援分散式應用的使用。

spring boot 支援flowcontrol-spring-boot-starter

db3fdb0f3d991dcd4f4fc82ebe6a1dd1.png

原理

攔截連結並計數,如果超過次數,返回錯誤資訊,沒有超過次數則通過。

使用了分散式鎖來控制準確的攔截。

將訪問資料儲存到redis來保證分散式下的運用。

分散式下運用注意要redis訪問的是同一個資料庫


如何使用

  • 配置流量控制資訊
  • 實現介面FlowControlConfigurer
public class CustomFlowControlConfigurer implements FlowControlConfigurer {/*** * 配置redis客戶端 */@Overridepublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379");RedissonClient redisson = Redisson.create(config);return redisson;}/*** * 配置攔截成功後-執行的動作 */@Overridepublic FlowControlInterceptAction flowControlInterceptAction() {return new DefaultFlowControlInterceptAction();}/*** * 配置攔截資料來源 */@Overridepublic FlowControlDao flowControlDao() {return new InMemoryFlowControlDao();}/*** * 配置redis key的命名策略 */@Overridepublic RedisKeyNameStrategy redisKeyNameStrategy() {return new DefaultRedisKeyNameStrategy();}}

Filter(servlet過濾器)

@Configurationpublic class SpringMvcConfig extends WebMvcConfigurerAdapter {@Autowiredprivate CustomFlowControlConfigurer flowControlConfigurer;/*** * 使用servlet的filter *  * @return */@Beanpublic FilterRegistrationBean testFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new FlowControlFilter(flowControlConfigurer));registration.addUrlPatterns("/*");registration.setName("flowControlFilter");registration.setOrder(1);return registration;}}

Interceptor(springmvc攔截器)

@Configurationpublic class SpringMvcConfig extends WebMvcConfigurerAdapter {@Autowiredprivate CustomFlowControlConfigurer flowControlConfigurer;/*** * 使用springmvc的interceptor */@Overridepublic void addInterceptors(InterceptorRegistry registry) {FlowControlHandlerInterceptor flowControlHandlerInterceptor = new FlowControlHandlerInterceptor(flowControlConfigurer);registry.addInterceptor(flowControlHandlerInterceptor).addPathPatterns("/**");super.addInterceptors(registry);}}