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网关总结的更多相关文章

  1. Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。

    时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...

  2. SpringCloud实战-Zuul网关服务

    为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先暴露了我们实体机器的IP地址,别人一看你的 ...

  3. zuul网关入门(一、网关具有的功能)

    1. zuul网关入门(一.网关具有的功能) 1.1. 基本场景 1.1.1. API网关的由来 1.1.2. API网关基本功能 1.2. 高级应用 1.2.1. 亮点 可动态发布的过滤器机制 1. ...

  4. Spring Cloud微服务Ribbon负载均衡/Zuul网关使用

    客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...

  5. SpringCloud Zuul网关的简单理解

    Zuul网关功能 请求路由.服务路由.请求过滤 请求路由 参数配置如下所示,所有能够配置path规则的请求,都会被zuul网关转发到对应的url上. zuul.routes.user-service. ...

  6. Zuul 网关路由

    Zuul 网关路由 路由是微服务架构中不可或缺的一部分,例如:/api/user映射到user服务,/api/shop映射到shop服务. Zuul是一个基于JVM的路由和服务端的负载均衡器.Zuul ...

  7. Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务

    API 网关的出现的原因是微服务架构的出现,不同的微服务一般会有不同的服务地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户端会 ...

  8. zuul网关源码解析

    zuul网关源码解析 zuul请求的生命周期 ZuulServlet ZuulServlet定义了对zuul整个过程的处理,如下: public void service(javax.servlet. ...

  9. Spring cloud Zuul网关异常处理

    Spring cloud Zuul网关异常处理 一 异常测试: 1> 创建一个pre类型的过滤器,并在该过滤器的run方法实现中抛出一个异常.比如下面的实现,在run方法中调用的doSometh ...

  10. Spring Cloud Zuul 网关的分布式系统中整合Swagger(转)和 zuul跨域访问问题

    首先恭喜自己终于找对了努力的方向,很荣幸能在公司接触到微服务架构,也很高兴公司一个大佬哥们愿意带我,他技术确实很牛逼,我也很佩服他,前后端通吃,干了六年能有这样的水平.最近跟着在搞微服务架构,给我分配 ...

随机推荐

  1. (2018 Multi-University Training Contest 3)Problem D. Euler Function

    //题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322 //题目大意:给定 k,求第 k 小的数 n,满足 φ(n) 是合数.显然 φ(1) = 1 ...

  2. 桂林电子科技大学第三届ACM程序设计竞赛 G 路径

    链接:https://ac.nowcoder.com/acm/contest/558/G来源:牛客网 小猫在研究树. 小猫在研究路径. 给定一棵N个点的树,每条边有边权,请你求出最长的一条路径,满足经 ...

  3. 主成分分析法PCA原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  4. 原生Ajax--XmlHttpRequest对象和jQuery.ajax()

    Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE) 1.XmlHttpRequest对象介绍 XmlHttpRequest对象的主要 ...

  5. 细数本地连阿里云上mysql8遇到的坑

    最近两个月忙成狗,给了自己一个冠冕堂皇的不记录博客的借口,今天咬牙记录一篇本地连阿里云mysql遇到的各种坑; 昨天利用妹妹的学生身份买了台廉价的阿里ECS,购买成功后的第一反应当然是把本地的mysq ...

  6. SMS PDU编码数据串格式分析

    PDU协议数据单元详细介绍 PDU 相当于一个数据包,它由构成消息(SMS)的信息组成.作为一种数据单元,它必须包含源/目的地址.保护(有效)时间.数据格式.协议类型和正文,正文长度可达140字节,它 ...

  7. winform程序读取和改写配置文件App.config元素的值

    winform程序读取和改写配置文件App.config元素的值 2016-05-16 17:49 by newbirth, 2412 阅读, 0 评论, 收藏, 编辑 1 2 3 4 5 6 7 & ...

  8. python基础—字典的使用{}

    info = {'stu1':"lili", 'stu2':'yoyo', 'stu3':'dudu'}print(info)print(info['stu1'])info['st ...

  9. html css+div+jquery实现图片轮播

    一直想自己动手做一个图片轮播的控件,查查网上的资料大多引用已经做好的组件,其原理算法不是很清楚,于是自己用jquery写了一个.先看下效果图: 主要界面实现思路如下: 1.新建一个div宽度为100% ...

  10. ngix请求转发

    实际运用中,当我们有对用户隐藏真实url的需求时,可以使用ngix转发. 1.转发所有请求: location / { proxy_pass http://localhost:8080 ; } 2.转 ...