前⾔(什么是)
反向代理(Reverse )⽅式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部⽹络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为⼀个反向代理服务器。 举个例⼦,⽐如我访问(www.baidu),但是我们其实并不知道百度内部到底有多少台服务器、百度是怎么处理这次请求的以及我们应该访问那台服务器。我们只是知道我访问了百度(www.baidu)的域名或者公⽹IP,然后就返回了结果。⾄于百度前置⽹关服务根据规则进⾏转发(⾄于转发到那台服务器,由负载均衡处理)以及后端服务器处理对外⾯的⽤户来说是隐藏的。
注意⚠ 反向代理和正向代理的区别。
如何实现反向代理
HTTP-Proxy-Servlet如何使⽤实现反向代理
⾸先:引⼊HTTP-Proxy-Servlet项⽬依赖
1<dependency>
2 <groupId>org.mitre.dsmiley.httpproxy</groupId>
3 <artifactId>smiley-http-proxy-servlet</artifactId>
4 <version>1.11</version>
5</dependency>
1@Configuration
2public class ProxyServletConfig {
3
4 @Bean
5 public Servlet getProxyServlet() {
6 return new ProxyServlet();
7 }
8液体表面张力
9 /**
10 * 这⾥可以多加⼏个,但是servlet名字需要不⼀样
11 */
12 @Bean
二十四画品
13 public ServletRegistrationBean proxyServletRegistrationBean() {
14 // 配置路由策略
朝阳木化石15 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(getProxyServlet(), ContextConstants.PROXY_URL_PATTERN
16 Map<String, String> params = new HashMap<>();
17 // 路由策略
18 params.put("targetUri", "localhost:8080/proxy/error");
难忘的一课教学设计19 params.put(ProxyServlet.P_LOG, "true");
20 servletRegistrationBean.setInitParameters(params);
21 return servletRegistrationBean;
22 }
23}
其实这样,启动项⽬就可以实现反向代理的功能了。但是这种是静态的配置,如果我要基于数据库实现动态的⽅向代理服务应该怎么做呢?实现基于数据库动态⽅向代理
还记得在第⼆步中有⼀个ProxyServlet吗?其实我们可以继承这个类实现⾥⾯的service(HttpServletRequest request, HttpServletResponse response)⽅法即可。这⾥注意这两⾏代码是反向代理的关键,因为是通过attribute中这两个属性进⾏判断的。
1protected static final String ATTR_TARGET_URI =ODF
2 SimpleName() + ".targetUri";
3protected static final String ATTR_TARGET_HOST =
4 SimpleName() + ".targetHost";
5
6@Override
通风管道7protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {
8 // ...(忽略)...
9 servletRequest.setAttribute(ATTR_TARGET_URI, TargetUri());
10 servletRequest.setAttribute(ATTR_TARGET_HOST, gson.HttpHost()), HttpHost.class));
11 // ...(忽略)...
12}
看到这⾥聪明的同学们肯定知道应该怎么做了吧,只要在这⾥读取数据库中的路由规则,然后将刚刚ProxyServletConfig配置类中的路由规则写成(拦截(/*)所有路径并targetUri写成固定即可,反正targetUri已经失效),还要把注册的Servlet改成⾃⼰实现的Servlet即可。
怎么样,是不是⾮常简单实⽤~