使用Spring Cloud Zuul实现过滤器或拦截器功能案例

简介: 使用Spring Cloud Zuul实现过滤器或拦截器功能案例

 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令牌格式。

目录
相关文章
|
9天前
|
负载均衡 Java API
Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
【6月更文挑战第9天】Spring Cloud OpenFeign是声明式服务调用库,简化了微服务间调用。通过动态代理,它允许开发者用Java接口调用HTTP服务,支持服务发现、负载均衡。本文介绍了OpenFeign的基本概念,展示了如何添加依赖、开启客户端和定义服务接口。还讨论了接口调用失败、超时重试和日志配置等问题及其解决方案,并提供了自定义Feign配置的代码示例。通过学习,读者可以更好地在微服务架构中使用OpenFeign进行服务通信。
166 4
|
10天前
|
消息中间件 负载均衡 Java
Java一分钟之-Spring Cloud:微服务架构工具集
【6月更文挑战第8天】本文介绍了Spring Cloud的核心组件,包括Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Zuul(API网关)、Hystrix(断路器)、Spring Cloud Config(配置中心)和Spring Cloud Bus(事件总线)。文中强调了各组件的易错点,如Eureka的服务注册失败、Ribbon的配置、Zuul的路由错误、Hystrix的启用及配置、Config Server的加载失败和Bus的通讯问题,并给出了相应的代码示例和解决建议。在实际开发中,关注日志和使用调试工具是保证微服务系统稳定运行的关键。
91 6
|
2天前
|
Java 测试技术 持续交付
Java一分钟之-Spring Cloud Contract:契约测试
【6月更文挑战第16天】Spring Cloud Contract是微服务契约测试框架,通过DSL定义接口行为,使用WireMock生成存根进行独立开发验证。常见问题包括契约编写不清晰、未集成到CI/CD和契约版本控制混乱。例如,定义一个`GET /greeting`返回JSON响应的契约,Spring Cloud Contract会自动生成测试代码,帮助确保服务间接口一致性,提升开发效率和系统稳定性。
25 7
|
3天前
|
Java 数据库 开发者
深入解析 Spring Cloud Seata:分布式事务的全面指南
深入解析 Spring Cloud Seata:分布式事务的全面指南
15 1
|
3天前
|
监控 Java API
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
10 0
深入解析 Spring Cloud Sentinel:分布式系统流量控制与熔断降级的全面指南
|
3天前
|
Java Nacos 数据格式
Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
Spring Cloud Nacos 详解:服务注册与发现及配置管理平台
16 3
|
3天前
|
负载均衡 Java API
Spring Cloud Gateway 详解:构建高效的API网关解决方案
Spring Cloud Gateway 详解:构建高效的API网关解决方案
11 0
|
3天前
|
前端开发 Java 开发者
深入理解 Spring Boot 注解:核心功能与高级用法详解
深入理解 Spring Boot 注解:核心功能与高级用法详解
10 1
|
6天前
|
负载均衡 前端开发 Java
OpenFeign:Spring Cloud声明式服务调用组件
该文本是关于OpenFeign在Spring Cloud中的使用的问答总结。涉及的问题包括:OpenFeign是什么,Feign与OpenFeign的区别,如何使用OpenFeign进行远程服务调用,OpenFeign的超时控制以及日志增强。OpenFeign被描述为Spring官方的声明式服务调用和负载均衡组件,它支持使用注解进行接口定义和服务调用,如@FeignClient和@EnableFeignClients。OpenFeign与Feign的主要区别在于OpenFeign支持Spring MVC注解。超时控制通过Ribbon进行设置,默认超时时间为1秒。
|
8天前
|
Java API 开发者
Java一分钟之-Spring Cloud Gateway:API网关
【6月更文挑战第10天】Spring Cloud Gateway是Spring Cloud生态中的API网关组件,基于Spring Framework 5、Reactor和Spring Boot 2.0,支持响应式编程。它提供路由转发、过滤器链(包括预处理、路由和后处理)和断言功能。快速入门涉及添加相关依赖和配置路由规则。常见问题包括路由冲突、过滤器顺序和性能瓶颈。通过动态路由和过滤器示例,展示了其灵活性。Spring Cloud Gateway是微服务架构的有力工具,可提升系统稳定性和开发效率。
115 0