介面訪問次數_spring boot 流量控制 控制使用者訪問api的次數
阿新 • • 發佈:2021-01-23
技術標籤:介面訪問次數
FlowControl(流量控制)
FlowControl想要解決的問題是控制api訪問次數,防止惡意呼叫api。支援分散式應用的使用。
spring boot 支援flowcontrol-spring-boot-starter
原理
攔截連結並計數,如果超過次數,返回錯誤資訊,沒有超過次數則通過。
使用了分散式鎖來控制準確的攔截。
將訪問資料儲存到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);}}