Spring Cloud ——自定义网关Zuul的Filter

一:zuul服务网关的工作原理

zuul的底层是通过各种Filter来实现的,zuul中的filter按照执行顺序分为了“pre”前置(”custom”自定义一般是前置),“routing”路由,“post”后置,以及“error”异常Filter组成,当各种Filter出现了异常,请求会跳转到“error filter”,然后再经过“post filter” 最后返回结果,下面是Filter的执行流程图:

 

  • 正常流程:

    • 请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。

  • 异常流程:

    • 整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。

    • 如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。

    • 如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了。

二:自定义Fileter

@Component
public class LoginCheckZuulFilter extends ZuulFilter {
    @Override
    public String filterType() {

        return "pre"; // 返回pre前置过滤器类型
        // 分类 1.前置过滤器 2.路由过滤器routing 3.后置过滤器post 4.错误过滤器 error
    }

    @Override
    public int filterOrder() {
        return 0; // 是filter的执行顺序,越小越先执行
    }

    @Override
    public boolean shouldFilter() { //是其父接口IZuulFilter的方法,用来决定run方法是否要被执行
        RequestContext context = RequestContext.getCurrentContext();
        // 获取请求对象
        HttpServletRequest request = context.getRequest();
        // 判断是否登录
        if(!request.getRequestURI().contains("/login")){
            return true;
        }
        return false;
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext context = RequestContext.getCurrentContext();
        // 1.获取请求对象
        HttpServletRequest request = context.getRequest();
        HttpServletResponse response = context.getResponse();
        // 2.获取请求头的token
        String token = request.getHeader("token");
        // 3.没有token就返回错误信息
        if(StringUtils.isEmpty(token)){
            // 没有登录的话 就不继续往下执行
            context.setSendZuulResponse(false);
            try {
                response.setContentType("application/json;charset=utf-8");
                response.getWriter().println("服务器异常,请重试");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 4.有token直接放行
        return null;
    }
}

三:测试

启动zuul,浏览器访问:http://localhost:10050/pay/pay/1 ,当没登录的情况下浏览器应该会返回如下信息代表登录检查起作用了:

 使用postmain,发送post请求,在header中添加token值,如下:

 分享先到这里了,有关于zuul的基本搭建和配置的流程在上一个文章中有体现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Zuul是一个基于Netflix Zuul构建的微服务框架。它可以用来处理服务之间的路由、负载均衡、安全验证等问题。下面是一个简单的使用示例: 1. 首先,在pom.xml文件中添加Spring Cloud Zuul依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> ``` 2. 在启动类中添加`@EnableZuulProxy`注解,启用Zuul代理功能: ```java @SpringBootApplication @EnableZuulProxy public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } } ``` 3. 创建一个过滤器类来实现自定义的过滤逻辑。可以继承`ZuulFilter`类并实现其中的方法: ```java @Component public class MyFilter extends ZuulFilter { @Override public String filterType() { return "pre"; // 定义过滤器类型为“pre”,表示在请求路由之前执行过滤逻辑 } @Override public int filterOrder() { return 0; // 设置过滤器的执行顺序,数字越小越先执行 } @Override public boolean shouldFilter() { return true; // 是否启用该过滤器,返回true表示启用 } @Override public Object run() throws ZuulException { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); // 自定义过滤逻辑,比如添加请求头、进行身份验证等 return null; } } ``` 4. 在配置文件中配置Zuul的路由规则。比如,可以将请求 `/api/**` 转发到名为 `service-a` 的服务: ```yaml zuul: routes: service-a: path: /api/** serviceId: service-a ``` 注意:需要在配置文件中配置服务注册中心的地址,并且保证 `service-a` 这个服务已经注册到了服务注册中心。 以上就是一个简单的Spring Cloud Zuul使用示例。通过配置路由规则和自定义过滤器,可以实现灵活的微服务功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值