`
lxlong
  • 浏览: 81768 次
社区版块
存档分类
最新评论

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的功能通过金丝雀版本实现精确路由与压力测试。

 

其核心代码为:

 

    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);  
            }  
  
        }  
    }  
}  

 

  • 大小: 107 KB
  • 大小: 34 KB
  • 大小: 34 KB
分享到:
评论
1 楼 jijijiujiu123 2016-07-06  
对过滤器进行动态的加载,编译,运行,我想写一个动态加载的demo,用什么注解让grovey变成spring的bean

相关推荐

    springcloud学习笔记.docx

    2. **Spring Cloud Netflix**:这是 SpringCloud 的核心组件,它整合了 Netflix 的多个开源组件,如: - **Eureka**:作为服务治理组件,Eureka 提供服务注册与发现功能,可以让服务提供者自动注册到 Eureka 服务器...

    springCloud学习笔记.zip

    这个学习笔记将深入探讨 Spring Cloud 的核心组件和它们的应用场景。 首先,我们要了解 Spring Cloud 的核心组件: 1. **Eureka**:服务注册与发现。Eureka 是 Netflix 提供的服务发现组件,每个服务启动时会在 ...

    SpringCloud学习笔记SpringCloud学习笔记

    Hystrix(后来被Netflix Ribbon替代):断路器模式,防止服务雪崩。 Ribbon:客户端负载均衡,用于访问注册到Eureka的服务。 Feign:简单易用的API客户端生成器。 ** Zuul**:一个基于Spring MVC的API网关,支持路由...

    Eureka服务注册中心学习笔记

    Eureka是Netflix公司开源的一款基于Java的微服务发现组件,它是Spring Cloud生态体系中的关键一环,用于实现服务的注册与发现。Eureka通过提供一个中心化的服务注册表,使得微服务实例可以在启动时向Eureka注册自己...

    spring cloudnetfix笔记.zip

    通过学习和理解 Spring Cloud Netflix 中的这些组件,你可以提升你的微服务架构设计和实施能力,为构建可扩展、高可用和容错的分布式系统打下坚实基础。在实际开发中,这些笔记将提供宝贵的指导,帮助你更好地运用 ...

    尚硅谷周阳SpringCloud第一季笔记(超详细非官方手工笔记)

    以下将详细解析SpringCloud的核心技术,并结合学习笔记的内容进行阐述。 1. **Eureka服务注册与发现**:Eureka是SpringCloud中的核心组件,用于服务注册和发现。每个微服务启动时都会向Eureka Server注册自身的信息...

    尚硅谷周阳SpringCloud第一季笔记

    以上知识点是根据“尚硅谷周阳SpringCloud第一季笔记”中的主要内容推测的,这些笔记详细记录了学习SpringCloud过程中所涉及的关键概念和技术点,对于想要掌握SpringCloud的开发者来说,是一份宝贵的参考资料。...

    SpringCloud笔记+思维导图

    本资料包含SpringCloud的学习笔记和思维导图,旨在帮助开发者深入理解并掌握SpringCloud的核心概念和技术。 1. **服务发现**:SpringCloud采用了Eureka作为服务注册与发现的工具。Eureka服务器作为服务注册中心,每...

    尚硅谷周阳老师SpringCloud笔记

    本资源“尚硅谷周阳老师SpringCloud笔记”涵盖了SpringCloud的核心概念和技术,是学习这一框架的理想材料。周阳老师是业界知名的IT教育专家,他的讲解深入浅出,有助于初学者快速理解和掌握SpringCloud的精髓。 ...

    SpringCloud笔记.rar

    这份"SpringCloud笔记.rar"文件显然包含了作者在学习狂神(一位知名的IT教育从业者)关于SpringCloud课程时整理的笔记,其中包括了Typora编辑器创建的文本文件和相关的图片资源,帮助读者更直观地理解和掌握课程内容...

    《深入理解Spring Cloud与微服务构建》学习笔记(十一)~使用RestTemplate和Ribbo消费服务

    在本篇学习笔记中,我们将深入探讨如何在Spring Cloud框架下使用RestTemplate和Ribbon来消费服务。Spring Cloud是基于Spring Boot实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、...

    SpringCloud第3季2024.7z

    10. **Spring Cloud Netflix** 和 **Spring Cloud Alibaba**:Netflix提供了许多微服务组件,但随着Netflix自身战略调整,Spring Cloud Alibaba逐渐成为替代方案,包括Nacos(服务发现)、Sentinel(流量控制)等。...

    尚硅谷SpringCloud第一季最新笔记

    SpringCloud是Java开发领域中的一个热门微服务框架,由Pivotal...同时,课程中的案例和笔记中的图片将更直观地帮助学习者理解和掌握这些概念。共享这样的资源,无疑对于提升整个Java开发社区的技术水平具有积极意义。

    sprinCloud笔记总结实习

    - **服务治理**:Spring Cloud Netflix 提供了丰富的组件,如 Eureka、Zuul、Hystrix 等,实现了全面的服务治理。 在选择微服务框架时,Spring Cloud 和 Dubbo 是常见的选项。Spring Cloud 基于 Spring Boot,拥有...

    《深入理解Spring Cloud与微服务构建》学习笔记(九)~Eureka集群配置

    在本篇学习笔记中,我们将深入探讨如何配置Eureka集群,这是Spring Cloud生态系统中的关键组件,用于实现微服务之间的服务发现。Eureka集群是确保高可用性和容错性的重要手段,因为它可以避免单点故障。Spring Boot...

    spring-microservices-in-action-note:Spring微服务的实践学习笔记

    《Spring微服务实战笔记》是基于Java开发领域的深度学习资源,专注于Spring框架在构建微服务架构中的应用。本文将深入探讨Spring微服务的核心概念、关键技术和最佳实践。 1. **Spring框架基础**:Spring框架是Java...

    springCloud参考指南-带书签pdf高清版本

    此高清版本的文字可复制,方便学习和笔记,是学习和工作中不可多得的参考资料。 1. **SpringCloud简介**:SpringCloud是基于SpringBoot实现的云应用开发工具集,它为开发者提供了在分布式系统中配置管理、服务发现...

    springcloud day1 资料

    "讲义"文件则可能是一份详细的课程大纲或笔记,涵盖了Spring Cloud的各个关键组件和它们的工作原理。讲义中可能会详细解释: 1. **服务发现**:Eureka是Netflix提供的服务发现组件,它允许服务实例向中心注册表注册...

Global site tag (gtag.js) - Google Analytics