後臺三層架構

後臺三層架構

所謂的三層開發就是將系統的整個業務應用劃分爲表示層、業務邏輯層、數據訪問層,這樣有利於系統的開發、維護、部署和擴展。數據庫

分層實現了「高內聚、低耦合」,採用「分而治之」的思想,把問題劃分開來解決,易於控制、延展,易於分配資源。express

第一層:表現層/表示層:負責直接跟用戶進行交互,通常是指系統的界面,用於數據錄入、數據顯示等。意味着只作與外觀顯示相關的工做,不屬於它的工做不用作。安全

第二層:業務層/服務層:用於作一些有效性驗證的工做,以更好地保證程序運行的健壯性。如完成數據添加、修改和查詢業務;不容許指定的文本框中輸入空字符串;數據格式是否正確及數據類型驗證;用戶權限的合法性判斷等。經過以上的諸多判斷以決定是否將操做繼續向後傳遞,儘可能保證程序的正常運行。文件名常含有service網絡

第三層:持久層/數據訪問層:顧名思義,就是用於專門跟數據庫進行交互,執行數據的添加、刪除、修改和顯示等。須要強調的是,全部的數據對象只在這一層被引用,如System.Data.SqlClient等,除數據層以外的任何地方都不該該出現這樣的引用。文件名常含有DAO(data access object)架構

1. 爲何使用三層架構分佈式

對於一個簡單的應用程序來講,在代碼量不是不少的狀況下,單層架構或二層架構開發徹底夠用,沒有必要將其複雜化,若是將一個複雜的大型系統設計爲單層架構或二層架構,這樣的設計則會存在很嚴重的缺陷。下面會具體介紹,分層開發實際上是爲大型系統服務的。ui

在開發過程當中出現類似的功能時,初級程序人員常常會複製代碼,那麼一樣的代碼爲何要寫那麼屢次?這樣不但使程序變得冗長,也不利於維護,一個小小的修改或許會涉及不少頁面,常常會致使異常的產生,使程序不能正常運行。最主要的是面向對象的思想沒有獲得絲毫的體現,打着面向對象的幌子卻依然走着面向過程的道路。設計

針對這樣的問題,初級程序人員應學會將程序中一些公用的處理程序寫成公共方法,封裝在類中,供其餘程序調用。例如寫一個數據操做類,對數據操做進行合理封裝。在數據庫操做過程當中,只要類中的相應方法(數據添加、修改、查詢等)能夠完成特定的數據操做,這就是數據訪問層,不用每次操做數據庫時都寫那些重複性的數據庫操做代碼。在新的應用開發中,數據訪問層能夠直接拿來用。面向對象的三大特性之一的封裝性在這裏獲得了很好的體現。採用面向對象的方法,可以使代碼量較之前有很大的減小,並且修改的時候也比較方便,實現了代碼的重用性。code

2. 使用三層架構開發的優勢router

從開發角度和應用角度來看,三層架構比二層架構或單層架構有更大的優點。三層架構適合團隊開發,每一個人能夠有不一樣的分工,協同工做能使效率倍增。開發二層或單層應用時,每一個開發人員都應對系統有較深的理解,對人員能力要求很高,而開發三層應用時,則能夠結合多方面的人才,只需少數人對系統有全面的瞭解便可,在必定程度上下降了開發的難度。

三層架構能夠更好地支持分佈式計算環境。邏輯層的應用程序能夠在多個機器上運行,充分利用網絡的計算功能。分佈式計算的潛力巨大,遠比升級CPU有效。美國人曾利用分佈式計算進行解密,幾個月就破解了據稱永遠都破解不了的密碼。

三層架構的最大優勢是它的安全性。用戶只能經過邏輯層來訪問數據層,減小了入口點,把不少危險的系統功能都屏蔽了。

示例:

表示層:

var express = require('express');
var router = express.Router();
var UserService = require("../service/UserService");

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});
router.get('/validate',function(req,res){
    var username = req.query.username;
    UserService.validate(username,function(data){
        if(data.length > 0){
            res.send("用戶名已存在");
        }else{
            res.send("用戶名可用");
        }
    });
});

業務層:

var UserDAO = require("../dao/UserDAO");
exports.validate = function(username,func){
    UserDAO.findByUsername(username,func);
}
exports.reg = function(username,pwd,func){
    UserDAO.insert(username,pwd,func);
}
exports.login = function(username,pwd,func){
    UserDAO.findByUsernameAndPwd(username,pwd,func);
}

持久層:

var db = require("./database");

exports.findByUsername = function(username,func){
    db.collection("users").find({username:username},func);
}
exports.findByUsernameAndPwd = function(username,pwd,func){
    db.collection("users").find({
        username:username,
        pwd:pwd
    },func);
}
exports.insert = function(username,pwd,func){
    db.collection("users").insert({
        username:username,
        pwd:pwd
    },func);
相關文章
相關標籤/搜索