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. centos7 eclispe 编译C++遇到的问题总结

    最近由于工作的需要,又开始回归之前已经遗忘了的技术.arm嵌入式这个古老的名词. 开始选择了linuxminit,开始的linuxminit17以前还可以,可是用了一下linuxminit19,发现r ...

  2. 获取百度地图POI数据二(准备搜索关键词)

    上篇讲到  想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字   那么这些关键字如何得来呢?   本人使用的方法是通过一些网站来获取这些关键词   http://poi.mapbar.com ...

  3. nodejs03-GET数据处理

    数据请求:--- 前台:form ajax jsonp 后台:一样 请求方式: 1.GET 数据在URL中 2.POST 数据在请求体中 请求数据组成: 头--header:url,头信息 身子--c ...

  4. 极速在mac中安装python开发环境

    mac开发环境的安装: brew: 包管理工具{ 安装:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/in ...

  5. phpstorm本地破解激活

    下载对应文件:http://idea.lanyus.com/自己用的破解补丁无需使用注册码) 找到phpstorm 的安装路径, 在\bin目录下有两个文件 PhpStorm.exe.vmoption ...

  6. 【译】REM vs EM - 世纪之争

    原文链接:https://zellwk.com/blog/rem-vs-em/ 在网络上排版的最佳做法之一是使用像rem和em这样的相对单位. 问题是,你应该使用哪个? 在rem支持者和em支持者之间 ...

  7. webDriver定位元素的方法

    在UI层面的自动化测试开发中,元素的定位与操作是基础,也是经常遇到的困难所在.webdriver提供了8种定位: 1. id定位:find_element_by_id("id值") ...

  8. String Method的字符串变换的一个例子

    <!DOCTYPE html> <html lang="en"><head> <meta charset="UTF-8" ...

  9. Raspberry Pi 安装配置 Home Assistant

    家庭助理(Home Assistant)是一款基于 Python 的智能家居开源系统,支持众多品牌的智能家居设备,可以轻松实现设备的语音控制.跟踪和控制家里的所有设备, 并自动化控制,能完美的运行在树 ...

  10. select 使其默认选中文本不为空

    ```html<select ref="type" v-model="selectedvalue" > <option v-for=" ...