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. vue安装遇到vue不是内部变量

    配置path系统变量 打开我的电脑-->右键属性-->高级系统设置-->环境变量-->Path-->添加获得npm的位置(搜索vue.cmd 可以找到该位置) 全局安装位 ...

  2. Problem 3: Largest prime factor

    The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 60085 ...

  3. 自学python之路(day3)

    基础数据类型---字符串str 1.字符串的索引和切片 索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推. a = 'ABCDEFGH' print(a[0]) print(a[1] ...

  4. springboot配置文件(.yml)中自定义属性值并在controller里面获取

    1,由于项目需要,学习了新的框架--springboot,顺便练习一下在.yml中配置自定义属性并在controller里面获取.(以下的Springboot框架我已经搭建好,就不在陈述) 2,spr ...

  5. 读取Excel,单元格内容大于255个字符自动被截取的问题

    DataSet ds = new DataSet(); cl_initPage.v_DeBugLog("ExcelDataSource进入"); string strConn; s ...

  6. 学习Git笔记(更新中)

    参考网址:https://blog.csdn.net/zmx729618/article/details/52174373 跟着练习一下,写的很好. Git:是一个分布式版本控制系统. GitHub: ...

  7. input file文件上传图片显示web接口

    https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsDataURL  方便简单实用 关注微信小程序

  8. unzip解压war包并覆盖

    unzip -o blog.war -d BLOG 参数: -o 不进行询问直接覆盖 -d 压缩文件解压到BLOG文件夹下 详细使用语法: unzip [-Z] [-opts[modifiers]] ...

  9. 使用jquey 须掌握的常见知识点

    1.jquery获取标签.class.id.input的值 $("div")    $(".active")    $("#login") ...

  10. Python matplotlib.pyplot

    Customize the label, title, and ticks. Add Color to bubbles Add Text & Grid