jetty 透明代理的实现

原创 2012年03月25日 17:22:43

背景

一提到proxy,大家首先想到就是squid、varnish、apache、lighttpd之类,接下来我们看看jetty8中的ProxyServlet是如何实现这个功能的

ProxyServlet主要用到了continuation和http client两个技术点,如果了解了我的前几篇博文

  • jetty io:http://blog.csdn.net/pwlazy/article/details/7162992
  • jetty continuation:http://blog.csdn.net/pwlazy/article/details/7299719
  • jetty http client:http://blog.csdn.net/pwlazy/article/details/7389204

理解ProxyServlet就很容易了


配置

ProxyServlet官方配置如下:

<servlet>
    <servlet-name>TransparentProxy</servlet-name>
    <servlet-class>org.eclipse.jetty.servlets.ProxyServlet$Transparent</servlet-class>
    <async-support>true</async-support>
    <init-param>
      <param-name>Prefix</param-name><param-value>/javadoc-proxy</param-value>
    </init-param>
    <init-param>
      <param-name>ProxyTo</param-name><param-value>http://download.eclipse.org/jetty/stable-8/apidocs</param-value>
    </init-param>
    <init-param>
      <param-name>HostHeader</param-name><param-value>download.eclipse.org</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>TransparentProxy</servlet-name>
    <url-pattern>/javadoc-proxy/*</url-pattern>
  </servlet-mapping>

servlet的初始化
  • host的黑名单/白名单
  • httpclient,比如最大线程、某个服务的最大连接数、请求超时时间、连接空闲时间等等

servlet的运行

  • 根据请求和配置确定目标url
  • 定义httpexchange,包括各种callback
  • 拷贝原始请求中的header到httpexchange,需要排除一些不需要的header比如connection、keep-alive(详见ProxyServlet中定义的_DontProxyHeaders)
  • 设置proxy的专有头部,比如X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host、X-Forwarded-Server
  • 注册continuation
  • 调用httpclient发送httpexchange

内部运行原理

  • ProxyServlet使用了两个线程池来完成工作,一个jetty server使用,一个jetty http client使用​
  • server中的work线程将请求任务扔给http clientt中的worker线程,就会回收到server线程池中(这是第一次异步)
  • http client中的worker线程请求后台server的内容(这是第二次异步,因为请求过程一旦不能立即返回,worker线程就会把请求注册到select线程然后返回,这个我在博文http://blog.csdn.net/pwlazy/article/details/7389204详细描述了)
  • 一旦backend后端返回,就会调用exchange中定义的callback(这是第一次callback【时髦的说法应该是事件驱动】,也是http client级别的callback)
  • callback接下来也会调用continuation的complete方法通知jetty server,后台操作完成(这是第二次callback,是server级别的callback,通过continuation完成,这个过程我在博文http://blog.csdn.net/pwlazy/article/details/7299719也详述了)
  • 此时jetty server又会使用一个worker线程完成最后的输出到浏览器

小结

  • ProxyServlet综合使用了​continuation和httpclient​
  • ​ProxyServlet类似场景还是大量存在的,比如我们的web应用经常会调用后端的服务,比如cache、db、其他服务等​
  • 如果调用后端的服务能够做到象http client这样事件驱动,那么就可以很完美的实现整个web 应用完全无阻塞
  • 否则想仅仅使用一个应用级别线程池+continuation实现完全无阻塞简直就是白搭,因为那个压力完全会在应用线程池这边
  • 可见web 应用完全无阻塞是前提条件是所有的io点都必须无阻塞,这个条件看起来是有些高了,恐怕很多服务驱动程序都需要重写,鸭梨山大


Jetty反向代理

jetty 9.3.7中ProxyServlet类中取消了rewriteURI方法,以rewriteTarget方法取而代之。 rewriteTarget方法中返回的是反向代理的uri import ...
  • zhanglei0107
  • zhanglei0107
  • 2016年03月13日 15:26
  • 1711

jetty反相代理配置

  • 2017年10月08日 17:47
  • 12.02MB
  • 下载

谈谈jetty8 的io模型

几个重要的概念Connector: jetty网络接口的封装,用于监听网络连接SelectorManager:底层selector封装,管理网络事件,主要是向底层selector注册感兴趣的网络事件,...
  • pwlazy
  • pwlazy
  • 2011年12月29日 18:59
  • 3742

smiley-http-proxy-servlet 反向代理

null
  • casablancaagnes_3sdf
  • casablancaagnes_3sdf
  • 2017年06月28日 20:45
  • 771

动态代理(Dynamic Proxy)Java Servlet

              从JDK1.3开始,Java就引入了动态代理的概念。动态代理(Dynamic Proxy)可以帮助你减少代码行数,真正提高代码的可复用度。例如,你不必为所有的类的方法里面都...
  • tyrone1979
  • tyrone1979
  • 2006年09月16日 22:19
  • 16304

Servlet作为代理实现跨域访问

就是在前台中调用proxy程序的servlet,设置参数servletName和其它参数。代理程序会将该请求发送到目的地址的名称为servletName的servlet中去,并将其它参数作为请求的参数...
  • u012743772
  • u012743772
  • 2015年10月15日 15:34
  • 363

Jetty开发指导:HTTP Client

介绍 Jetty HTTP client模块提供易用的API、工具类和一个高性能、异步的实现来执行HTTP和HTTPS请求。 Jetty HTTP client模块要求Java版本1.7或者更高,...
  • liuy_98_1001
  • liuy_98_1001
  • 2014年08月04日 16:23
  • 7418

jetty 透明代理的实现

背景一提到proxy,大家首先想到就是squid、varnish、apache、lighttpd之类,接下来我们看看jetty8中的ProxyServlet是如何实现这个功能的ProxyServlet...
  • pwlazy
  • pwlazy
  • 2012年03月25日 17:22
  • 10890

win10 jetty 本地部署

Ps:上面之前的没成功过,记录一个本地实际成功的案例 解决帖子:http://blog.csdn.net/guoyankun/article/details/38319689   下载的jett...
  • tang745163962
  • tang745163962
  • 2017年01月13日 11:39
  • 1706

Python入门:python实现http透明代理(三)

import socket import threading import re import select import queue class Proxy(threading.Thread): ...
  • foryouslgme
  • foryouslgme
  • 2016年09月02日 10:47
  • 500
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jetty 透明代理的实现
举报原因:
原因补充:

(最多只允许输入30个字)