摘要:怎么做前后端的分離我目前的做法是將作為一種服務存在,僅需要提供接口即可,前端目前采用,調用后端,解析數(shù)據(jù),靜態(tài)頁面。采用,充當層,前后端實現(xiàn)了真正的分離,但還是有點問題的。
什么是前后端分離
對于這個問題,其實可以看看我的學習歷程,我覺得很好的體現(xiàn)了Web開發(fā)模式的演化。
石器時代:那正是本人剛學JSP的時候,寫了一個簡單的商城DEMO,所有的業(yè)務邏輯,數(shù)據(jù)庫的交互以及Javascript代碼等都雜糅在.jsp文件中,好處就是簡單,幾個JSP頁面就能解決問題,但也正是由于內嵌了大量的Java代碼,前后端的代碼擠在一個文件中,后期可維護性很差,代碼完全沒有可讀性,而且更改一個CSS樣式都必須要重啟服務器才行
文明興起:那之后學習了Servlet,開始重構商城Demo,將數(shù)據(jù)庫的交互,業(yè)務邏輯,抽象到Servlet類中,JSP中的Java代碼慢慢消失,但還是造成了Controller類過于肥胖的問題
近現(xiàn)代:這個時候已經學習了SSH、Spring Family,搞過PlayFramework,JFinal等各種小玩意,對于MVC模式以及架構慢慢有了自己的理解,代碼的可維護性,可讀性各方面有了明顯的提升,項目各個層次的職責比較清晰:Model層采用SpringDATA,Entity只需少量注解,DAO層只需實現(xiàn)相應的接口,實現(xiàn)交給Spring去注入,Controller層則采用SpringMVC,View采用Freemarker,Velocity等模板,功能很強大,最重要的是斷了你在前端頁面中寫Java代碼的念頭。但是這個階段依然存在相關的問題:
View層仍然職責不清晰,究竟是該讓前端學習點后臺技術去直接套JSP模板,還是應該先在自己的機器上寫好頁面,然后交給后臺開發(fā)人員去改造成JSP/FTL等
開發(fā)效率底下,不利于前后臺的開發(fā)測試,后端不僅需要寫邏輯代碼,還需要去關注視圖層
可以看出,前后端分離其實是職責的分離,將不同邏輯抽象出來,讓前后端開發(fā)人員能夠更好的合作,對于我個人說,能夠更專一,開發(fā)后端的時候,只需要專心解決后端的問題,前端同理。
怎么做前后端的分離我目前的做法是:將Java作為一種服務存在,僅需要提供RESTFul接口即可,前端目前采用AngularJS,調用后端API,解析JSON數(shù)據(jù),靜態(tài)HTML頁面。
交給Nginx代理,下面是具體配置:
Java LayerJava采用SpringMVC,方法返回JSON數(shù)據(jù),然后運行帶后臺中,監(jiān)聽8080端口,處理來自前臺的請求
@RestController @RequestMapping("api") public class APIController { @Autowired private NewsItemService itemService; @Autowired private NewsDetailService detailService; /** * API:獲取單頁新聞 * @param pageable * @return */ @RequestMapping(value = "/news") public ListFrontEndshowNewsPage(Pageable pageable){ return itemService.findAll(pageable); } /** * API:根據(jù)指定NewsItem ID * 獲取新聞詳情 */ @RequestMapping(value = "/news/detail/{id}") public NewsDetail showNewsDetail(@PathVariable("id")Long id){ NewsDetail detail = detailService.findByNewsItemId(id); return detail; } /** * 獲取指定ID新聞 * @param id * @return */ @RequestMapping(value = "/news/{id}") public NewsItem showNewsItem(@PathVariable("id") Long id){ NewsItem item = itemService.get(id); return item; } 。。。 }
采用AngularJS,充當Controller層,前后端實現(xiàn)了真正的分離,但還是有點問題的。
index.htmlDzNews
app.js: var dznews = angular.module("dznews", [ "ngRoute", "newsControllers", ]); dznews.config(["$routeProvider","$locationProvider", function($routeProvider,$locationProvider) { $routeProvider. when("/",{ templateUrl: "part/news_list.html", controller: "listController" }). when("/news", { templateUrl: "part/news_list.html", controller: "listController" }). when("/news/:id", { templateUrl: "part/news_detail.html", controller: "newsDetailCtrl" }). otherwise({ redirectTo: "/news" }); // use the HTML5 History API $locationProvider.html5Mode(true); }]); var newsControllers = angular.module("newsControllers", []); newsControllers.controller("listController", function ($scope,$http) { $scope.page = 0; $http.get("/api/news").success(function(data) { $scope.newses = data; }); }); newsControllers.controller("newsDetailCtrl",["$scope", "$routeParams","$http","$sce", function($scope, $routeParams,$http,$sce) { $http.get("/api/news/detail/"+$routeParams.id).success(function (data) { $scope.detail = data ; $scope.detail.content = $sce.trustAsHtml($scope.detail.content); }); }]);Nginx Layer
Nginx監(jiān)聽80端口,靜態(tài)請求交由Nginx處理,動態(tài)請求轉發(fā)給8080端口的Java后端服務,配置如下供參考:
try_files:由于AngularJS是單頁應用,一個ng-app對應一個頁面,而且實現(xiàn)了自己的前端路由機制,這樣就可以由一個ng-app管理多個頁面,只需替換局部的ng-view,但是這樣就會有一個問題,當我們直接訪問首頁,跳轉到/news/:id的時候是沒問題的,
但是當直接訪問/news/:id這個網(wǎng)址的時候,就會出現(xiàn)404的錯誤,就其原因,是因為WebServer找不到對應的頁面,所以需要將所有的由AngularJS路由管理的URL都轉發(fā)到ng-app即可,
location / { root DzNewsBackEnd/app; #index index.html index.htm; try_files $uri $uri/ /index.html =404; } location /api/ { proxy_pass http://localhost:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; }總結
在用這種方式進行開發(fā)的時候,當我完成后端API的開發(fā),就可以專注去寫前端的頁面和JS邏輯,遇到BUG的時候,也相當容易調試,因為很容易發(fā)現(xiàn)是哪一層的問題,但還是存在一些短板,將所有的邏輯交由前端JS去執(zhí)行,安全及性能方面存在很多短板,當進去首頁的時候,會發(fā)現(xiàn)有一個明顯的白屏,而且會暴露后端的API,因此需要在后端進行一些驗證,例如OAUTH等方案,我個人傾向于中間加一層NodeJS,將所有的邏輯,session管理等都交由這層處理,也可以部署多個Node實例,再加上Nginx進行負載均衡處理,與Java部署在不同的服務器上,這樣Java只作為無狀態(tài)的服務存在,可以部署多個實例。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/64765.html
摘要:前后端分離的開發(fā)方式在最近幾年突然火起來,松哥認為有兩方面的原因前端的發(fā)展。不變其實除了前后端交互方式發(fā)生變化之外,其他的地方都是不變的。 事情的起因是這樣的,有個星球的小伙伴向邀請松哥在知乎上回答一個問題,原題是: 前后端分離的時代,Java后臺程序員的技術建議? 松哥認真看了下這個問題,感覺對于初次接觸前后端分離的小伙伴來說,可能都會存在這樣的疑問,于是決定通過這篇文章和大家聊一...
摘要:什么是前后分離前后端分離并不是什么新鮮事,到處都是前后端分離的實踐。然而一些歷史項目在從一體化設計轉向前后端分離的架構時,不可避免的會遇到各種各樣的問題。搞了一個前后分離,需要分離部署。 探究 :深入聊聊前后分離架構 前后分離,一直是一個相當泛泛的問題,前后分離到底好不好?沒有絕對的對,沒有絕對的錯,業(yè)界就這個問題已經激烈的探討幾年了.出現(xiàn)討論的點在于:分離當然是好的,但是以什么樣的服...
摘要:什么是前后分離前后端分離并不是什么新鮮事,到處都是前后端分離的實踐。然而一些歷史項目在從一體化設計轉向前后端分離的架構時,不可避免的會遇到各種各樣的問題。搞了一個前后分離,需要分離部署。 探究 :深入聊聊前后分離架構 前后分離,一直是一個相當泛泛的問題,前后分離到底好不好?沒有絕對的對,沒有絕對的錯,業(yè)界就這個問題已經激烈的探討幾年了.出現(xiàn)討論的點在于:分離當然是好的,但是以什么樣的服...
摘要:什么是前后分離前后端分離并不是什么新鮮事,到處都是前后端分離的實踐。然而一些歷史項目在從一體化設計轉向前后端分離的架構時,不可避免的會遇到各種各樣的問題。搞了一個前后分離,需要分離部署。 探究 :深入聊聊前后分離架構 前后分離,一直是一個相當泛泛的問題,前后分離到底好不好?沒有絕對的對,沒有絕對的錯,業(yè)界就這個問題已經激烈的探討幾年了.出現(xiàn)討論的點在于:分離當然是好的,但是以什么樣的服...
摘要:服務端任需要進行校驗來達到數(shù)據(jù)的可靠性前端的路由可能在服務端并不存在等等這一系列重用性的問題。串行并行,大幅縮短請求時間。關于作者本人主頁本文部分圖片段落參考文章淘寶前后端分離實踐微信公眾號會不定期推送前端技術文章,歡迎關注 一、背景 書接上文,淺談前后端分離與實踐(一) 我們用mock服務器搭建起來了自己的前端數(shù)據(jù)模擬服務,前后端開發(fā)過程中只需定義好接口規(guī)范,便可以相互進行各自的開發(fā)...
閱讀 1872·2023-04-26 02:32
閱讀 601·2021-11-18 13:12
閱讀 2480·2021-10-20 13:48
閱讀 2559·2021-10-14 09:43
閱讀 3870·2021-10-11 10:58
閱讀 3595·2021-09-30 10:00
閱讀 2970·2019-08-30 15:53
閱讀 3517·2019-08-30 15:53