SpringCloud-Zuul服务网关[自定义网关过滤器]
时间:2022-06-24
本文章向大家介绍SpringCloud-Zuul服务网关[自定义网关过滤器],主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP,本文我们就来具体介绍下自定义的zuul过滤器
自定义网关过滤器
1.创建项目
创建一个普通的SpringBoot项目项目
2.添加依赖
注意添加zuul的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
3.修改配置
修改application.properties文件
spring.application.name=zuul-gateway-filter
server.port=9020
# eureka注册中心配置
eureka.client.serviceUrl.defaultZone=http://dpb:123456@eureka1:8761/eureka/,http://dpb:123456@eureka2:8761/eureka/
4.创建自定义的过滤器
创建自定义的过滤器,继承自ZuulFilter并重写相关的方法
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
/**
* 自定义网关过滤器
* @author dengp
*
*/
@Component
public class LogFilter extends ZuulFilter{
private Logger logger = LoggerFactory.getLogger(LogFilter.class);
/**
* 过滤方法
*/
@Override
public Object run() {
// 获取Request上下文
RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest request = rc.getRequest();
logger.info("LogFilter .... 请求的路径是{},请求提交的方式是{}", request.getRequestURL().toString(),request.getMethod());
return null;
}
/**
* 是否开启过滤:默认false
*/
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
/**
* 多个过滤器中的执行顺序,数值越小,优先级越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
/**
* 过滤器的类型
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre";
}
}
5.演示效果
启动一个provider服务后,启动我们的网关服务,然后请求访问,查询控制台输出.
注意控制台:
日志有输出,说明自定义的网关过滤器执行了。
网关过滤器类型介绍
网关过滤器的自定义方法有四个,过滤器的类型有四个,分别如下:
zuul请求的生命周期
zuul的生命周期要结合我们上面介绍的过滤器的类型来分析,具体如下图:
网关过滤器拦截请求
网关过滤器是如何拦截不合法的请求的呢?我们来看下具体的代码
/**
* 过滤方法
*/
@Override
public Object run() {
// 获取Request上下文
RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest request = rc.getRequest();
String token = request.getParameter("token");
if(token == null){
// 拦截请求
////代表请求结束。不在继续向下请求
rc.setSendZuulResponse(false);
//添加一个响应的状态码
rc.setResponseStatusCode(401);
//响应内容
rc.setResponseBody("{"result":"token is null"}");
//响应类型
rc.getResponse().setContentType("text/json;charset=utf-8");
}
// 放过请求
return null;
}
不加参数访问失败:
添加参数:
过滤器的执行顺序
过滤器类型相同的会根据filterOrder方法的返回结果的大小来排序,不同类型根据类型的特点执行。
利用网关实现异常的统一处理
1.异常过滤器
我们需要创建类型为error的网关过滤器
@Component
public class ErrorFilter extends ZuulFilter{
private Logger logger = LoggerFactory.getLogger(ErrorFilter.class);
/**
* 过滤方法
*/
@Override
public Object run() {
// 获取Request上下文
RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest request = rc.getRequest();
logger.info("LogFilter .... 请求的路径是{},请求提交的方式是{}", request.getRequestURL().toString(),request.getMethod());
return null;
}
/**
* 是否开启过滤:默认false
*/
@Override
public boolean shouldFilter() {
// TODO Auto-generated method stub
return true;
}
/**
* 多个过滤器中的执行顺序,数值越小,优先级越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
/**
* 过滤器的类型
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "error";
}
}
2.统一异常处理
/**
* 对异常响应内如处理
* @author Administrator
*
*/
@RestController
public class ExceptionHandler implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping(value="/error")
public String error(){
return "{"result":"500 error!!!!"}";
}
}
- 用Python使用C语言程序(Windows平台)
- 译文 | 在使用过采样或欠采样处理类别不均衡数据后,如何正确做交叉验证?
- 花式解释AutoEncoder与VAE
- 用CNN做句子分类:CNN Sentence Classification (with Theano code)
- MySQL与Python的交互
- 实时Android语音对讲系统架构
- ElasticSearch优化系列二:机器设置(内存)
- Tensorflow之 CNN卷积神经网络的MNIST手写数字识别
- 你听过算法也是可以贪心的吗?
- 前后端分离ueditor富文本编辑器的使用-Java版本
- Golang语言社区--Go语言基础第六节函数
- Golang语言社区--理解 go interface 的 5 个关键点
- 得到一个物种所有基因的TSS(转录起始位点)区域的bed文件。
- 如何选择聚类模块数目
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释