smiley-http-proxy-servlet 反向代理
来源:互联网 发布:python 函数 传入list 编辑:程序博客网 时间:2024/05/23 19:59
https://zhuanlan.zhihu.com/p/21360559
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简单来说,你的反向代理服务器会接收请求,但其自身不处理该请求,而是对请求经过一些处理,例如添加日志、缓存、身份验证等服务,然后再将请求转发到相应的应用服务器中进行处理,最后将处理结果返回。
运行反向代理服务器
接下来我们自己实现一个可以个性化配置的反向代理服务器,我们的系统使用了maven作为版本管理,Spring + spring-boot作为框架以帮助我们快速搭建我们的web应用。如果大家对如何搭建一个web应用有兴趣,可以学习我们的Java Web全栈开发,这里不过多描述。大家把代码下载下来后,进入系统根目录,运行mvn spring-boot:run,即可运行该系统。
注:目前我们使用8888端口,如果需要更改,可以修改src/main/resources/application.properties文件的server.port属性。
我们就是百度
打开浏览器,访问http://localhost:8080,发现我们进入到了百度首页,进行搜索、翻页等操作,发现行为和百度一模一样,但是域名仍然是我们的localhost:8080。接下来,我们来看看如何达到这样的效果。
首先是添加依赖,除了Spring-boot最基本依赖外,我们还依赖了两个库,一个是Google的guava库,里面包含了Google的很多核心库,我们主要使用其中的集合。另一个是代理的核心库smiley-http-proxy-servlet,是github上的一个开源项目:
<dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <artifactId>smiley-http-proxy-servlet</artifactId> <version>1.6</version></dependency><dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version></dependency>
引入依赖后,我们只需要声明一个proxy的servlet,并对其进行配置即可:
@Beanpublic Servlet baiduProxyServlet(){ return new ProxyServlet();}@Beanpublic ServletRegistrationBean proxyServletRegistration(){ ServletRegistrationBean registrationBean = new ServletRegistrationBean(baiduProxyServlet(), "/*"); Map<String, String> params = ImmutableMap.of( "targetUri", "http://baidu.com", "log", "true"); registrationBean.setInitParameters(params); return registrationBean;}
我们可以看到,只需要对targetURi进行设置,表明ProxyServlet需要代理http://baidu.com,然后将所有/*交给baiduProxyServlet()进行处理即可。
=====================================================================
http://blog.csdn.net/u012734441/article/details/53579796
前段时间在公司内负责一个open api平台搭建的项目,当时采用了spring boot来进行搭建整个项目,但是对应的代理服务确实是想了一段时间才决定采用哪种方案的,因为需要开放出来的接口基本都不是需要token验证的,只需要对应的参数就可以正常访问,所以这些接口只能内部访问,在考虑使用哪种服务代理的时候个人考虑过以下几种:
Jersey代理
jersey有个代理连接池的一个功能,只需要写好和对方对应的接口,本地不需要实现,就可以正常进行服务访问,但是server端提供多少个接口,open api平台就必须同样编写多少个对应的接口,十分麻烦。
HTTP-Proxy-Servlet
基于Filter进行服务代理,只需要进行相关的配置之后,就能进行服务代理,同时核心文件只有2个,容易理解和进行改动,但是存在的问题是只能代理一个url,不能代理多个不同的url,jersey方便的是可以配置多个url进行代理,因此在这里,如果日后需要代理不同项目的接口的时候,就会有一定难度,需要对当前这个代理服务进行改造。
netflix-zuul
这个是我在后来才找到的解决方案,基本需要将spring cloud这一套都配置,就我目前对zuul的了解中,似乎是可以满足目前的需求的,但是这个时候我已经将整个代理服务全部完成了,因此这种方案日后有需要再引进来。
在最后,我选取了第二种方案,就是基于Filter进行代理,引入进来后发现使用不错。
ProxyFilter
在使用这个解决方案的时候,maven仓库中有相应的依赖,使用相当方便,如下:
- 1
- 2
- 3
- 4
- 5
- 6
这样使用到也不错,但实质上项目使用的时候,往往是需要进行一定程度的改造的,所以我更推荐的是直接将这个依赖中所有类引进来,方便自己改动。
因为使用的是spring boot项目,因此需要进行spring boot的相关配置,具体如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
配置文件
application.yml:
- 1
- 2
- 3
- 4
- 5
对应的target是自己需要代理的服务,就这样配置完成后,启动两个server,访问对应的请求,就可以进行服务代理了。
综上
我之所以推荐使用将ProxyFilter相应文件引进来的原因,主要有一点就是ProxyFilter里面所对应的服务代理本身就是使用HttpClient发出请求而已,但是在这里,原作者在这里构造的Http的连接池好像只设定了20哥http连接,较少,如果请求量大一点就响应缓慢了,因此在这里推荐将原作者写的那一套Http连接池那里,全部去掉,自己编写一套代替。
ProxyFilter这个只能代理一个服务,如果需要代理多个服务的话,需要对服务进行进一步的改造,或者使用其他的方案。
- smiley-http-proxy-servlet 反向代理
- 反向代理(Reverse Proxy)
- http 反向代理原理
- nginx http反向代理
- HTTP 代理和反向代理
- nginx的proxy配置(反向代理)
- Apache反向代理(mod-proxy方式)
- rewrite、nginx proxy反向代理和缓存
- 【翻译】Reverse Proxy Guide 反向代理指南
- Python使用HTTP代理 Proxy
- http请求代理proxy-ajax
- 怎么理解反向代理(reverse proxy)的反向?
- HTTP反向代理的理解
- Traffic Server HTTP 反向代理
- nginx 反向代理http/https
- HTTP代理模块(HTTP Proxy)
- http反向代理和转发代理
- golang 实现HTTP代理和反向代理
- sql 基础知识
- 根据文本内容的长度动态的设置TextView的高度
- Java多线程与并发学习之(四):线程常用方法
- 综合实战:生产者与消费者(利用Object类解决重复操作)
- ssm连表查询Mapper动态代理
- smiley-http-proxy-servlet 反向代理
- 关于Java内部类序列化
- HTML <Tabel>简单使用
- 2017.6.4测试 题一 k好数
- 微积分
- HDU2196
- Android开发技巧:AndroidWiFiADB-无线调试工具
- bot framework1--hello bot
- win10系统开启IIS服务