上一篇文章中,讲了Zuul 转发,动态路由,负载均衡,等等一些Zuul 的特性,这个一篇文章,讲Zuul Filter 使用,关于网关的作用,这里就不再次赘述了,重点是zuul的Filter ,我们可以实现安全控制,比如,只有请求参数中有token和密码的客户端才能访问服务端的资源。那么如何来实现Filter了?
Spring Cloud Zuul
准备工作
在开始测试服务之前,我们先拿之前两篇博客,构建的两个微服务代码为基础,进行下面的操作,主要使用下面几个工程:
建议先阅读以下文章
Spring Cloud(六)服务网关 zuul 快速入门-http://www.ymq.io/2017/12/10/spring-cloud-zuul/
- https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka-service
- https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka-provider-2
简单使用
新建项目 spring-cloud-zuul-filter
添加依赖
1 | <dependency> |
开启服务注册
在程序的启动类 ZuulFilterApplication
通过 @EnableZuulProxy
开启 Zuul 服务网关
1 | package io.ymq.example.zuul.filter; |
添加配置
配置文件 application.yml
1 | spring: |
TokenFilter
ZuulFilter
是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用
TokenFilter 过滤器
1 | package io.ymq.example.zuul.filter; |
PasswordFilter
ZuulFilter
是Zuul中核心组件,通过继承该抽象类,覆写几个关键方法达到自定义调度请求的作用
PasswordFilter 过滤器
1 | package io.ymq.example.zuul.filter; |
开启过滤器
在程序的启动类 ZuulFilterApplication
添加 Bean
1 |
|
filterType
filterType:返回一个字符串代表过滤器的类型,在zuul中定义了四种不同生命周期的过滤器类型,具体如下:
- pre:路由之前
- routing:路由之时
- post: 路由之后
- error:发送错误调用
- filterOrder:过滤的顺序
- shouldFilter:这里可以写逻辑判断,是否要过滤,本文true,永远过滤。
- run:过滤器的具体逻辑。可用很复杂,包括查sql,nosql去判断该请求到底有没有权限访问。
测试服务
依次启动四个服务:spring-cloud-eureka-service
,spring-cloud-eureka-provider
,spring-cloud-eureka-provider-2
,spring-cloud-zuul-service
查看 eureka 监控,看服务是否都注册成功
步骤一 提示 token is empty
步骤二 加上token ?token=token-uuid
,已经验证通过了,提示 The password cannot be empty
访问:http://127.0.0.1:9000/?token=token-uuid
步骤三 加上token 和 password &password=123456
,已经验证通过
访问:http://127.0.0.1:9000/?token=token-uuid&password=123456
F5 刷新,每次都验证通过,并且负载均衡
zuul 执行流程
Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。
PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
OST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发生错误时执行该过滤器。
除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。
源码下载
- https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka-service
- https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka-provider
- https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka-provider-2
- https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul-filter
出处:http://www.ymq.io
转自:鹏磊