「 从0到1学习微服务SpringCloud 」12 Zuul的综合使用
上次讲了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的综合使用的更多相关文章
- 「 从0到1学习微服务SpringCloud 」10 服务网关Zuul
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...
- 「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- 「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 Eureka的高可用需要 ...
- 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! Spring Cloud Eureka 基于Netflix Eureka做了二次封装(Spring Clo ...
随机推荐
- vue-learning:6-template-v-bind
绑定元素特性的指令v-bind 回顾下,从HTML元素的结构看,在VUE框架中,内容由插值{{ }}和v-html绑定:v-if和v-show可以控制元素的可见性:v-for可以用于批量生成列表元素. ...
- onload事件属性,JQ中的load,ready方法
onload事件属性,JQ中的load,ready方法 前言 页面中的很多操作,需要我们在所需资源下载完成后,才可以进行操作,而资源没有及时下载,我们进行操作的话,是会报错.因此我们需要熟练掌握哪些事 ...
- 纵我不往,知识不来--学习Java第一周心得
暑假第一周,也是开始学习java的第一周. 本周的主要时间花在了小学期的任务上,但也草草开始了java的学习.首先安装好了所需要的软件,然后在网上下载了一份<Java基础笔记>,看了前五章 ...
- slim中的参数获取
官方文档中对于get和post的参数有以下获取方式 $app->get('/', function (Request $req, Response $res, $args = []) { $my ...
- Linux基础:CentOS 6重置密码
1.开机,按"e"键,进入GNU GRUB引导界面,上下键选择中间行 2.按"e"键,进入编辑界面,末行quiet后空格,输入"1"或者&q ...
- Spark RDD的弹性到底指什么
RDD(Resiliennt Distributed Datasets)抽象弹性分布式数据集对于Spark来说的弹性计算到底提现在什么地方? 自动进行内存和磁盘数据这两种存储方式的切换 Spark 可 ...
- mysql中information_schema.views字段说明
1.查看视图并不是查询视图数据,而是查看数据库中已经存在的视图的定义,查看视图必须要有SHOW VIEW权限,MySQL的数据库下的user表中存储这这个数据.查看视图的方法有:DESCRIBE,SH ...
- 洛谷P-4782 2-sat+Tarjan
https://www.luogu.org/problemnew/solution/P4782 这里的大佬已经说的够好了 #include<iostream> #include<cs ...
- Spring Boot (5) 整合 RabbitMQ
一.前言 RabbitMQ是实现了AMQP(高级消息队列协议)的开源消息中间件,RabbitMQ服务器是用Erlang(面向并发的编程语言)编写的. RabbitMQ官网下载地址:https://ww ...
- Python中三大框架各自的应用场景(DJango,flask,Tornado)
django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实 ...