鉴权

接上篇来,写一个简单的鉴权

请求必须携带token参数,若无token,则拒绝请求

其中

  • filterType--过滤器类型,这里使用PRE_TYPE前置
  • filterOrder--过滤器顺序,数值越小优先级越高,这里放在前置数值(PRE_DECORATION_FILTER_ORDER)的前边
  • shouldFilter--填true
  • run--过滤器的具体运行
package com.viki.apigateway.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/*** 前置过滤器,有token才允许访问* @Author Sakura* @Date 13/11/2019**/
@Component
public class TokenFilter extends ZuulFilter {@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {//过滤器顺序,放到pre过滤器之前(值越小优先级越高)return PRE_DECORATION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();HttpServletRequest request = requestContext.getRequest();//从url参数获取,也可以从cookie和header获取String token = request.getParameter("token");if(StringUtils.isEmpty(token)){requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;}
}

限流

对流量的限制,避免因请求过大而引起不必要的损失。

房子pre过滤器中,时机是请求被转发之前调用,如果pre有多个过滤器,应放在最前边

有许多限流策略,这里选择令牌桶(token bucket)

发牌器按固定速率向令牌桶中添加令牌,若令牌桶满,则丢弃,不满则继续放。请求过来时就会从桶中拿令牌,如果拿到就放行,拿不到就拒绝请求。

新建 RateLimitFilter 文件,使用谷歌集成的令牌桶

package com.viki.apigateway.filter;import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import com.viki.apigateway.exception.RateLimitException;
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;/*** 限流* @Author Sakura* @Date 13/11/2019**/
@Component
public class RateLimitFilter extends ZuulFilter {//google令牌桶,每秒放100个private static RateLimiter RATE_LIMITERR = RateLimiter.create(100);@Overridepublic String filterType() {return PRE_TYPE;}@Overridepublic int filterOrder() {//最高优先级(比最小的数小)return SERVLET_DETECTION_FILTER_ORDER - 1;}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic Object run() throws ZuulException {if(!RATE_LIMITERR.tryAcquire()){throw new RateLimitException();}return null;}
}

跨域

ajax存在同源策略,违反同源策略就会产生同源问题。解决同源问题有两种思路

  • 使用@CrossOrigin注解,不过这是针对方法而言
  • 在zuul中统一配置,针对对所有项目

zuul统一配置方法

package com.viki.apigateway.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;import java.util.Arrays;/*** 跨域配置* @Author Sakura* @Date 13/11/2019* C - Cross   O - Origin  R - Resource  S - Sharing**/
@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter(){final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();final CorsConfiguration config = new CorsConfiguration();config.setAllowCredentials(true);  //允许cookie跨域config.setAllowedHeaders(Arrays.asList("*")); //允许所有头config.setAllowedMethods(Arrays.asList("*")); //允许所有方法,GET,POST等config.setAllowedOrigins(Arrays.asList("*"));  //原始域,比如自己的www.viki.comconfig.setMaxAge((long) 3001); //缓存时间,指定时间段内不再检查source.registerCorsConfiguration("/**", config);return new CorsFilter(source);}
}

SpringCloud Zuul服务网关实操相关推荐

  1. springcloud 网关_Spring Cloud 系列之 Netflix Zuul 服务网关(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里: 哈喽沃德先生:Spring Cloud 系列之 Netflix Zuul 服务网关(一)​zhuanlan.zhihu.com 本篇文章讲解 Zuul ...

  2. Spring Cloud浅谈个人尝鲜------Zuul 服务网关(五)

    Spring Cloud浅谈个人尝鲜------Zuul 服务网关(五) 前面几篇文章我们学习了Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止 ...

  3. Zuul服务网关二个功能请求的路由和过滤器使用

    Zuul服务网关 1.理解Zuul ​ Zuul 是从设备和网站到应用程序后端的所有请求的前门.作为边缘服务应用程序,Zuul 旨在实现动 态路由,监视,弹性和安全性.Zuul 包含了对请求的路由和过 ...

  4. SpringCloud 微服务网关Gateway 动态路由配置

    概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...

  5. Spring Cloud 系列之 Netflix Zuul 服务网关(三)

    本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Netflix Zuul 服务网关(一) Spring Cloud 系列之 Netflix Zuul 服务网关(二) ...

  6. 带你入门SpringCloud 之 服务网关 Zuul

    前言 服务端提供 RestFul API ,客户端如果想要使用某个服务直接调用服务的API 即可.但是在微服务环境中会有很多的具体服务,而客户端在需要使用众多的服务时在和具体的服务打交道这样虽然可以实 ...

  7. Spring-Cloud 微服务网关Zuul、ZuulFilter过滤器和限流

    微服务网关 一. Zuul网关 1. 创建工程 并导入依赖 2. application.yml 配置文件 3. 启动类添加注解 4. 依次启动服务 5. 进入浏览器访问测试 二. ZuulFilte ...

  8. SpringCloud 微服务网关Gateway介绍及简单路由配置

    概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现.网关作为用 ...

  9. SpringCloud Gateway 服务网关,断言

    SpringCloud Gateway 是SpringCloud 生态系中的网关,不仅提供统一路由功能,通过 Filter 过滤链实现网关的基本功能,比如用户验证,鉴权,限流等功能.它使用非阻塞模式, ...

最新文章

  1. Redis源码解析——有序整数集
  2. 易生信-扩增子教程01-背景介绍
  3. 东莞与华为共建国家新型智慧城市建设示范区
  4. virtualbox安装时发生严重错误_Docker 安装(windows 10)
  5. 银联高校极客挑战赛 初赛 第一场、第二场合集(3+3题)
  6. DLNA, PulseAudio, diffpatch, bash
  7. [转]ReiserFS与ext3的比较
  8. c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)
  9. threejs获取模型坐标_Threejs倒影实现解析
  10. 相似性度量:机器学习距离公式总结
  11. 网站服务器系统组成,linux系统由哪几部分组成_网站服务器运行维护,linux
  12. (zt)svn 随服务器启动
  13. kafka是什么_Kafka为什么快到根本停不下来?
  14. netron神经网络可视化
  15. java重新打开jframe,Java的; Jframe不重新绘制
  16. 网约车源码 打车APP 同城打车代驾小程序源码
  17. 2021年零基础学Delphi 11开发极简教程
  18. ClientKey实现登录QQ空间,并设置背景音乐
  19. allegro 导 bom
  20. C#简单实现摄影测量后方交会

热门文章

  1. 中国高端床上用品市场报告发布,分析整体市场规模、增速
  2. img图片不显示时设置默认图片
  3. 偏好:个人习惯的局限与反思
  4. 【Mac版】Python安装教程--Python安装步骤
  5. 程序员5-2004-2005
  6. [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果
  7. jlink命令行操作
  8. 使用solr模拟京东搜素功能
  9. Kafka的ack机制
  10. 树莓派组装成linux电脑,可放进口袋基于树莓派的GNU/Linux电脑