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的功能通过金丝雀版本实现精确路由与压力测试。
其核心代码为:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { try { init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); try { preRouting(); } catch (ZuulException e) { error(e); postRouting(); return; } filterChain.doFilter(servletRequest, servletResponse); try { routing(); } catch (ZuulException e) { error(e); postRouting(); return; } try { postRouting(); } catch (ZuulException e) { error(e); return; } } catch (Throwable e) { error(new ZuulException(e, 500, "UNCAUGHT_EXCEPTION_FROM_FILTER_" + e.getClass().getName())); } finally { RequestContext.getCurrentContext().unset(); } }
Zuul加载Groovy过滤器:
import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import static org.junit.Assert.*; import static org.mockito.Mockito.spy; public class GroovyCompiler { private static final Logger LOG = LoggerFactory.getLogger(GroovyCompiler.class); /** * Compiles Groovy code and returns the Class of the compiles code. * * @param sCode * @param sName * @return */ public Class compile(String sCode, String sName) { GroovyClassLoader loader = getGroovyClassLoader(); LOG.warn("Compiling filter: " + sName); Class groovyClass = loader.parseClass(sCode, sName); return groovyClass; } /** * @return a new GroovyClassLoader */ GroovyClassLoader getGroovyClassLoader() { return new GroovyClassLoader(); } /** * Compiles groovy class from a file * * @param file * @return * @throws java.io.IOException */ public Class compile(File file) throws IOException { GroovyClassLoader loader = getGroovyClassLoader(); Class groovyClass = loader.parseClass(file); return groovyClass; } @RunWith(MockitoJUnitRunner.class) public static class UnitTest { @Test public void testLoadGroovyFromString() { GroovyCompiler compiler = spy(new GroovyCompiler()); try { String code = "class test { public String hello(){return \"hello\" } } "; Class clazz = compiler.compile(code, "test"); assertNotNull(clazz); assertEquals(clazz.getName(), "test"); GroovyObject groovyObject = (GroovyObject) clazz.newInstance(); Object[] args = {}; String s = (String) groovyObject.invokeMethod("hello", args); assertEquals(s, "hello"); } catch (Exception e) { assertFalse(true); } } } }
相关推荐
Netflix的文章: Zuul 1: : Zuul 2: Netflix关于Zuul的演示: 奇怪的循环2017-Zuul 2: : AWS re:Invent 2018-为数百万个Netflix设备扩展推送消息传递: : Netflix关于Zuul的演示文稿的幻灯片: 使用Zuul的项目...
spring-cloud-starter-netflix-zuul.zip已经闭源的jar包,
Zuul 是提供动态路由,监控,弹性,安全等的边缘服务。Zuul 相当于是设备和 Netflix 流应用的 Web...Zuul 包含多个组件:zuul-core zuul-simple-webapp zuul-netflix zuul-netflix-webapp 标签:Zuul Web框架
spring-cloud-netflix-zuul-websocket, Zuul反向代理网络套接字支持 spring-cloud-netflix-zuul-websocketspring 应用程序中支持Zuul反向代理web套接字支持的简单库。用法spring-cloud-netflix-zuul-websocket可以从...
可用的spring-cloud-starter-netflix-zuul-2.0.0.RELEASE包,maven上的spring-cloud-starter-netflix-zuul-2.0.0.RELEASE已经没了。
cxf-spring-cloud-netflix-docker Spring Boot和Spring Cloud兼容性: : 将Spring Boot应用程序与Spring Cloud Netflix和Docker结合在一起的示例项目它是作为此博客文章的展示创建的: 并且被该Ansible存储库使用:...
Recriando一个做Netflix的界面 :television: 数字创新一号-Felipe Aguiar教授。HTML Web开发人员 :laptop: Linguagens:HTML,CSS3,JavaScript,jQuery。 包含链接元素,链接对象和地址的链接助手-情报(在janela /...
spring-netflix-stack-playground 一个简单的留言簿应用程序,通过Spring-Boot和Spring-Netflix-Stack(Zuul,Hystrix,...proxy:Zuul代理服务器guestbook-mail:基于spring邮件的邮件Web服务签出所有应用程序,然
教育精品资料
Netflix文化:自由与责任(中英文双语对照版),从其他地方转载过来的,有需要的可以下载
Netflix文化:自由与责任(中英文双语对照版)
netflix-api-zuul-网关服务器
netflix-clone:一个netflix克隆
Netflix clone 运行:yarn start
Spring Cloud中Zuul的高阶使用方式,主讲了执行的流程和两个开启服务的注解的区别
projeto_netflix_interface:Netflix界面的应用程序项目
Netflix Culture:Freedom & Responsibility.pptx
netflix登陆页面 使用以下方法重新创建Netflix登陆页面: HTML,CSS和JavaScript。
Netflix-Clone:Desafio da Digital Innovation Netflix的一个最重要网站
AWS_ENTS649B_Netflix_Project:使用AWS资源进行Netflix模拟