用Java实现一个Http代理服务器

需求描述:

假设我们有这样一种场景,需要接受到用户的http请求(来自浏览器或者其他),将这个http请求转发给后端的服务。在转发的过程中,需要尽可能的高效并且不能丢失header头信息。如图一所示。server部分可以作为一个黑盒,但是肯定会有一个nginx,至于背后是php-fpm还是tomcat就无从知晓了。

java-proxy

 

图一:java-proxy的流程

设计部分:

这个初看起来,也许十分简单,一个httpclient请求server,并且把请求输出去就完了嘛,没什么难度。但是我们需要仔细的考虑下,request-header头部分如何交给server,同时response-header又如何传递给用户呢?当server部分的nginx开了gzip压缩的时候,我们应该如何处理呢? 能不能不用解开压缩的数据,直接透传给用户以节省资源呢?毕竟你有一个解压的过程,随后将会再有一个压缩的过程。总之在做的过程中,才发现了不少问题,也是一个值得记录的部分。

一、首先我们看看当完全透传浏览器的header头给后端服务的时候,会有什么问题呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注