上次讲了Zuul的基本使用,这篇讲的是综合使用,比如过滤器,限流,鉴权等应用

这里继续使用api-getway这个项目

过滤器

实现token验证(前置过滤器)

1.新建一个类,继承ZuulFilter,细节方面看下面代码,还有别忘了在类上加@Component注解,否则不生效

@Component
public class TokenFilter extends ZuulFilter { /**
* 过滤器类型
* @return
*/
@Override
public String filterType() {
return PRE_TYPE;
} /**
* 优先级,数字越大,优先级越低
* 只做一般过滤,没有特殊要求的,可以放在内置过滤器后面
* @return
*/
@Override
public int filterOrder() {
//最后一个内置PRE过滤器后面
return PRE_DECORATION_FILTER_ORDER+1;
} /**
* 是否执行该过滤器,true代表需要过滤
* 这里可以忽略掉一些不需要过滤请求
* @return
*/
@Override
public boolean shouldFilter() {
return true;
} @Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String token = request.getParameter("token");
//如果没有token,则返回401
//这里就不做校验了,只判断有无
if(StringUtils.isEmpty(token)){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(HttpStatus.SC_UNAUTHORIZED);
ctx.setResponseBody("未登陆!");
//设置返回体的编码为UTF-8
HttpServletResponse response = ctx.getResponse();
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
}
return null;
}
}

2.开启Eureka Server,api-getway,service-hi项目

3.测试

不带token http://localhost:8900/myHi/hi

带token http://localhost:8900/myHi/hi?token=123

添加Response Header(后置过滤器)

1.新建一个类,继承ZuulFilter

@Component
public class AddResponseHeaderFilter extends ZuulFilter {
@Override
public String filterType() {
return POST_TYPE;
} @Override
public int filterOrder() {
//放在返回过滤器前
return SEND_RESPONSE_FILTER_ORDER - 1;
} @Override
public boolean shouldFilter() {
return true;
} @Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletResponse response = context.getResponse();
response.setHeader("my-response","hello");
return null;
}
}

2.开启Eureka Server,api-getway,service-hi项目

3.测试

http://localhost:8900/myHi/hi?token=123

限流

限流的功能也是经常会在网关实现,我们这里使用令牌桶算法实现,这个算法已经有相关实现了,直接用就行

令牌桶算法:一边以一个固定的速率发令牌,另一边用一个固定大小的桶装令牌,桶满了则将令牌该令牌丢弃,否则放进桶里。进来的请求尝试从桶里取令牌,取到令牌的请求放行,没有令牌的请求则会被拒绝。如下图

代码实现

1.新建一个类,继承ZuulFilter

@Component
public class RateFilter extends ZuulFilter {
/**
* 创建令牌桶 容量为1(为了方便测试,这里设置小一点)
*/
private static final RateLimiter RATE_LIMITER = RateLimiter.create(1); @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(!RATE_LIMITER.tryAcquire()){
//TODO 跳转到错误页面或友好提示
throw new RuntimeException("访问人数过多,请稍后再试!");
}
return null;
}
}

2.开启Eureka Server,api-getway,service-hi项目

3.测试

在过滤器run方法中打个断点,然后开3个浏览器tag访问http://localhost:8900/myHi/hi?token=123,进入断点后,点击忽略断点,再点击释放断点运行程序

结果:

至少有一个请求会被拒绝,后台抛出异常

跨域

浏览器是不允许跨域访问,通常解决跨域,可在接口类或方法加上@CrossOrigin(allowCredentials = “true”),但这种方法是很繁琐的,不可能有100个接口就加100次,所以我们这里可以使用Zuul实现跨域

代码实现

@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter(){
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
//是否支持Cookie跨域
config.setAllowCredentials(true);
//支持的原始域 *表示所有
config.setAllowedOrigins(Arrays.asList("*"));
//允许的头 *表示所有
config.setAllowedHeaders(Arrays.asList("*"));
//允许的请求方法 POST,GET等 *表示所有
config.setAllowedMethods(Arrays.asList("*"));
//缓存时间 表示300秒内对相同请求不需要再判断
config.setMaxAge(300L); //path参数为对哪些域名进行设置 /**表示所有
source.registerCorsConfiguration("/**",config);
return new CorsFilter(source);
}
}

因为跨域是需要在不同域名下,这里不太好演示,就不测试了。

以上3种是Zuul比较常用的一些使用方式,今天就到这里,下期见~

代码已更新至gitthub

https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1

如果觉得不错,分享给你的朋友!

一个立志成大腿而每天努力奋斗的年轻人

伴学习伴成长,成长之路你并不孤单!

「 从0到1学习微服务SpringCloud 」12 Zuul的综合使用的更多相关文章

  1. 「 从0到1学习微服务SpringCloud 」10 服务网关Zuul

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...

  2. 「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...

  3. 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  4. 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  5. 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  6. 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  7. 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  8. 「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 Eureka的高可用需要 ...

  9. 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! Spring Cloud Eureka 基于Netflix Eureka做了二次封装(Spring Clo ...

随机推荐

  1. Linux USB 和 sysfs

    由于单个 USB 物理设备的复杂性, 设备在 sysfs 中的表示也非常复杂. 物理 USB 设备 (通过 struct usb_device 表示)和单个 USB 接口(由 struct usb_i ...

  2. spring的69个问题

    1.什么是Spring? Spring是一个开源的Java EE开发框架.Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性.Sprin ...

  3. vue-cli 3.0 eslint

    1.关闭eslint module.exports = { configureWebpack: { devtool: 'source-map' }, lintOnSave: false } 2.修改e ...

  4. python3 实现删除数组中相同的元素

    # #把数组中相同的元素去除 # #第一种方式: def del_repeatnum(s=[1,1,1,2,2,3,3,4]): s1=[] for i in s: print(i) if i not ...

  5. mac笔记本安装Android sdk

    一.先下载android sdk for mac   给二个靠谱的网址: a). http://down.tech.sina.com.cn/page/45703.html b). http://mac ...

  6. 49.植入HTML和自定义元件库

    首先设置一个圆角矩形 设置鼠标单击时的k空用例 这样当鼠标单击时会有一个小手的图标 然后设置鼠标移入时的动作 鼠标移入时设置文本动作的文本

  7. 使用springboot + druid + mybatisplus完成多数据源配置

    一. 简介 1. 版本 springboot版本为2.0.3.RELEASE,mybatisplus版本为2.1.9, druid版本为1.1.9,swagger版本为2.7.0 2. 项目地址   ...

  8. 记录安装Python第三方包“tesserocr”的方法和遇到的坑

    1. 环境: 系统环境:Win7 32 位系统 Python版本: 3.6.5        虚拟环境为:Miniconda3 2. 共需要安装的模块: a. tesserocr b. tessera ...

  9. 使用Django进行后端开发

    目录 更换pip源 搭建虚拟环境 项目目录设置 项目相关配置 更换pip源 更换pip源 搭建虚拟环境 搭建虚拟开发环境 项目目录设置 项目目录设置 项目相关配置 项目相关配置

  10. JS进阶——this绑定了谁?

    一.this的意义 二.寻找this绑定对象 经常听到这么一句话,找this只需要看谁是调用方.当函数被调用时会记录函数调用调用方式.传参包括this等各种属性.有时候this绑定对象情况太抽象,找到 ...