上一篇文章中,讲了Zuul 转发,动态路由,负载均衡,等等一些Zuul 的特性,这个一篇文章,讲Zuul Filter 使用,关于网关的作用,这里就不再次赘述了,重点是zuul的Filter ,我们可以实现安全控制,比如,只有请求参数中有token和密码的客户端才能访问服务端的资源。那么如何来实现Filter了?

Spring Cloud Zuul

zuul 执行流程

Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

OST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

ERROR:在其他阶段发生错误时执行该过滤器。

除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。

准备工作

我们先拿之前两篇文章,构建的两个微服务代码为基础,进行下面的操作

建议先阅读以下两篇文章

Spring Cloud(四) 服务提供者 Eureka + 服务消费者 Feign
Spring Cloud(三) 服务提供者 Eureka + 服务消费者(rest + Ribbon)

http://www.ymq.io/2017/12/06/spring-cloud-feign/

http://www.ymq.io/2017/12/05/spring-cloud-ribbon-rest/

Eureka Service

导入第三篇文章中的项目:作为服务注册中心

spring-cloud-eureka-service

Eureka Provider

导入第三篇文章中的项目:作为服务的提供者

spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3

简单使用

新建项目 spring-cloud-zuul-filter

添加依赖

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

开启服务注册

在程序的启动类 ZuulFilterApplication 通过 @EnableZuulProxy 开启 Zuul 服务网关

package io.ymq.example.zuul.filter;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;@EnableZuulProxy
@SpringBootApplication
public class ZuulFilterApplication {public static void main(String[] args) {SpringApplication.run(ZuulFilterApplication.class, args);}
}

添加配置

配置文件 application.yml

spring:application:name: zuul-service-filterserver:port: 9000zuul:routes:api:path: /**serviceId: eureka-providereureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

TokenFilter

ZuulFilter 是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用

TokenFilter 过滤器

package io.ymq.example.zuul.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;/*** 描述: 过滤器 token** @author yanpenglei* @create 2017-12-11 14:38**/
public class TokenFilter extends ZuulFilter {private final Logger LOGGER = LoggerFactory.getLogger(TokenFilter.class);@Overridepublic String filterType() {return "pre"; // 可以在请求被路由之前调用}@Overridepublic int filterOrder() {return 0; // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低}@Overridepublic boolean shouldFilter() {return true;// 是否执行该过滤器,此处为true,说明需要过滤}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();LOGGER.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());String token = request.getParameter("token");// 获取请求的参数if (StringUtils.isNotBlank(token)) {ctx.setSendZuulResponse(true); //对请求进行路由ctx.setResponseStatusCode(200);ctx.set("isSuccess", true);return null;} else {ctx.setSendZuulResponse(false); //不对其进行路由ctx.setResponseStatusCode(400);ctx.setResponseBody("token is empty");ctx.set("isSuccess", false);return null;}}}

PasswordFilter

ZuulFilter 是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用

PasswordFilter 过滤器

package io.ymq.example.zuul.filter;import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletRequest;/*** 描述: 过滤器 Password** @author yanpenglei* @create 2017-12-11 15:40**/
public class PasswordFilter extends ZuulFilter {private final Logger LOGGER = LoggerFactory.getLogger(TokenFilter.class);@Overridepublic String filterType() {return "post"; // 请求处理完成后执行的filter}@Overridepublic int filterOrder() {return 1; // 优先级为0,数字越大,优先级越低}@Overridepublic boolean shouldFilter() {RequestContext ctx = RequestContext.getCurrentContext();return (boolean) ctx.get("isSuccess");// 判断上一个过滤器结果为true,否则就不走下面过滤器,直接跳过后面的所有过滤器并返回 上一个过滤器不通过的结果。}@Overridepublic Object run() {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();LOGGER.info("--->>> PasswordFilter {},{}", request.getMethod(), request.getRequestURL().toString());String username = request.getParameter("password");if (null != username && username.equals("123456")) {ctx.setSendZuulResponse(true);ctx.setResponseStatusCode(200);ctx.set("isSuccess", true);return null;} else {ctx.setSendZuulResponse(false);ctx.setResponseStatusCode(400);ctx.setResponseBody("The password cannot be empty");ctx.set("isSuccess", false);return null;}}
}

开启过滤器

在程序的启动类 ZuulFilterApplication 添加 Bean

@Bean
public TokenFilter tokenFilter() {return new TokenFilter();
}@Bean
public PasswordFilter PasswordFilter() {return new PasswordFilter();
}

filterType

filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:

