1 Star 0 Fork 61

/ RateLimiter

forked from wkiny / RateLimiter 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
readme.md 2.99 KB
一键复制 编辑 原始数据 按行查看 历史
wkiny 提交于 2018-01-19 15:23 . 更新 readme.md

FlowControl(流量控制)

FlowControl想要解决的问题是控制api访问次数,防止恶意调用api。支持分布式应用的使用。
spring boot 支持flowcontrol-spring-boot-starter


原理

拦截链接并计数,如果超过次数,返回错误信息,没有超过次数则通过。
使用了分布式锁来控制准确的拦截。
将访问数据保存到redis来保证分布式下的运用。
分布式下运用注意要redis访问的是同一个数据库


如何使用

  • 配置流量控制信息
    实现接口FlowControlConfigurer
public class CustomFlowControlConfigurer implements FlowControlConfigurer {
	
	/***
	 * 配置redis客户端
	 */
	@Override
	public RedissonClient redissonClient() {
		Config config = new Config();
		config.useSingleServer().setAddress("redis://localhost:6379");
		RedissonClient redisson = Redisson.create(config);
		return redisson;
	}
	
	/***
	 * 配置拦截成功后-执行的动作
	 */
	@Override
	public FlowControlInterceptAction flowControlInterceptAction() {
		return new DefaultFlowControlInterceptAction();
	}
	
	/***
	 * 配置拦截数据来源
	 */
	@Override
	public FlowControlDao flowControlDao() {
		return new InMemoryFlowControlDao();
	}
	
	/***
	 * 配置redis key的命名策略
	 */
	@Override
	public RedisKeyNameStrategy redisKeyNameStrategy() {
		return new DefaultRedisKeyNameStrategy();
	}
	
}

Filter(servlet过滤器)

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

Interceptor(springmvc拦截器)

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

样例

flow-control-sample

采用的技术

License

Flow Control is Open Source software released under the Apache 2.0 license

Java
1
https://gitee.com/ppiao/flow-control.git
git@gitee.com:ppiao/flow-control.git
ppiao
flow-control
RateLimiter
master

搜索帮助