Announcing Zuul: Edge Service in the Cloud

来源:互联网 发布:制作游戏的软件 编辑:程序博客网 时间:2024/05/20 02:51

Netflix流媒体应用是一系列复杂的交织在一起的系统,可以无缝地为我们的客户提供一个很好的体验。 Netflix API是系统的前端,支持超过1,000种不同的设备类型,并在高峰时段每秒处理超过50,000个请求。我们通过每天添加新功能不断迭代应用。同时,我们的用户界面团队不断push更新至服务器端客户端适配器脚本,以支持新功能和AB测试。新的AWS地区将部署到新的国家,以支持国际扩张。为了应对所有这些变化,以及支持复杂和高规格系统的其他挑战,需要一个能够实现快速开发,极大灵活性,广泛的洞察力和弹性的强大的边缘服务。


今天,我们很高兴向您介绍Zuul,对于这些挑战的解决方案,以及我们的开源软件套件的最新补充,尽管Zuul是最初设计用于面向Netflix API的边缘服务,但现在正以各种方式使用于Netflix的一些系统。


Zuul如何工作?
Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由期间执行一系列操作。 以下是Zuul过滤器的关键特性:

类型:当应用过滤器时,通常在路由流程期间定义阶段(它可以是任何自定义字符串)

执行顺序:在类型中应用,定义跨多个过滤器执行的顺序

标准:为了执行过滤器所需的条件

行动:如果符合条件,执行的行动

以下是一个简单的过滤器的示例,延迟来自malfunctioning设备的请求,以便将负载分配到我们的服务源:


 1 2 3 4 5 6 7 8 91011121314151617181920212223242526
class DeviceDelayFilter extends ZuulFilter {    def static Random rand = new Random()        @Override     String filterType() {       return 'pre'     }    @Override    int filterOrder() {       return 5    }    @Override    boolean shouldFilter() { return  RequestContext.getRequest().     getParameter("deviceType")?equals("BrokenDevice"):false    }    @Override    Object run() { sleep(rand.nextInt(20000)) //Sleep for a random number of seconds                                   //between [0-20]    }}


Zuul提供了动态读取、编译和运行这些过滤器的框架。 过滤器不直接相互通信 - 而是通过RequestContext共享状态,每个请求都是唯一的。




过滤器目前是用Groovy编写的,然而Zuul支持任何基于JVM的语言。 每个过滤器的源代码都将写入Zuul服务器上一组目录下,Zuul服务器会定期轮询是否有更新。 更新的过滤器从磁盘读取,动态编译到正在运行的服务器中,并由Zuul为每个后续请求调用。


有几种标准过滤器类型对应于请求的典型生命周期:

PRE过滤器在路由到原点之前执行。 示例包括请求验证,选择源服务器和记录调试信息。

ROUTING过滤器处理将请求路由到服务源。 这是使用Apache HttpClient或Netflix Ribbon构建和发送源HTTP请求的位置。

POST过滤器在请求已被路由到服务源后执行。 示例包括将标准HTTP头添加到响应中,收集统计信息和指标,以及将响应从源头传输到客户端。

ERROR当其他阶段之一发生错误时,会执行错误过滤器。


除了默认的过滤器流程,Zuul允许我们创建自定义过滤器类型,并显式执行。 例如,Zuul具有STATIC类型,可在Zuul内生成响应,而不是将请求转发到服务源。



我们如何使用Zuul
Zuul有许多方法可以帮助我们运行Netflix API和整个Netflix流媒体应用程序。 以下是一些较为常见的例子的简短列表,有些将在下面详细介绍:

