1.zuul 1.x的架构如下所示:

线程模型:

其web应用的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"> <listener>
<listener-class>com.netflix.zuul.StartServer</listener-class>
</listener> <servlet>
<servlet-name>ZuulServlet</servlet-name>
<servlet-class>com.netflix.zuul.http.ZuulServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ZuulServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping> <filter>
<filter-name>ContextLifecycleFilter</filter-name>
<filter-class>com.netflix.zuul.context.ContextLifecycleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ContextLifecycleFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

从上面可以看出,启动时有三个主类:

1.1. StartServer

    @Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("starting server"); // mocks monitoring infrastructure as we don't need it for this simple app
MonitoringHelper.initMocks(); // initializes groovy filesystem poller
initGroovyFilterManager(); // initializes a few java filter examples
initJavaFilters();
}

1.2. ZuulServlet

@Override
public void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws ServletException, IOException {
try {
init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse); // Marks this request as having passed through the "Zuul engine", as opposed to servlets
// explicitly bound in web.xml, for which requests will not have the same data attached
RequestContext context = RequestContext.getCurrentContext();
context.setZuulEngineRan(); try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
} } catch (Throwable e) {
error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));
} finally {
RequestContext.getCurrentContext().unset();
}
}

1.3. ContextLifecycleFilter

public class ContextLifecycleFilter implements Filter {

    public void destroy() {}

    public void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(req, res);
} finally {
RequestContext.getCurrentContext().unset();
}
} }

2. zuul2的线程模型

其应用的web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5"> <filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter> <filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> <listener>
<listener-class>com.netflix.zuul.StartServer</listener-class>
</listener> </web-app>

2.1. StartServer

 /**
* Overridden solely so we can tell how much time is being spent in overall initialization. Without
* overriding we can't tell how much time was spent in BaseServer doing its own initialization.
*
* @param sce
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
server.start();
} catch (Exception e) {
LOG.error("Error while starting karyon.", e);
throw Throwables.propagate(e);
}
try {
initialize();
} catch (Exception e) {
e.printStackTrace();
}
super.contextInitialized(sce);
}

2.2. ZuulServlet

   @Override
public void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException
{
try {
zuulProcessor
.process(servletRequest, servletResponse)
.doOnNext(msg -> {
// Store this response as an attribute for any later ServletFilters that may want access to info in it.
servletRequest.setAttribute("_zuul_response", msg);
})
.subscribe();
}
catch (Throwable e) {
LOG.error("Unexpected error running ZuulHttpProcessor for this request.", e);
throw new ServletException("Unexpected error running ZuulHttpProcessor for this request.");
}
}

2.3 ZuulHttpProcessor

/**
* The main processing class for Zuul.
*
* 1. Translates the inbound native request (ie. HttpServletRequest, or rxnetty HttpServerRequest) into a zuul HttpRequestMessage.
* 2. Builds the filter chain and passes the request through it.
* 3. Writes out the HttpResponseMessage to the native response object.
*/

处理过程:

  public Observable<ZuulMessage> process(final I nativeRequest, final O nativeResponse)
{
// Setup the context for this request.
final SessionContext context; // Optionally decorate the context.
if (decorator == null) {
context = new SessionContext();
} else {
context = decorator.decorate(new SessionContext());
} return Observable.defer((Func0<Observable<ZuulMessage>>) () -> { // Build a ZuulMessage from the netty request.
final ZuulMessage request = contextFactory.create(context, nativeRequest, nativeResponse); // Start timing the request.
request.getContext().getTimings().getRequest().start(); /*
* Delegate all of the filter application logic to {@link FilterProcessor}.
* This work is some combination of synchronous and asynchronous.
*/
Observable<ZuulMessage> chain = filterProcessor.applyFilterChain(request); return chain
.flatMap(msg -> {
// Wrap this in a try/catch because we need to ensure no exception stops the observable, as
// we need the following doOnNext to always run - as it records metrics.
try {
// Write out the response.
return contextFactory.write(msg, nativeResponse);
}
catch (Exception e) {
LOG.error("Error in writing response! request=" + request.getInfoForLogging(), e); // Generate a default error response to be sent to client.
return Observable.just(new HttpResponseMessageImpl(context, ((HttpResponseMessage) msg).getOutboundRequest(), 500));
}
finally {
// End the timing.
msg.getContext().getTimings().getRequest().end();
}
})
.doOnError(e -> {
LOG.error("Unexpected error in filter chain! request=" + request.getInfoForLogging(), e);
})
.doOnNext(msg -> {
// Notify requestComplete listener if configured.
try {
if (requestCompleteHandler != null)
requestCompleteHandler.handle(((HttpRequestMessage) request).getInboundRequest(), (HttpResponseMessage) msg);
}
catch (Exception e) {
LOG.error("Error in RequestCompleteHandler.", e);
}
})
;
}).finallyDo(() -> {
// Cleanup any resources related to this request/response.
sessionCleaner.cleanup(context);
});
}
}

