【开发技巧/经验分享】在Zuul网关服务中实现限流、用户鉴权(访问鉴权) 、跨域访问

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>
         <
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值