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跨域访问问题
首先恭喜自己终于找对了努力的方向,很荣幸能在公司接触到微服务架构,也很高兴公司一个大佬哥们愿意带我,他技术确实很牛逼,我也很佩服他,前后端通吃,干了六年能有这样的水平.最近跟着在搞微服务架构,给我分配 ...
随机推荐
- 解决Visual C++ for Linux: -L"~/projects/path_to_lib_folder" 无法设置library search path的问题
最近倒腾Linux C/C++项目.以目前的情况来说,要生成编译(build)一个Linux工程脚本,首选的工具必定是CMake.这也是我之前Linux项目的首选.不过自从VS IDE支持Linux ...
- JavaWeb开发流程
- struts2自定义转换器
Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...
- Python机器学习(基础篇---监督学习(支持向量机))
支持向量机(分类) 支持向量机分类器根据训练样本的分布,搜索所有可能的线性分类器中最佳的那个.我们会发现决定其直线位置的样本并不是所有训练数据,而是其中的两个空间间隔最小的两个不同类别的数据点,而我们 ...
- c#线程池ThreadPool实例详解
1. 如何查看线程池的最大线程数和最小线程数 static void Main(string[] args) { Console.WriteLine("----------线程池开始,线程I ...
- tcl实现批量压缩文件夹
tcl脚本本身对字符串的处理比较简单,所以想着用这个也实现下: proc main {} { puts "请输入路径:" set strpath "E:\\123&quo ...
- C# 事件 解析
1.什么是事件,事件和委托什么关系? 事件?事件,就是,比如按一个按钮,弹出你好对话框,就是一个事件. 事件和委托? 事件就是委托的一种呀,委托可以理解为回调机制,回调函数. 2. 怎么理解C#事件, ...
- bilibili答题器
2017-06-12,靠着这个测试版我得以95分的成绩L0级晋级会员L2级(PS 测试两次分别获得 攻略组和 学霸组) 计划完善目标: 界面UI更新布局,现在这个布局真是** 答案和问题分开,增加语音 ...
- nw 引用 sqlite
0.好吧,这对于我这个c 小白来说,真的有点难度. 1.安装Python 2.7.14 https://www.python.org/downloads/ 2.安装最新的nodejs+npm http ...
- 2--TestNG 参数化
(1)XML文件 public class ParameterTest{ @test @Parameters({"name","age"}) public vo ...