亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于NodeJS的前后端分離的思考與實踐(三)輕量級的接口配置建模框架

2019-11-20 14:06:00
字體:
來源:轉載
供稿:網友

前言

使用Node做前后端分離的開發模式帶來了一些性能及開發流程上的優勢, 但同時也面臨不少挑戰。在淘寶復雜的業務及技術架構下,后端必須依賴Java搭建基礎架構,同時提供相關業務接口供前端使用。Node在整個環境中最重要的工作之一就是代理這些業務接口,以方便前端(Node端和瀏覽器端)整合數據做頁面渲染。如何做好代理工作,使得前后端開發分離之后,仍然可以在流程上無縫銜接,是我們需要考慮的問題。本文將就該問題做相關探討,并提出解決方案。

由于后端提供的接口方式可能多種多樣,同時開發人員在編寫Node端代碼訪問這些接口的方式也有可能多種多樣。如果我們在接口訪問方式及使用上不做統一架構處理,則會帶來以下一些問題:

1. 每一個開發人員使用各自的代碼風格編寫接口訪問代碼,造成工程目錄及編碼風格混亂,維護相對困難。
2. 每一個開發人員編寫自己的mock數據方式,開發完畢之后,需要手工修改代碼移除mock。
3. 每一個開發人員為了實現接口的不同環境切換(日常,預發,線上),可能各自維護了一些配置文件。
4. 數據接口調用方式無法被各個業務model非常方便地復用。
5. 對于數據接口的描述約定散落在代碼的各個角落,有可能跟后端人員約定的接口文檔不一致。
6. 整個項目分離開發之后,對于接口的聯調或者測試回歸成本依然很高,需要涉及到每一個接口提供者和使用者。
于是我們希望有這樣一個框架,通過該框架提供的機制去描述工程項目中依賴的所有外部接口,對他們進行統一管理,同時提供靈活的接口建模及調用方式,并且提供便捷的線上環境和生產環境切換方法,使前后端開發無縫結合。ModelProxy就是滿足這樣要求的輕量級框架,它是Midway Framework 核心構件之一,也可以單獨使用。使用ModelProxy可以帶來如下優點:

1. 不同的開發者對于接口訪問代碼編寫方式統一,含義清晰,降低維護難度。
2. 框架內部采用工廠+單例模式,實現接口一次配置多次復用。并且開發者可以隨意定制組裝自己的業務Model(依賴注入)。
3. 可以非常方便地實現線上,日常,預發環境的切換。
4. 內置river-mock和mockjs等mock引擎,提供mock數據非常方便。
5. 使用接口配置文件,對接口的依賴描述做統一的管理,避免散落在各個代碼之中。
6. 支持瀏覽器端共享Model,瀏覽器端可以使用它做前端數據渲染。整個代理過程對瀏覽器透明。
7. 接口配置文件本身是結構化的描述文檔,可以使用river工具集合,自動生成文檔。也可使用它做相關自動化接口測試,使整個開發過程形成一個閉環。

ModelProxy工作原理圖及相關開發過程圖覽

在上圖中,開發者首先需要將工程項目中所有依賴的后端接口描述,按照指定的json格式,寫入interface.json配置文件。必要時,需要對每個接口編寫一個規則文件,也即圖中interface rules部分。該規則文件用于在開發階段mock數據或者在聯調階段使用River工具集去驗證接口。規則文件的內容取決于采用哪一種mock引擎(比如 mockjs, river-mock 等等)。配置完成之后,即可在代碼中按照自己的需求創建自己的業務model。

下面是一個簡單的例子:

【例一】

第一步 在工程目錄中創建接口配置文件interface.json, 并在其中添加主搜接口json定義

復制代碼 代碼如下:

