1. 在zuul网关服务中实现限流
1.1 为什么需要限流?
限流是为了保证服务器的负载量处于正常状态,因为如果太多的访问量可能会直接导致服务的崩溃。
1.2 如何实现限流
1.2.1 令牌桶算法简介
在zuul中实现限流是通过创建一个filter实现的,底层算法采用的是令牌桶算法,令牌桶会每秒往桶中投放一定数量的令牌,如果令牌桶中的令牌达到了临界值,新产生的令牌就会丢弃,当请求到达zuul网关后,会向令牌桶中提取令牌,如果成功拿到令牌则放行请求,如果没有拿到令牌则直接拒绝。
1.2.2 编码实现限流过滤器
package com.qingyun.apigetaway.filter;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import com.qingyun.apigetaway.exception.RateLimterException;
import org.springframework.stereotype.Component;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;
@Component
public class RateLimiterFilter extends ZuulFilter {
//限流桶实现 每秒钟100个令牌
private static final RateLimiter RATELIMITER=RateLimiter.create(100);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
//限流过滤器要最先运行
return SERVLET_DETECTION_FILTER_ORDER-1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
if(!RATELIMITER.tryAcquire()){
//判断是否取到令牌
//没有取到令牌 直接抛出异常
throw new RateLimterException();
}
return null;
}
}
这里需要注意的是,限流过滤器要放在其他所有过滤器之前。
2. 在zuul网关服务中实现用户鉴权(访问鉴权)
2.1 为什么需要鉴权操作?
鉴权操作在每一个项目中都是必须要具备的一个功能,因为在每一个项目中都会有敏感数据,一些比较重要的数据有具有相关权限的用户才能够访问,比如在一个点餐项目中,普通用户只能够访问商品的信息,而不能对商品信息进行修改,而对于卖家(管理员),它即可访问商品信息,也可以对商品信息进行修改。
2.2 如何实现访问鉴权?
2.2.1 首先搭建SpringCloudBus、StringCloudConfigClient用于动态更新访问路径,如果尚未搭建zuul可以查看我的另一篇博客:使用zuul构建ApiGetaway网关服务
2.2.1.1 导入配置客户端、事件消息总线、redis所需的maven依赖
<dependencies>
<!--
省略部分maven依赖
-->
<!--SpringCloudConfig配置客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--SpingCloudBus事件消息总线 用户动态更新配置信息-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<