参考文献:

【1】http://techblog.netflix.com/2013/06/announcing-zuul-edge-service-in-cloud.html

【2】http://techblog.netflix.com/2016/09/zuul-2-netflix-journey-to-asynchronous.html?utm_source=tuicool&utm_medium=referral

netflix zuul 1.x与zuul2.x之比较的更多相关文章

  1. Netflix Zuul 了解

    Zuul 是提供动态路由,监控,弹性,安全等的边缘服务.Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门.Zuul 可以适当的对多个 Amazon Auto Scal ...

  2. netflix zuul 学习

    netflix zuul 是netflix开发的一个EDGE SERVICE. 主要是作为一个API Gateway 服务器,可以实现安全,流量控制等功能. 我看的是1.x的版本,Zuul1.x的实现 ...

  3. com.netflix.zuul.exception.ZuulException: Hystrix Readed time out

    通过API网关路由来访问用户服务,zuul默认路由规则 :http://zuul的Host地址:zuul端口/要调用的服务名/服务方法地址 浏览器中打开http://127.0.0.1:8000/wa ...

  4. 聊聊 API Gateway 和 Netflix Zuul

    最近参与了公司 API Gateway 的搭建工作,技术选型是 Netflix Zuul,主要聊一聊其中的一些心得和体会. 本文主要是介绍使用 Zuul 且在不强制使用其他 Neflix OSS 组件 ...

  5. 关于SpringCloud配置网关转发时出现一下啊错误:“com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException”

    com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.netflix.zuul ...

  6. Spring Cloud Netflix Zuul 重试会自动跳过经常超时的服务实例的简单说明和分析

    在使用E版本的Spring Cloud Netflix Zuul内置的Ribbon重试功能时,发现Ribbon有一个非常有用的特性: 如果某个服务的某个实例经常需要重试,Ribbon则会在自己维护的一 ...

  7. com.netflix.zuul.exception.ZuulException: Forwarding error

    一.问题描述 在使用Spring Cloud的zuul组件,做路由转发时,每次重新启动后端服务,头几次调用都会出现com.netflix.zuul.exception.ZuulException: F ...

  8. 启动zuul时候报错:The bean 'proxyRequestHelper', defined in class path resource [org/springframework/cloud/netflix/zuul

    启动zuul时候报错:The bean 'proxyRequestHelper', defined in class path resource [org/springframework/cloud/ ...

  9. springcloud初次zuul超时报错com.netflix.zuul.exception.ZuulException:Forwarding error

    报错如下 com.netflix.zuul.exception.ZuulException:Forwarding error Caused by: com.netflix.hystrix.except ...

随机推荐

  1. 紫书 例题8-12 UVa 12627 (找规律 + 递归)

    紫书上有很明显的笔误, 公式写错了.g(k, i)的那个公式应该加上c(k-1)而不是c(k).如果加上c(k-1)那就是这一次 所有的红气球的数目, 肯定大于最下面i行的红气球数 我用的是f的公式, ...

  2. [HAOI2015]树上染色(树形dp)

    [HAOI2015]树上染色 题目描述 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所 ...

  3. HNU 13101 The Triangle Division of the Convex Polygon 组合数的因式分解求法

    题意: 求第n-2个Catalan数 模上 m. 思路: Catalan数公式: Catalan[n] = C(n, 2n)/(n+1) = (2n)!/[(n+1)!n!] 因为m是在输入中给的,所 ...

  4. #undef 的用法

    在Visual Studio2008中编写如下代码: #include <iostream> using namespace std; int main() { #define MODI ...

  5. 兼顾php和jquery新版本的checkbox的写法

    <input type="checkbox" class="scate_item" name="scategories[]" valu ...

  6. 转载:爱加密邀您参加5月17日深圳App开发沙龙活动

    听闻,移动互联网的九大门派已集结在一起,各路顶尖高手携App修炼宝典九阴真经现身,一场席卷全国的App修炼风暴即将来临.5月17日,以“移动开发者如何白手起家.快速盈利”为主题的沙龙活动将在深圳市南山 ...

  7. HDU 4288-Coder(模拟)

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. Majority Element:主元素

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  9. linux 抓包 tcpdump 简单应用

    在linuxserver上,常常要定位网络问题,就须要用到抓包. 比如:tcpdump -X -s 0 host 10.17.81.22 and port 9999 -w /home/text.cap ...

  10. C# - Thread.Join()

    Blocks the calling thread until a thread terminates, while continuing to perform standard COM and Se ...