网站首页 > java教程 正文
Spring Cloud的API网关不但可以实现类似NGINX+Lua强大的路由分发,实现动静页面的分流,更重要可以实现对所有发往后端微服务请求的拦截。Zuul主要有四种类型的过滤器,我们可以为特定的url模式添加任意数量的过滤器。
- “pre” 预过滤器 - 在路由分发一个请求之前调用。
- “post” 后过滤器 - 在路由分发一个请求后调用。
- “route” 路由过滤器 - 用于路由请求分发。
- “error” 错误过滤器 - 在处理请求时发生错误时调用
上图显示这几种过滤器的前后调用顺序,第一个是pre过滤器然后是Route过滤器,最后响应是post过滤器。
下面我们开始演示这几种过滤器的开发,Springcloud的开发三板斧就是pom.xml、application配置和元注解三种,首先pom.xml如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
下面是自己实现这四种过滤器,只要实现com.netflix.zuul.ZuulFilter接口,然后实现方法filterType,返回字符串为这四种类型pre post route error。
@Override
public String filterType() {
return "pre;//关键在这里,四种类型定义
}
比如实现pre类型预处理器代码:
public class PreFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
System.out.println(
"Pre Filter: Request Method : " + request.getMethod() + " " +
"Request URL : " + request.getRequestURL().toString());
return null;
}
}
这里虽然类名PreFilter,其实是可以任意取名的,在run方法中我们定义了该过滤器应该做的事情。
其他几种也是类似这样建立,这里省去,可见文后的源码。
下面我们来运行调试验证,首先还是启动Producer服务,当然也可以启动注册服务器,这取决于你只使用URL路径分发还是服务ID分发。这部分设置见上篇
运行我们的Zuul应用,然后访问http://localhost:8080/producer/articles
控制台输出如下:
Pre Filter: Request Method : GET Request URL : http://localhost:8080/producer/articles
Route: Using Route Filter
Post:Using Post Filter
过滤器作用比较大,一般用来作为安全拦截,当然最好不要侵入业务,否则这里变成一个业务服务网关,当然你也可以美其名曰“中台”,其实像ESB消息总线等复杂业务侵入式的中台都是多余的。微服务倡导智能终端哑管道理念,哑管道就是管道必须简单,是个哑巴,不要太智能。
由于Zuul充当我们所有微服务的代理,我们可以使用Zuul服务来实现一些跨领域的问题,如安全性,速率限制等。一个常见的用例是将Authentication头转发给所有下游服务。
通常在微服务中,我们将使用OAuth服务进行身份验证和授权。一旦客户端通过身份验证,OAuth服务将生成一个令牌,该令牌应包含在发送给其他微服务的请求中,以便客户端无需单独为每个服务进行身份验证。我们可以使用Zuul过滤器来实现这样的功能。当然实际中会使用JWT令牌格式。
猜你喜欢
- 2024-11-04 【快学springboot】12.实现拦截器
- 2024-11-04 Spring Boot 中的拦截器和过滤器到底有什么区别?
- 2024-11-04 SpringBoot中的过滤器和拦截器有什么区别?
- 2024-11-04 为什么你写的拦截器注入不了Java bean?
- 2024-11-04 java服务-springboot拦截器实现用户登录Token及权限校验
- 2024-11-04 JAVAEE就业工程师教程之第4章 Struts2拦截器
- 2024-11-04 Spring框架功能分为哪些模块?(spring框架有哪几部分组成)
- 2024-11-04 高级码农Spring Boot实战进阶之过滤器、拦截器的使用
- 2024-11-04 轻量级 Java 权限认证框架Sa-Token初体验(五)
- 2024-11-04 一个拦截器和一个awk命令,秒查线上超时接口
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)