Spring Cloud(七)服务网关 Zuul Filter 使用
上一篇文章中,讲了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]
加上token
和 password
&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 使用相关推荐
- Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战
一.Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的,他们能够在进行HTTP请求或者相应的时候执行相关操作.Zuul Filter的主要 ...
- Spring cloud Gateway 服务网关 实战
Spring cloud Gateway 服务网关 一.简介 优点: 特性: 总结: 二.核心概念 三.路由规则 1.Path 2.Query 3.Method 4.Datetime 5.Romote ...
- Spring Cloud(六) 服务网关GateWay 入门
前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...
- Spring Cloud —— Gateway 服务网关
导航 一.什么是服务网关 二.业界常见网关组件 三.Spring Cloud Gateway 四.Gateway 快速入门 4.1 创建 gateway 服务 4.2 添加 gateway 依赖和 n ...
- Spring Cloud(四) API网关Zuul
前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...
- Spring Cloud 微服务网关Gateway组件
一.网关介绍 大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用. 这样的架构会存 ...
- Spring Cloud(七) GateWay 服务化和过滤器
前文回顾: Spring Cloud(一)Eureka Server-单体及集群搭建 Spring Cloud(二) 配置Eureka Client Spring Cloud(三) 熔断器Hystri ...
- Spring Cloud :Gateway 网关限流(五)
目录 一.概述 1. 为什么需要限流 二.限流算法 1. 计数器算法 2. 漏桶算法 3. 令牌桶算法 四.Gateway 限流 1. 添加依赖 2. 配置文件 3. 限流规则配置类 Spring C ...
- Spring Cloud(六)服务网关 zuul 快速入门
服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能.Spring Cloud Netflix中 ...
最新文章
- vs2015自动窗口(查看变量的值)
- Python 字符串改变
- linux 进程间通信 dbus-glib【实例】详解二(上) 消息和消息总线(附代码)
- 用区块链改变人工智能:去中心化带来数据新范式
- java dateformat hh_Java 中时间处理SimpleDateFormat 中HH和hh的区别
- ERP CRM与SCM整合过程中的知识转移
- php获取网页js中的json,从php获取json数据使用js读取显示到网页笔记
- idea 启动界面导入项目_如何为您的项目启动有效的登录页面
- 【C语言】将输入的10个整数逆序输出
- js插入元素的新方法insertAdjacentHTML
- oracle对用户的管理
- 字体的基础知识:英文字体的特征及结构(终于找到了)
- 74LS138译码器实现举重裁判电路-QuartusII 软件仿真
- 大众CEO提前“毕业”,马斯克:软件是通向未来的关键
- MQTT学习之初识mqtt
- ps中常用模糊的区别
- Alex - 用python来写测手速游戏
- 证书管理机构——CA(Certificate Authority)
- Java小白到到大佬路线
- 世博版新君威提车作业
热门文章
- 亚太信息安全领袖成就表彰计划:阿里成中国互联网公司唯一代表
- Angular http跨域
- 关于javascript代码优化的8点建议
- 【bzoj1251】序列终结者(伸展树)
- Android进阶笔记:Messenger源码详解
- android GridView item中组件获取焦点
- JavaScript词法作用域的简单介绍
- react hooks使用_如何使用React和Hooks检测外部点击
- swift视图容器_如何使用IBDesignable在Swift中创建漂亮的,可重复使用的渐变视图...
- Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)