問題
大家都知道,工作中一般在項目中會有不同的應用模塊,每個應用模塊有自己的端口,這時候,通過IP+端口號訪問,將會變的很麻煩,那麼如何解決這個問題呢:
解決方案
使用反向代理,監聽我們本地的80端口,將請求轉發自各自的端口,常見的反向代理有nginx。IP我們這裏也不使用了,比較麻煩,我們直接使用自定義的域名,本地配置host域名(推薦使用SwitchHosts管理本地hosts),瀏覽器(Chrome瀏覽器)我們推薦使用SwitchyOmega插件做瀏覽器攔截。
原理
在瀏覽器輸入域名,然後SwitchyOmega識別到,此域名已經配置過,需要走本地hosts解析,獲取到IP地址,將請求轉發到這個IP地址,Nginx監聽到內容,根據自己配置轉發規則,進行端口轉發,最終,將請求發散到我們的各大應用。
具體實現
首先,我們啓動兩個項目,並且在瀏覽器直接訪問
http://127.0.0.1:9001和http://127.0.0.1:9002
- 配置Host
127.0.0.1 www.local.cn
- 配置nginx
upstream apply1 { server 127.0.0.1:9001; } upstream apply2 { server 127.0.0.1:9002; } server { listen 80; server_name www.local.cn; location /a1/ { proxy_pass http://apply1; proxy_redirect default; } location /a2/ { proxy_pass http://apply2; proxy_redirect default; } }
這樣通過http://www.local.cn/a1
訪問的就是9001
的應用,http://www.local.cn/a2
訪問的就是9002
的應用,到此已經完成改造。
等下,好像有什麼地方不對,有人說,你這樣搞我每個應用豈不是必須在Controller
層都要配置一個多餘的/a1
路徑,用起來多麻煩,是有這個問題,所以我們引入一個工具:UrlRewrite
,他的原理實際上是過濾器通過對Request
中的Url
進行改寫,對源碼有興趣的朋友,可以自行百度究其根源。
那怎麼用呢?簡單介紹下SpringBoot
項目如何集成。
SpringBoot集成UrlRewrite
- 編寫UrlRewrite配置類
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.Resource; import org.tuckey.web.filters.urlrewrite.Conf; import org.tuckey.web.filters.urlrewrite.UrlRewriteFilter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import java.io.IOException; /** * @author sjp * @date 2019/1/19 **/ @Configuration public class UrlRewriteFilterConfig extends UrlRewriteFilter { @Value("classpath:/urlRewrite/urlRewrite.xml") private Resource resource; @Override protected void loadUrlRewriter(FilterConfig filterConfig) throws ServletException { try { Conf conf = new Conf(filterConfig.getServletContext(), resource.getInputStream(), resource.getFilename(), "apply1"); checkConf(conf); } catch (IOException ex) { throw new ServletException("Unable to load URL rewrite configuration file from classpath:/urlRewrite/urlRewrite.xml", ex); } } }
- 新建UrlRewrite配置文件
<urlrewrite> <!-- 應用拆分,重寫url --> <rule> <from>^/a1(.*)$</from> <to>$1</to> </rule> </urlrewrite>
好,到此已經完成接入,小夥伴們自行寫一個Controller
進行測試即可,另外如果項目中有使用攔截器、過濾器的並且和Url相關(例如Shiro
,請注意執行順序)。