最近的一個項目采用前后端完全分離的架構,前端組件:vue + vue-router + vuex + element-ui + axios,后端組件:Spring Boot + MyBatis。之所以這樣做是為了考慮后端水平擴容的便利性,在部署的時候完全可以將前后端彼此獨立部署,前端部署可以直接使用諸如Nginx這樣的高性能Web服務器。
前端需要知道它所訪問的后端服務器IP地址才能訪問到數據,但是如果將IP地址硬編碼在前端代碼中的話,在部署的時候會存在一個問題:當服務器端IP地址變化之后必須重新打包發布(開發,測試和產線的環境不同,也需要針對特定環境打包)。
相對路徑
如果后端項目的上下文路徑為“/”,那么出於對資源利用率的考慮,在項目前期(規模小)可以將前后端部署在同一個嵌入式Tomcat容器中(Spring Boot框架支持靜態頁面)。此時,在前端項目的Ajax請求中可以使用相對路徑,如下所示:
var url = "/api/v1/data"
$.get(url, function(data){
alert("Data Loaded: " + data);
});
此時Ajax會自動在相對路徑前面加上http://host:port ,並且上下文路徑為“/”,那么最終的請求的API路徑為:http://host:port/ + 相對路徑
。此時就不用在前端的代碼中硬編碼后端地址和端口了,但是注意這個用法的前提必須滿足2個條件:
(1)前后端必須部署在同一個容器
(2)后端的上下文路徑必須為“/”
絕對路徑
隨着項目的發展,前后端要同時支持水平擴容(集群化),此時需要考慮將前后端完全獨立部署,那么在前端的Ajax請求中就不能使用相對路徑了(因為主機地址已經不同,存在跨域),對於后端API的訪問只能使用絕對路徑,而且也只能硬編碼后端的訪問地址和端口(如:http://host:port/api/xxx )。為了應對這種尷尬的局面,可以考慮使用域名的方式訪問后端服務,這樣只要域名不變,前端的訪問地址就不用變更。