Netflix学习笔记:Zuul

2024-04-08 12:48
文章标签 学习 笔记 zuul netflix

本文主要是介绍Netflix学习笔记:Zuul,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。Zuul 可以适当的对多个 Amazon Auto Scaling Groups 进行路由请求。

其架构如下图所示:



 Zuul提供了一个框架,可以对过滤器进行动态的加载,编译,运行。过滤器之间没有直接的相互通信。他们是通过一个RequestContext的静态类来进行数据传递的。RequestContext类中有ThreadLocal变量来记录每个Request所需要传递的数据。

过滤器是由Groovy写成。这些过滤器文件被放在Zuul Server上的特定目录下面。Zuul会定期轮询这些目录。修改过的过滤器会动态的加载到Zuul Server中以便于request使用。

下面有几种标准的过滤器类型:

  • PRE:这种过滤器在请求到达Origin Server之前调用。比如身份验证,在集群中选择请求的Origin Server,记log等。
  • ROUTING:在这种过滤器中把用户请求发送给Origin Server。发送给Origin Server的用户请求在这类过滤器中build。并使用Apache HttpClient或者Netfilx Ribbon发送给Origin Server。
  • POST:这种过滤器在用户请求从Origin Server返回以后执行。比如在返回的response上面加response header,做各种统计等。并在该过滤器中把response返回给客户。
  • ERROR:在其他阶段发生错误时执行该过滤器。
  • 客户定制:比如我们可以定制一种STATIC类型的过滤器,用来模拟生成返回给客户的response。

过滤器的生命周期如下所示:


Zuul可以通过加载动态过滤机制,从而实现以下各项功能:

  • 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
  • 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
  • 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
  • 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
  • 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
  • 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。

除此之外,Netflix公司还利用Zuul的功能通过金丝雀版本实现精确路由与压力测试。

 

其核心代码为:

 

Java代码   收藏代码
  1. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  
  2.     try {  
  3.         init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);  
  4.         try {  
  5.             preRouting();  
  6.         } catch (ZuulException e) {  
  7.             error(e);  
  8.             postRouting();  
  9.             return;  
  10.         }  
  11.         filterChain.doFilter(servletRequest, servletResponse);  
  12.         try {  
  13.             routing();  
  14.         } catch (ZuulException e) {  
  15.             error(e);  
  16.             postRouting();  
  17.             return;  
  18.         }  
  19.         try {  
  20.             postRouting();  
  21.         } catch (ZuulException e) {  
  22.             error(e);  
  23.             return;  
  24.         }  
  25.     } catch (Throwable e) {  
  26.         error(new ZuulException(e, 500"UNCAUGHT_EXCEPTION_FROM_FILTER_" + e.getClass().getName()));  
  27.     } finally {  
  28.         RequestContext.getCurrentContext().unset();  
  29.     }  
  30. }  

 

Zuul加载Groovy过滤器:

Java代码   收藏代码
  1. import groovy.lang.GroovyClassLoader;    
  2. import groovy.lang.GroovyObject;    
  3. import org.junit.Test;    
  4. import org.junit.runner.RunWith;    
  5. import org.mockito.runners.MockitoJUnitRunner;    
  6. import org.slf4j.Logger;    
  7. import org.slf4j.LoggerFactory;    
  8.     
  9. import java.io.File;    
  10. import java.io.IOException;    
  11.     
  12. import static org.junit.Assert.*;    
  13. import static org.mockito.Mockito.spy;    
  14.     
  15. public class GroovyCompiler {    
  16.     
  17.     private static final Logger LOG = LoggerFactory.getLogger(GroovyCompiler.class);    
  18.     
  19.     /**  
  20.      * Compiles Groovy code and returns the Class of the compiles code.  
  21.      *  
  22.      * @param sCode  
  23.      * @param sName  
  24.      * @return  
  25.      */    
  26.     public Class compile(String sCode, String sName) {    
  27.         GroovyClassLoader loader = getGroovyClassLoader();    
  28.         LOG.warn("Compiling filter: " + sName);    
  29.         Class groovyClass = loader.parseClass(sCode, sName);    
  30.         return groovyClass;    
  31.     }    
  32.     
  33.     /**  
  34.      * @return a new GroovyClassLoader  
  35.      */    
  36.     GroovyClassLoader getGroovyClassLoader() {    
  37.         return new GroovyClassLoader();    
  38.     }    
  39.     
  40.     /**  
  41.      * Compiles groovy class from a file  
  42.      *  
  43.      * @param file  
  44.      * @return  
  45.      * @throws java.io.IOException  
  46.      */    
  47.     public Class compile(File file) throws IOException {    
  48.         GroovyClassLoader loader = getGroovyClassLoader();    
  49.         Class groovyClass = loader.parseClass(file);    
  50.         return groovyClass;    
  51.     }    
  52.     
  53.     @RunWith(MockitoJUnitRunner.class)    
  54.     public static class UnitTest {    
  55.         @Test    
  56.         public void testLoadGroovyFromString() {    
  57.     
  58.             GroovyCompiler compiler = spy(new GroovyCompiler());    
  59.     
  60.             try {    
  61.     
  62.                 String code = "class test { public String hello(){return \"hello\" } } ";    
  63.                 Class clazz = compiler.compile(code, "test");    
  64.                 assertNotNull(clazz);    
  65.                 assertEquals(clazz.getName(), "test");    
  66.                 GroovyObject groovyObject = (GroovyObject) clazz.newInstance();    
  67.                 Object[] args = {};    
  68.                 String s = (String) groovyObject.invokeMethod("hello", args);    
  69.                 assertEquals(s, "hello");    
  70.     
  71.     
  72.             } catch (Exception e) {    
  73.                 assertFalse(true);    
  74.             }    
  75.     
  76.         }    
  77.     }    
  78. }    

这篇关于Netflix学习笔记:Zuul的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885628

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件