作者:啊啦哈200601 | 来源:互联网 | 2023-12-13 15:19
像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户使用起来就需要在不同产品工具间来回切换操作,为了提高用户友好性,同时重要的是能够方便的往外推广,这时候就需要打造一个集各个产品的平台,或者说简单点就是弄个统一入口,这个平台提炼了其他各个产品的优点进行整合。新平台说白了只是一个壳子,很多核心功能的实现是在其他各个产品达成的,有现成的接口,新平台的大部分研发工作是对现有的接口进行整合。很多功能的实现只需要调用第三方接口即可,这时候就可以使用反向代理来达到目的,使得新平台的后端工作量极大减少,提高工作效率。比如一整套产品生命周期大致分为:架构设计评审实施、产品研发、代码管理、上线交付、运维监控等等,整个生命周期的维护需要使用到不同的平台,功能发散,不好统一发展,整合之后整条生命线显得清晰明了,用户使用方便,便于规划。
反向代理:服务器收到客户端的请求之后,把请求再转发到内部的其他服务中,收到其他服务的响应之后,把响应返回给客户端。在过程中可能会做一些日志,缓存之类的,比如NG就可以作为一个典型的反向代理服务器,除此之外,在自己实现的服务中可以使用ProxyServlet来达到这样的代理目的。
通过如下案例来看一下在springboot中ProxyServlet是如何使用的
设置两个代理,一个当请求包含/csdn/路径时,将请求转发到https://blog.csdn.net/,一个当请求包含/local/路径时,将请求转发到http://127.0.0.1:8080/
org.mitre.dsmiley.httpproxysmiley-http-proxy-servlet1.9
import org.mitre.dsmiley.httpproxy.ProxyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ServletConfig {@Beanpublic ServletRegistrationBean CSNDServletServletRegistrationBean() {ServletRegistrationBean servletRegistratiOnBean= new ServletRegistrationBean(new ProxyServlet(), "/csdn/*");servletRegistrationBean.setName("csnd-proxy");servletRegistrationBean.addInitParameter("targetUri", "https://blog.csdn.net/");servletRegistrationBean.addInitParameter("http.read.timeout", "10000");servletRegistrationBean.addInitParameter("http.socket.timeout", "10000");servletRegistrationBean.addInitParameter("http.connection.request.timeout", "3000");servletRegistrationBean.addInitParameter("log", "true");return servletRegistrationBean;}@Beanpublic ServletRegistrationBean
localServletServletRegistrationBean() {ServletRegistrationBean servletRegistratiOnBean= new ServletRegistrationBean(new ProxyServlet(), "/local/*");servletRegistrationBean.setName("local-proxy");servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:8080/");servletRegistrationBean.addInitParameter("http.read.timeout", "10000");servletRegistrationBean.addInitParameter("http.socket.timeout", "10000");servletRegistrationBean.addInitParameter("http.connection.request.timeout", "3000");servletRegistrationBean.addInitParameter("log", "true");return servletRegistrationBean;}}
启动服务之后来看下效果
可以看出访问http://127.0.0.1:8080/csdn/qq_34485626的效果跟访问https://blog.csdn.net/qq_34485626的效果是一样的,说明代理成功。
http://127.0.0.1:8080/local/test/proxy和http://127.0.0.1:8080/test/proxy的效果也是一样
@RequestMapping(value = "/test/proxy" , method = RequestMethod.GET)
@ResponseBody
public String proxy() {return "proxy successfully";
}