{
    "title": "pad淘寶項目數據接口集合定義",
    "version": "1.0.0",
    "engine": "mockjs",
    "rulebase": "./interfaceRules/",
    "status": "online",
    "interfaces": [ {
        "name": "主搜索接口",
        "id": "Search.getItems",
        "urls": {
            "online": "        }
    } ]
}

第二步 在代碼中創建并使用model

復制代碼 代碼如下:

// 引入模塊
var ModelProxy = require( 'modelproxy' );

// 全局初始化引入接口配置文件  (注意:初始化工作有且只有一次)
ModelProxy.init( './interface.json' );

// 創建model 更多創建模式請參后文
var searchModel = new ModelProxy( {
    searchItems: 'Search.getItems'  // 自定義方法名: 配置文件中的定義的接口ID
} );

// 使用model, 注意: 調用方法所需要的參數即為實際接口所需要的參數。
searchModel.searchItems( { q: 'iphone6' } )
    // !注意 必須調用 done 方法指定回調函數,來取得上面異步調用searchItems獲得的數據!
    .done( function( data ) {
        console.log( data );
    } )
    .error( function( err ) {
        console.log( err );
    } );

ModelProxy的功能豐富性在于它支持各種形式的profile以創建需要業務model:

使用接口ID創建>生成的對象會取ID最后'.'號后面的單詞作為方法名

復制代碼 代碼如下:

ModelProxy.create( 'Search.getItem' );

使用鍵值JSON對象>自定義方法名: 接口ID

復制代碼 代碼如下:

ModelProxy.create( {
    getName: 'Session.getUserName',
    getMyCarts: 'Cart.getCarts'
} );

使用數組形式>取最后 . 號后面的單詞作為方法名
下例中生成的方法調用名依次為: Cart_getItem, getItem, suggest, getName

復制代碼 代碼如下:

ModelProxy.create( [ 'Cart.getItem', 'Search.getItem', 'Search.suggest', 'Session.User.getName' ] );

前綴形式>所有滿足前綴的接口ID會被引入對象,并取其后半部分作為方法名

復制代碼 代碼如下:

ModelProxy.create( 'Search.*' );

同時,使用這些Model,你可以很輕易地實現合并請求或者依賴請求,并做相關模板渲染

【例二】 合并請求

復制代碼 代碼如下:

var model = new ModelProxy( 'Search.*' );

// 合并請求 (下面調用的model方法除done之外,皆為配置接口id時指定)
model.suggest( { q: '女' } )
    .list( { keyword: 'iphone6' } )
    .getNav( { key: '流行服裝' } )
    .done( function( data1, data2, data3 ) {
        // 參數順序與方法調用順序一致
        console.log( data1, data2, data3 );
    } );

【例三】 依賴請求

復制代碼 代碼如下:

var model = new ModelProxy( {
    getUser: 'Session.getUser',
    getMyOrderList: 'Order.getOrder'
} );
// 先獲得用戶id,然后再根據id號獲得訂單列表
model.getUser( { sid: 'fdkaldjfgsakls0322yf8' } )
    .done( function( data ) {
        var uid = data.uid;
        // 二次數據請求依賴第一次取得的id號
        this.getMyOrderList( { id: uid } )
            .done( function( data ) {
                console.log( data );
            } );
    } );

此外ModelProxy不僅在Node端可以使用,也可以在瀏覽器端使用。只需要在頁面中引入官方包提供的modelproxy-client.js即可。
【例四】瀏覽器端使用ModelProxy

復制代碼 代碼如下:

<!-- 引入modelproxy模塊,該模塊本身是由KISSY封裝的標準模塊-->
<script src="modelproxy-client.js" ></script>
<script type="text/javascript">
    KISSY.use( "modelproxy", function( S, ModelProxy ) {
        // !配置基礎路徑,該路徑與第二步中配置的攔截路徑一致!
        // 且全局配置有且只有一次!
        ModelProxy.configBase( '/model/' );

        // 創建model
        var searchModel = ModelProxy.create( 'Search.*' );
        searchModel
            .list( { q: 'ihpone6' } )
            .list( { q: '沖鋒衣' } )
            .suggest( { q: 'i' } )
            .getNav( { q: '滑板' } )
            .done( function( data1, data2, data3, data4 ) {
                console.log( {
                    "list_ihpone6": data1,
                    "list_沖鋒衣": data2,
                    "suggest_i": data3,
                    "getNav_滑板": data4
                } );
            } );
    } );
</script>

同時,ModelProxy可以配合Midway另一核心組件Midway-XTPL一起使用,實現數據和模板以及相關渲染過程在瀏覽器端和服務器端的全共享。關于ModelProxy的詳細教程及文檔請移步https://github.com/purejs/modelproxy

總結

ModelProxy以一種配置化的輕量級框架存在,提供友好的接口model組裝及使用方式,同時很好的解決前后端開發模式分離中的接口使用規范問題。在整個項目開發過程中,接口始終只需要定義描述一次,前端開發人員即可引用,同時使用River工具自動生成文檔,形成與后端開發人員的契約,并做相關自動化測試,極大地優化了整個軟件工程開發過程。

【注】River 是阿里集團研發的前后端統一接口規范及相關工具集合的統稱

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区久久| 国产精品劲爆视频| 国产精品www色诱视频| 国产精品视频一区二区三区四| 久久精视频免费在线久久完整在线看| 欧美性猛交xxxx乱大交蜜桃| 亚洲人成在线观| 国产精品九九久久久久久久| 中文字幕日韩高清| 亚洲最大的av网站| 日韩精品中文在线观看| 国产精品网站视频| 日韩资源在线观看| 日韩美女在线看| 欧美精品成人在线| 国产精品永久免费| 国产精品欧美激情在线播放| 日韩av最新在线观看| 琪琪第一精品导航| 在线播放亚洲激情| 久久久视频精品| 国产视频精品免费播放| 韩国精品久久久999| 国产精品九九九| 91精品91久久久久久| 国产精品白丝jk喷水视频一区| 欧美日产国产成人免费图片| 久久久亚洲欧洲日产国码aⅴ| 中国人与牲禽动交精品| 国产日韩欧美在线观看| 日韩欧美综合在线视频| 精品在线小视频| 欧美在线视频一区| 日本高清久久天堂| 欧美丰满少妇xxxxx| 成人网页在线免费观看| 精品在线观看国产| 日韩成人在线视频观看| 5566成人精品视频免费| 亚洲国产精品成人va在线观看| 中文字幕久热精品视频在线| 欧美一区深夜视频| 国外成人免费在线播放| 国产午夜精品全部视频播放| 久久全球大尺度高清视频| 最好看的2019的中文字幕视频| 亚洲性69xxxbbb| 国产精品久久久久久久av大片| 中文字幕成人精品久久不卡| 亚洲国产精品成人va在线观看| 亚洲美女中文字幕| 国产自摸综合网| 国产精品欧美激情在线播放| 欧美成人亚洲成人| 国产剧情日韩欧美| 日韩中文在线观看| 国产精品久久久久久搜索| 亚洲黄色成人网| 午夜精品久久久久久久99热浪潮| 欧美又大粗又爽又黄大片视频| 国产精品美腿一区在线看| 疯狂欧美牲乱大交777| 久久久噜噜噜久久久| 久久久国产精彩视频美女艺术照福利| 欧美激情亚洲视频| 亚洲一区999| 久久精品国产99国产精品澳门| 黄色91在线观看| 高清欧美性猛交xxxx| 日韩精品极品在线观看播放免费视频| 中文字幕亚洲色图| 国产精品久久久久久婷婷天堂| 成人av色在线观看| 欧美黄色片在线观看| 亚洲国产小视频在线观看| 国产亚洲欧洲高清一区| 中文字幕亚洲第一| 亚洲免费成人av电影| 青草青草久热精品视频在线观看| 国产精品久久久久久久av电影| 一级做a爰片久久毛片美女图片| 亚洲电影免费观看高清完整版在线| 久久夜色精品亚洲噜噜国产mv| 欧美国产在线视频| 欧美成人午夜免费视在线看片| 欧美中文字幕视频在线观看| 高清一区二区三区日本久| 国产精品视频最多的网站| 久久久久国产视频| 欧美性受xxxx黑人猛交| 国产精品久久久久久久久久99| 欧美性20hd另类| 91免费福利视频| 97久久超碰福利国产精品…| 国产精品1区2区在线观看| 亚洲欧美日韩成人| 久久福利网址导航| 久久成年人免费电影| 国产精品av电影| 国产精品观看在线亚洲人成网| 亚洲精品一区二区三区婷婷月| 欧美日韩国产成人| 国产日韩欧美在线| 欧美性受xxxx白人性爽| 91久久精品国产91久久性色| 国产精品igao视频| 国产精品久久久999| 色综合视频一区中文字幕| 日韩最新免费不卡| 欧美激情精品久久久久久变态| 亚洲欧美制服丝袜| 中文字幕不卡av| 人人做人人澡人人爽欧美| 久久综合亚洲社区| 国产日韩在线看片| 91大神福利视频在线| 色老头一区二区三区在线观看| 91性高湖久久久久久久久_久久99| 日本一区二区在线播放| 97香蕉超级碰碰久久免费软件| 日韩欧美亚洲范冰冰与中字| 亚洲乱码国产乱码精品精天堂| 国产精品亚发布| 亚洲精品v天堂中文字幕| 欧美在线视频免费播放| 亚洲免费成人av电影| 亚洲最大激情中文字幕| 久久视频在线播放| 国产精品欧美风情| 日韩中文字幕在线| 国产午夜精品免费一区二区三区| 国产日韩精品电影| 国产精品尤物福利片在线观看| 欧美一级黄色网| 亚洲电影在线看| 久久人人爽亚洲精品天堂| 成人激情在线播放| 亚洲性xxxx| 欧美日韩国产影院| 国产日韩在线精品av| 国产精品久久久久久久久借妻| 最近2019中文字幕mv免费看| 激情懂色av一区av二区av| 日韩hd视频在线观看| 成人午夜激情网| 国产69精品久久久久久| 91色视频在线观看| 日韩高清电影好看的电视剧电影| 亚洲国产精品字幕| 国产精品日日做人人爱| 亚洲一区二区久久| 777777777亚洲妇女| 欧美精品一区在线播放| 欧美福利视频在线观看| 久久久精品影院| 国产精品99一区| 亚洲国产精品系列| 中文字幕亚洲欧美在线| 欧美大片免费观看在线观看网站推荐| 亚洲天堂色网站| 91欧美视频网站| 亚洲天堂av综合网| 欧美性极品xxxx做受| 狠狠躁夜夜躁人人爽天天天天97|