  • pre:路由之前
  • routing:路由之时
  • post: 路由之后
  • error:发送错误调用
  • filterOrder:过滤的顺序
  • shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
  • run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。

测试服务

依次启动项目:

spring-cloud-eureka-service
spring-cloud-eureka-provider-1
spring-cloud-eureka-provider-2
spring-cloud-eureka-provider-3
spring-cloud-zuul-filter

启动该工程后,访问服务注册中心,查看服务是否都已注册成功:http://localhost:8761/

查看 eureka 监控,看服务是否都注册成功

token 测试

访问:http://127.0.0.1:8761/

步骤一 提示 token is empty

访问:http://127.0.0.1:9000/

步骤二 加上token ?token=token-uuid ,已经验证通过了,提示 The password cannot be empty

访问:http://127.0.0.1:9000/?token=token-uuid

password 测试

![The password cannot be empty][3]

加上tokenpassword &password=123456 ,已经验证通过

访问:http://127.0.0.1:9000/?token=token-uuid&password=123456

F5 刷新,每次都验证通过,并且负载均衡

源码下载

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul-filter

码云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul-filter

Contact

  • 作者:鹏磊
  • 出处:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版权归作者所有,转载请注明出处
  • Wechat:关注公众号,搜云库,专注于开发技术的研究与知识分享

Spring Cloud(七)服务网关 Zuul Filter 使用相关推荐

  1. Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战

    一.Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的,他们能够在进行HTTP请求或者相应的时候执行相关操作.Zuul Filter的主要 ...

  2. Spring cloud Gateway 服务网关 实战

    Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...

  3. Spring Cloud(六) 服务网关GateWay 入门

    前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...

  4. Spring Cloud —— Gateway 服务网关

    导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...

  5. Spring Cloud(四) API网关Zuul

    前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...

  6. Spring Cloud 微服务网关Gateway组件

    一.网关介绍 大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用. 这样的架构会存 ...

  7. Spring Cloud(七) GateWay 服务化和过滤器

    前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...

  8. Spring Cloud :Gateway 网关限流(五)

    目录 一.概述 1. 为什么需要限流 二.限流算法 1. 计数器算法 2. 漏桶算法 3. 令牌桶算法 四.Gateway 限流 1. 添加依赖 2. 配置文件 3. 限流规则配置类 Spring C ...

  9. Spring Cloud(六)服务网关 zuul 快速入门

    服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...

最新文章

  1. vs2015自动窗口(查看变量的值)
  2. Python 字符串改变
  3. linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)
  4. 用区块链改变人工智能:去中心化带来数据新范式
  5. java dateformat hh_Java 中时间处理SimpleDateFormat 中HH和hh的区别
  6. ERP CRM与SCM整合过程中的知识转移
  7. php获取网页js中的json,从php获取json数据使用js读取显示到网页笔记
  8. idea 启动界面导入项目_如何为您的项目启动有效的登录页面
  9. 【C语言】将输入的10个整数逆序输出
  10. js插入元素的新方法insertAdjacentHTML
  11. oracle对用户的管理
  12. 字体的基础知识:英文字体的特征及结构(终于找到了)
  13. 74LS138译码器实现举重裁判电路-QuartusII 软件仿真
  14. 大众CEO提前“毕业”,马斯克:软件是通向未来的关键
  15. MQTT学习之初识mqtt
  16. ps中常用模糊的区别
  17. Alex - 用python来写测手速游戏
  18. 证书管理机构——CA(Certificate Authority)
  19. Java小白到到大佬路线
  20. 世博版新君威提车作业

热门文章

  1. 亚太信息安全领袖成就表彰计划:阿里成中国互联网公司唯一代表
  2. Angular http跨域
  3. 关于javascript代码优化的8点建议
  4. 【bzoj1251】序列终结者(伸展树)
  5. Android进阶笔记:Messenger源码详解
  6. android GridView item中组件获取焦点
  7. JavaScript词法作用域的简单介绍
  8. react hooks使用_如何使用React和Hooks检测外部点击
  9. swift视图容器_如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图...
  10. Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)