Spring Cloud Zuul路由网关服务过滤实现代码

 更新时间:2020年04月14日 11:23:05   作者:彭超  
这篇文章主要介绍了Spring Cloud Zuul路由网关服务过滤实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Zuul 简介

Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/admin 转发到到 Admin 服务,/api/member 转发到到 Member 服务。Zuul 默认和 Ribbon 结合实现了负载均衡的功能。

引入依赖

在 pom.xml 中主要添加 spring-cloud-starter-netflix-eureka-server 和 spring-cloud-starter-netflix-zuul 依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

相关配置

在 application.yml 中主要添加 Zuul 路由配置

zuul:
 routes:
  api-a:
   path: /api/ribbon/**
   serviceId: hello-spring-cloud-web-admin-ribbon
  api-b:
   path: /api/feign/**
   serviceId: hello-spring-cloud-web-admin-feign

路由说明:

以 /api/ribbon 开头的请求都转发给 spring-cloud-web-admin-ribbon 服务
以 /api/feign 开头的请求都转发给 spring-cloud-web-admin-feign 服务
在 Application 入口类中添加 @EnableZuulProxy 注解开启 zuul 功能

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
  public static void main(String[] args) {
    SpringApplication.run(ZuulApplication.class, args);
  }
}

配置网关路由失败时的回调

创建 WebAdminFeignFallbackProvider 回调类

/**
 * 路由 hello-spring-cloud-web-admin-feign 失败时的回调
 */
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {

  @Override
  public String getRoute() {
    // ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return null
    return "hello-spring-cloud-web-admin-feign";
  }

  /**
   * 如果请求服务失败,则返回指定的信息给调用者
   * @param route
   * @param cause
   * @return
   */
  @Override
  public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
    return new ClientHttpResponse() {
      /**
       * 网关向 api 服务请求失败了,但是消费者客户端向网关发起的请求是成功的,
       * 不应该把 api 的 404,500 等问题抛给客户端
       * 网关和 api 服务集群对于客户端来说是黑盒
       * @return
       * @throws IOException
       */
      @Override
      public HttpStatus getStatusCode() throws IOException {
        return HttpStatus.OK;
      }

      @Override
      public int getRawStatusCode() throws IOException {
        return HttpStatus.OK.value();
      }

      @Override
      public String getStatusText() throws IOException {
        return HttpStatus.OK.getReasonPhrase();
      }

      @Override
      public void close() {

      }

      @Override
      public InputStream getBody() throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> map = new HashMap<>();
        map.put("status", 200);
        map.put("message", "无法连接");
        return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));
      }

      @Override
      public HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        // 和 getBody 中的内容编码一致
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        return headers;
      }
    };
  }
}

测试路由访问

依次运行 EurekaApplication > ServiceAdminApplication > WebAdminRibbonApplication > WebAdminFeignApplication > ZuulApplication 各服务

访问:http://localhost:8769/api/ribbon/hi?message=zuul

浏览器显示

port : 8763,message : zuul

访问:http://localhost:8769/api/feign/hi?message=zuul

浏览器显示

port : 8763,message : zuul

至此说明 Zuul 的路由功能配置成功。

使用 Zuul 的服务过滤功能

Zuul 不仅仅只是路由,还有很多强大的功能。比如用在安全验证方面。

创建服务过滤器

/**
 * Zuul 的服务过滤演示
 */
@Component
public class LoginFilter extends ZuulFilter {

  private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);

  /**
   * 配置过滤类型,有四种不同生命周期的过滤器类型
   * 1. pre:路由之前
   * 2. routing:路由之时
   * 3. post:路由之后
   * 4. error:发送错误调用
   * @return
   */
  @Override
  public String filterType() {
    return "pre";
  }

  /**
   * 配置过滤的顺序
   * @return
   */
  @Override
  public int filterOrder() {
    return 0;
  }

  /**
   * 配置是否需要过滤:true/需要,false/不需要
   * @return
   */
  @Override
  public boolean shouldFilter() {
    return true;
  }

  /**
   * 过滤器的具体业务代码
   * @return
   * @throws ZuulException
   */
  @Override
  public Object run() throws ZuulException {
    RequestContext context = RequestContext.getCurrentContext();
    HttpServletRequest request = context.getRequest();
    String token = request.getParameter("token");
    if (token == null) {
      logger.warn("Token is empty");
      context.setSendZuulResponse(false);
      context.setResponseStatusCode(401);
      try {
        context.getResponse().getWriter().write("Token is empty");
      } catch (IOException e) {
      }
    } else {
      logger.info("OK");
    }
    return null;
  }
}

测试过滤器

访问:http://localhost:8769/api/feign/hi?message=zuul

网页显示

Token is empty

访问:http://localhost:8769/api/feign/hi?message=zuul&token=1

网页显示

port : 8763,message : zuul

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现删除排序数组中重复元素的方法小结【三种方法比较】

    Java实现删除排序数组中重复元素的方法小结【三种方法比较】

    这篇文章主要介绍了Java实现删除排序数组中重复元素的方法,结合实例形式对比分析了三种常见的数组元素删除算法操作技巧,需要的朋友可以参考下
    2019-02-02
  • spring boot配置多个请求服务代理的完整步骤

    spring boot配置多个请求服务代理的完整步骤

    这篇文章主要给大家介绍了关于spring boot配置多个请求服务代理的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • SpringBoot使用minio及配置代码

    SpringBoot使用minio及配置代码

    MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。本文重点给大家介绍SpringBoot使用minio及配置代码,感兴趣的朋友一起看看吧
    2022-02-02
  • SpringMVC中使用bean来接收form表单提交的参数时的注意点

    SpringMVC中使用bean来接收form表单提交的参数时的注意点

    本篇文章主要介绍了SpringMVC中使用bean来接收form表单提交的参数时的注意点,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • springboot中使用@NotNull注解无效解决方法

    springboot中使用@NotNull注解无效解决方法

    这篇文章主要给大家介绍了关于springboot中使用@NotNull注解无效的解决方法,进行参数校验的时候,加了@NotNull注解,@Validated注解和@Valid注解,但是参数校验的时候不生效,需要的朋友可以参考下
    2023-08-08
  • Springboot 内部服务调用方式

    Springboot 内部服务调用方式

    这篇文章主要介绍了Springboot 内部服务调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java中输入输出方式的简单示例

    Java中输入输出方式的简单示例

    Java语言的输入输出功能是十分强大而灵活的,美中不足的是看上去输入输出的代码并不是很简洁,因为你往往需要包装许多不同的对象,下面这篇文章主要给大家介绍了关于Java中输入输出方式的相关资料,需要的朋友可以参考下
    2021-08-08
  • java基于双向环形链表解决丢手帕问题的方法示例

    java基于双向环形链表解决丢手帕问题的方法示例

    这篇文章主要介绍了java基于双向环形链表解决丢手帕问题的方法,简单描述了丢手帕问题,并结合实例形式给出了Java基于双向环形链表解决丢手帕问题的步骤与相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Java垃圾回收机制的finalize方法实例分析

    Java垃圾回收机制的finalize方法实例分析

    这篇文章主要介绍了Java垃圾回收机制的finalize方法,结合实例形式分析了finalize方法的特点及在垃圾回收机制中的相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • Spring Boot 配置大全(小结)

    Spring Boot 配置大全(小结)

    本篇文章主要介绍了Spring Boot 配置大全(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11

最新评论