在Spring應用除錯中實現反向代理伺服器
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
簡單來說,你的反向代理伺服器會接收請求,但其自身不處理該請求,而是對請求經過一些處理,例如新增日誌、快取、身份驗證等服務,然後再將請求轉發到相應的應用伺服器中進行處理,最後將處理結果返回。
執行反向代理伺服器
接下來我們自己實現一個可以個性化配置的反向代理伺服器,我們的系統使用了maven作為版本管理,Spring + spring-boot作為框架以幫助我們快速搭建我們的web應用。如果大家對如何搭建一個web應用有興趣,可以學習我們的
注:目前我們使用8888埠,如果需要更改,可以修改src/main/resources/application.properties
檔案的server.port屬性。
我們就是百度
開啟瀏覽器,訪問http://localhost:8080,發現我們進入到了百度首頁,進行搜尋、翻頁等操作,發現行為和百度一模一樣,但是域名仍然是我們的localhost:8080
。接下來,我們來看看如何達到這樣的效果。
首先是新增依賴,除了Spring-boot最基本依賴外,我們還依賴了兩個庫,一個是Google的guava庫,裡面包含了Google的很多核心庫,我們主要使用其中的集合。另一個是代理的核心庫smiley-http-proxy-servlet
<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,並對其進行配置即可:
@Bean
public Servlet baiduProxyServlet(){
return new ProxyServlet();
}
@Bean
public 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()
進行處理即可。