以下为Zuul利用ratelimit在网关进行接口限流。
限流方案
方案 | 说明 |
---|---|
基于用户id | 根据用户标识或匿名 |
基于用户角色 | 根据用户角色 |
基于用户源IP | 请求源IP |
基于请求URL | 下游服务地址 |
基于请求方法类型 | HTTP请求方法,GET、POST等 |
基于请求服务 | 下游服务 |
POM引入
1 | <!-- 请求限流 --> |
参数配置
1 | #60秒内允许10个访问,并且要求总请求时间小于1000秒 |
其中,user=anonymous
和role=user
采用Shiro
或者Spring Security
进行维护,或者自定义request域UserPrincipal。
数据存储
- InMemory(ConcurrentHashMap)
- Redis
- Consul
- Spring Data JPA
- JCache
- Infinispan
- Hazelcast
- Ignite
将会对服务集群的请求情况同步至选择的存储中,以做到数据共享和实时存储。
源码及原理分析
自定义key
1 |
|
自定义错误
1 |
|
自定义用户和角色
SecuredRateLimitUtils.java1
2
3
4
5
6
7
8
public Set<String> getUserRoles() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null) {
return emptySet();
}
return AuthorityUtils.authorityListToSet(authentication.getAuthorities());
}
SecurityContextHolder为Spring Security框架,可获取用户角色和标识。
Spring Security样例如下:1
2
3
4
5
6
7
8
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user")
.password("password")
.roles("USER");
}