Zuul网关总结
Zuul是Netflix开源的网关服务(gateway service)(https://github.com/Netflix/zuul),提供动态路由、监控、弹性、安全性等功能。最近在公司的项目中用到了,总结如下,基于1.3.1版本。
1.基本概念
Zuul的核心是一系列的Filter,在路由HTTP request和reponse中执行一系列的操作。Zuul提供了框架可以动态的读取、编译、运行这些Filter。
Filter继承类com.netflix.zuul.ZuulFilter,有以下的特征:
Type,定义该Filter应用的阶段
Execution Order,和Type联合起来使用,标识Filter在同一Type下的执行顺序,值越小优先级越高,可以为负数
Criteria,决定改Filter是否执行
Action,Filter具体要做的操作
Filter Type有四种:
PRE,标识Filter在路由到origin前执行
ROUTING,该Filter处理到origin的request。在此处使用HttpClient或Ribbon请求origin
POST,在request已经被路由到origin后执行。
ERROR,在以上type中发生错误时执行。
Zuul Request的请求生命周期图如下。

2.运用
在应用启动时需要设置Groovy的动态代码编译器,磁盘上Filter的目录,轮询时间。Groovy是运行在JVM的动态语言,可以和Java一起使用。Zuul中用于动态加载的Filter使用Groovy写的。
自定义Filter并按type放在pre、route、post、error路径下,部署应用后,需要拷贝到zuul.filter.root定义的路径下。
直接在Web项目中使用
如果是Web项目集成的,可以参照官方例子(https://github.com/Netflix/zuul/tree/1.x/zuul-simple-webapp)及文档(https://github.com/Netflix/zuul/wiki/zuul-simple-webapp)
1.在web应用初始化时初始Filter相关配置。新建类继承ServletContextListener,并配置在web.xml中,在contextInitialized时回调初始化Filter
//配置Groovy动态代码编译器,Filter路径,轮询时间等
private void initGroovyFilterManager() {
FilterLoader.getInstance().setCompiler(new GroovyCompiler()); String scriptRoot = System.getProperty("zuul.filter.root", "");
if (scriptRoot.length() > 0) scriptRoot = scriptRoot + File.separator;
try {
FilterFileManager.setFilenameFilter(new GroovyFileFilter());
FilterFileManager.init(5, scriptRoot + "pre", scriptRoot + "route", scriptRoot + "post");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
2.在web.xml中添加servlet,配置的类是Zuul-core中的com.netflix.zuul.http.ZuulServlet,这个类是Zuul的核心类之一,处理了所有Filter相关的业务,使得我们只需要用Groovy编写Filter并放在之前设置的路径即可。
3.在web.xml中添加filter,配置的类时com.netflix.zuul.context.ContextLifecycleFilter,用于在处理请求完毕后对RequestContext执行unset()。
和Spring boot一起使用
Spring boot为开发提供了很多的便利。如果是和Spring Boot一起使用Zuul,需要用maven引入spring-cloud-starter-netflix-zuul依赖库,会自动引入spring-cloud-netflix-zuul及zuul-core、zuul-netflix。在Spring boot主类上添加注解@EnableZuulProxy以启用Zuul。
//配置Groovy动态代码编译器,Filter路径,轮询时间等
@PostConstruct
private void initGroovyFilterManager() {
FilterLoader.getInstance().setCompiler(new GroovyCompiler()); String scriptRoot = System.getProperty("zuul.filter.root", "");
if (scriptRoot.length() > 0) scriptRoot = scriptRoot + File.separator;
try {
FilterFileManager.setFilenameFilter(new GroovyFileFilter());
FilterFileManager.init(5, scriptRoot + "pre", scriptRoot + "route", scriptRoot + "post");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Spring cloud Netflix自己添加了很多Filter,以至于我们通用配置文件就可以配置路由信息,或者RouteLocator类型的实例名为routeLocator的bean。这些Spring Cloud自带的Filter用来处理、转发Request,Response。

当网关应用本身也有Rest请求接口时是不会走这些Filter,这个处理是在org.springframework.web.servlet.DispatcherServlet这个核心类的getHandler()处理的。
Zuul网关总结的更多相关文章
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- SpringCloud实战-Zuul网关服务
为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先暴露了我们实体机器的IP地址,别人一看你的 ...
- zuul网关入门(一、网关具有的功能)
1. zuul网关入门(一.网关具有的功能) 1.1. 基本场景 1.1.1. API网关的由来 1.1.2. API网关基本功能 1.2. 高级应用 1.2.1. 亮点 可动态发布的过滤器机制 1. ...
- Spring Cloud微服务Ribbon负载均衡/Zuul网关使用
客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...
- SpringCloud Zuul网关的简单理解
Zuul网关功能 请求路由.服务路由.请求过滤 请求路由 参数配置如下所示,所有能够配置path规则的请求,都会被zuul网关转发到对应的url上. zuul.routes.user-service. ...
- Zuul 网关路由
Zuul 网关路由 路由是微服务架构中不可或缺的一部分,例如:/api/user映射到user服务,/api/shop映射到shop服务. Zuul是一个基于JVM的路由和服务端的负载均衡器.Zuul ...
- Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...
- zuul网关源码解析
zuul网关源码解析 zuul请求的生命周期 ZuulServlet ZuulServlet定义了对zuul整个过程的处理,如下: public void service(javax.servlet. ...
- Spring cloud Zuul网关异常处理
Spring cloud Zuul网关异常处理 一 异常测试: 1> 创建一个pre类型的过滤器,并在该过滤器的run方法实现中抛出一个异常.比如下面的实现,在run方法中调用的doSometh ...
- Spring Cloud Zuul 网关的分布式系统中整合Swagger(转)和 zuul跨域访问问题
首先恭喜自己终于找对了努力的方向,很荣幸能在公司接触到微服务架构,也很高兴公司一个大佬哥们愿意带我,他技术确实很牛逼,我也很佩服他,前后端通吃,干了六年能有这样的水平.最近跟着在搞微服务架构,给我分配 ...
随机推荐
- plt库
- java LRUCache
package org.rx.cache; import org.rx.common.*; import org.rx.beans.DateTime; import java.util.Collect ...
- 搭建NTP服务集群、高可用
1.原理 Keepalived 的作用是检测后端服务器的状态,如果有一台服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除.当服务器工作正常后 Keepaliv ...
- Redux的工作流程
1.Redux 是一个专门用来管理数据业务或逻辑状态的框架,它也可以实现代码结构的规范化并提供组件之间通信的便利,而这两点,对于大型应用来说非常关键. 2.工作流程: Redux 三大原则 单一数据源 ...
- json序列化NULL
在项目中遇到一问题,json序列化需要将null传递给前端,但之前项目中使用的都是fastjson的JSONObject.toJSONString(vo),这样会过滤掉为NULL的属性. 解决办法: ...
- 转自CSDN-详述 Java 中的别名现象
在任何编程语言中,赋值操作都是最常见的操作之一,Java 自然也不例外.赋值时,使用赋值操作符=,它的意思是:“将等号右边的值(右值),复制给左边的值(左值)”.右值可以是任何常数.变量或者表达式(只 ...
- 封装qq分享静态库到cocopod
封装qq分享静态库到cocopod 1,创建framework库,到腾讯开放平台(open.qq.com)申请项目appid 2,将iOS SDK中的TencentOpenAPI.framework ...
- final发布用户使用报告
用户数量:13人 姓名如下(包括化名):张小斌.王瑞瑞.蛋蛋.小美.晨曦.小丽.张利刚.小闫.小谢.小崔.小欢欢.小胡胡.小霞霞 寻找的用户多为王者荣耀交流协会成员的同学,对PSP Daily软件有极 ...
- Ubuntu 将其他盘挂载到/home的子目录下
Ubuntu 14.04 将其他盘挂载到/home的子目录下当安装完Ubuntu系统,由于当时没有注意,分配的分区空间太小.经过一段时间安装了各式各样的软件后,常常会遇到/home目录下空间不够的情况 ...
- ELK简单安装测试
1 介绍组件 Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读). Kafka是一种高吞 ...