  • Authentication
  • Insights
  • Stress Testing
  • Canary Testing
  • Dynamic Routing
  • Load Shedding
  • Security
  • Static Response handling
  • Multi-Region Resiliency 

Insights

Zuul通过使用其他Netflix OSS组件,向我们提供了对系统的深入了解。 Hystrix被用来打包我们的源服务,这使得我们能够在发生问题时减少流量和优先级。Ribbon作为Zuul的所有出站请求的客户端,它提供了网络性能和错误的详细信息,以及处理软件负载均衡以实现均匀的负载分配。Turbine实时整合细粒度指标,以便我们能够快速观察和对问题做出响应。Archaius处理配置并提供动态修改属性的功能。


由于Zuul可以在运行时添加,修改和编译过滤器,系统行为可以快速更改。我们添加新路由,分配授权访问规则,并通过添加或修改过滤器对路由进行分类。当出现意想不到的情况时,Zuul可以快速拦截请求,以便我们能够分析,解决问题。


Zuul的动态过滤功能使我们能够找到并隔离大量请求中通常很难找到的问题。可以编写一个过滤器来将特定的客户或设备路由到单独的API集群进行调试。当网站的新页面需要调整时,使用了这种技术。观察到性能问题,以及不明原因的错误。这是很难调试的问题,因为问题只发生在一小部分客户。通过将流量隔离到单个服务实例,可以实时查看请求中的模式和差异。 Zuul有我们所说的“SurgicalDebugFilter”过滤器,这是一个pre过滤器,如果patternMatches()条件为真,将请求路由到隔离的群集。添加此过滤器以匹配新页面,我们能够快速识别和分析问题。在使用Zuul之前,Hadoop被用于查询数十亿条记录的请求,以查找数千个新页面的请求,现在,我们通过搜索几台服务器上相对较小的日志和实时观察请求行为就能分析问题原因。


以下是使用 SurgicalDebugFilter 将匹配的请求路由到调试集群的的示例:

class SharpDebugFilter extends SurgicalDebugFilter {   private static final Set<String> DEVICE_IDS = ["XXX", "YYY", "ZZZ"]   @Override   boolean patternMatches() {       final RequestContext ctx = RequestContext.getCurrentContext()       final String requestUri = ctx.getRequest().getRequestURI();       final String contextUri = ctx.requestURI;       String id = HTTPRequestUtils.getInstance().           getValueFromRequestElements("deviceId");       return DEVICE_IDS.contains(id);  }}

除了动态地重新路由符合指定条件的请求,我们还有一个内置系统,建立在Zuul和Turbine之上,允许我们显示在整个集群中所有匹配的requests/responses的实时流日志。这种内部系统使我们能够快速找到异常行为的模式,或者简单地观察一些流量行为是否按预期行事(通过提出如“how many PS3 API requests are coming from Sao Paolo”的问题)?

压力测试

衡量我们系统的性能和容量限制对于预测我们的EC2实例需求,调整我们的自动缩放策略以及在添加新功能时跟踪一般性能趋势非常重要。在Zuul过滤器中使用动态Archaius配置的自动化过程可稳定地增加路由到一个小的源服务集群的流量。当实例获得更多的流量时,可测量它们的性能特征和容量。这可告知我们峰值时需要多少EC2实例运行,我们的自动缩放策略是否需要修改,以及特定版本是否具有发布到生产的所需性能特征。

多区域弹性

Zuul是我们的跨区域ELB弹性项目(称为Isthmus)的核心。作为Isthmus的一部分,Zuul用于将西海岸cloud region的请求与东海岸cloud region桥接,以帮助我们在关键领域的ELB中实现多区域冗余。请关注关于我们的Isthmus计划的科技博客文章。


Zuul OSS


今天,我们以包含如下几个不同组成组件开源了zuul:

zuul-core - 一个包含一组核心功能的库。

zuul-netflix - 使用许多Netflix OSS组件的扩展库:

Servo 洞察,指标,监控

Hystrix 用于Turbine的实时指标

Eureka 实例发现

Ribbon 路由

Archaius 用于实时配置

Astyanax Cassandra中的持久性过滤器

zuul-filters - 与zuul-core和zuul-netflix库一起使用的过滤器

zuul-webapp-simple - 一个基于zuul-core构建的Web应用程序的简单示例,包括几个基本过滤器

zuul-netflix-webapp- 将zuul-core,zuul-netflix和zuul-filters放在一起的Web应用程序。


把以上所有东西放在一起,我们还提供了一个基于zuul-core和zuul-netflix的web应用程序。该应用程序还提供了许多有用的过滤器,例如:
加权负载平衡,以路由一定比例的负载至某一服务器或集群,进行容量测试
请求调试
Apache HttpClient和Netflix 路由过滤器
统计收集
我们希望这个项目对您的应用程序有用,并在使用Zuul作为粘合剂时展示我们的开源项目的实力,并鼓励您向Zuul做出更好的贡献。此外,如果这项技术令你如我们一样兴奋,请查看我们团队目前的职位:工作


原文地址:http://techblog.netflix.com/2013/06/announcing-zuul-edge-service-in-cloud.html


原创粉丝点击