专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Zuul路由配置详解

Zuul路由配置详解

更新时间:2022-06-15 10:15:27 来源:赢咖4 浏览1219次

Zuul是什么?

Zuul 是 Netflix OSS 中的一员,是一个基于 JVM 路由器和服务端的负载均衡器。提供路由、监控、弹性、安全等方面的服务框架。Zuul 能够与 Eureka、Ribbon、Hystrix 等组件配合使用。

Zuul路由配置

1.创建项目

在之前的项目上,新建一个springboot项目:zuul-server,继承parent。

引入依赖:

<!--eureka-client-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>3.0.2</version>
</dependency>
<!--Zuul-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency>

这里有个问题:

spring-cloud-starter-netflix-zuul:2.2.x 和Spring Boot 2.5.x之间的Spring 版本冲突
Spring Boot 2.4之后不支持zuul(改用Gateway)

2.路由规则配置

当 Zuul 集成 Eureka 之后,其实就可以为 Eureka 中所有的服务进行路由操作了,默认的转发规则就是“API 网关地址+访问的服务名称+接口 URI”。

配置文件如下:

server.port=8088
#server.servlet.context-path=/zuul-demo
spring.application.name=zuul-server
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
#zuul代理配置  zuul.routes.服务名.path,服务名要与注册的一致
zuul.routes.client-provider-server.path=/client-provider/**
#URL映射
#zuul.routes.client-provider-server.url=http://localhost:8081/
#应用名映射
zuul.routes.client-provider-server.service-id=client-provider-server

启动类设置@EnableZuulProxy注解,访问代理 http://localhost:8088/client-provider/api/provider

3.Zuul过滤器介绍及使用

Zuul 中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter 只有一种类型,可以通过配置 urlPatterns 来拦截对应的请求。

过滤器类型

类型 使用场景
pre 可以在请求被路由之前调用。适用于身份认证的场景,认证通过后再继续执行下面的流程。
route 在路由请求时被调用。适用于灰度发布场景,在将要路由的时候可以做一些自定义的逻辑。
error 处理请求时发生错误时被调用。在执行过程中发送错误时会进入 error 过滤器,可以用来统一记录错误信息。
post 在 route 和 error 过滤器之后被调用。这种过滤器将请求路由到达具体的服务之后执行。适用于需要添加响应头,记录响应日志等应用场景。

过滤器执行生命周期

通过上面的图可以清楚地知道整个执行的顺序,请求发过来首先到 pre 过滤器,再到 routing 过滤器,最后到 post 过滤器,任何一个过滤器有异常都会进入 error 过滤器。

自定义Zuul过滤器

如下,代码说明写在注释中

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
/**
 * 自定义过滤器
 */
public class MyAccessFilter extends ZuulFilter {
    /**
     * 过滤器类型,可选值有 pre、route、post、error。
     *
     * @return
     */
    @Override
    public String filterType() {
        return "pre";
    }
    /**
     * 通过int值来定义过滤器的执行顺序
     * 过滤器的执行顺序,数值越小,优先级越高。
     *
     * @return
     */
    @Override
    public int filterOrder() {
        return 0;
    }
    /**
     * 是否执行该过滤器,true 为执行,false 为不执行
     * 这个也可以利用配置中心来实现,达到动态的开启和关闭过滤器。
     * 配置文件中禁用过滤器:
     * 【zuul.过滤器的类名.过滤器类型.disable=true,如:zuul.MyAccessFilter.pre.disable=true】
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }
    /**
     * 过滤器具体逻辑
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(), request.getRequestURL().toString()));
        String accessToken = request.getParameter("accessToken");
        // 有权限令牌
        if (!StringUtils.isEmpty(accessToken)) {
            // 设置是否路由到服务
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            // 设置下一个过滤器是否执行,当为 true 的时候,后续的过滤器才执行,若为 false 则不执行。
            ctx.set("isSuccess", true);
        } else {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("{\"result\":\"accessToken is not correct!\"}");
            //可以设置一些值
            ctx.set("isSuccess", false);
        }
        return null;
    }
}

配置过滤器

import com.local.springboot.zuul.zuulserver.filter.MyAccessFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfiguration {
    @Bean
    public MyAccessFilter myAccessFilter(){
        return new MyAccessFilter();
    }
}

以上就是关于“Zuul路由配置详解”的介绍,大家如果想了解更多相关知识,不妨来关注一下赢咖4的Java赢咖4在线学习,里面的课程内容细致全面,通俗易懂,很适合没有基础的小白学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>