成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

重構(gòu) - 設(shè)計(jì)API的擴(kuò)展機(jī)制

Lowky / 3130人閱讀

1.前言

上篇文章,主要介紹了重構(gòu)的一些概念和一些簡(jiǎn)單的實(shí)例。這一次,詳細(xì)的說(shuō)下項(xiàng)目中的一個(gè)重構(gòu)場(chǎng)景--給API設(shè)計(jì)擴(kuò)展機(jī)制。目的就是為了方便以后能靈活應(yīng)對(duì)需求的改變。當(dāng)然了,是否需要設(shè)計(jì)擴(kuò)展性這個(gè)要看API的需求。如果大家有什么建議,歡迎評(píng)論留言。

2.擴(kuò)展性表現(xiàn)形式 2-1.prototype

這個(gè)可以說(shuō)是JS里面最原的一個(gè)擴(kuò)展。比如原生JS沒(méi)有提供打亂數(shù)組順序的API,但是開(kāi)發(fā)者又想方便使用,這樣的話,就只能擴(kuò)展數(shù)組的prototype。代碼如下

//擴(kuò)展Array.prototype,增加打亂數(shù)組的方法。
Array.prototype.upset=function(){
    return this.sort((n1,n2)=>Math.random() - 0.5);
}

let arr=[1,2,3,4,5];
//調(diào)用
arr.upset();
//顯示結(jié)果
console.log(arr);

運(yùn)行結(jié)果

功能是實(shí)現(xiàn)了。但是上面的代碼,只想借用例子講解擴(kuò)展性,大家看下就好。不要模仿,也不要在項(xiàng)目這樣寫(xiě)?,F(xiàn)在基本都禁止這樣開(kāi)發(fā)了。理由也很簡(jiǎn)單,之前的文章也有提到過(guò)。這里重復(fù)一下。

這樣就污染了原生對(duì)象Array,別人創(chuàng)建的Array也會(huì)被污染,造成不必要的開(kāi)銷。最可怕的是,萬(wàn)一自己命名的跟原生的方法重名了,就被覆蓋原來(lái)的方法了。

Array.prototype.push=function(){console.log("守候")}  
let arrTest=[123]
arrTest.push()
//result:守候
//push方法有什么作用,大家應(yīng)該知道,不知道的可以去w3c看下

2-2.jQuery

關(guān)于 jQuery 的擴(kuò)展性,分別提供了三個(gè)API:$.extend()、$.fn和$.fn.extend()。分別對(duì)jQuery的本身,靜態(tài)方法,原型對(duì)象進(jìn)行擴(kuò)展,基于jQuery寫(xiě)插件的時(shí)候,最離不開(kāi)的應(yīng)該就是$.fn.extend()。

參考鏈接:

理解jquery的$.extend()、$.fn和$.fn.extend()
Jquery自定義插件之$.extend()、$.fn和$.fn.extend()

2-3.VUE

對(duì)VUE進(jìn)行擴(kuò)展,引用官網(wǎng)(插件)的說(shuō)法,擴(kuò)展的方式一般有以下幾種:

1.添加全局方法或者屬性,如: vue-custom-element

2.添加全局資源:指令/過(guò)濾器/過(guò)渡等,如 vue-touch

3.通過(guò)全局 mixin 方法添加一些組件選項(xiàng),如: vue-router

4.添加 Vue 實(shí)例方法,通過(guò)把它們添加到 Vue.prototype 上實(shí)現(xiàn)。

5.一個(gè)庫(kù),提供自己的 API,同時(shí)提供上面提到的一個(gè)或多個(gè)功能,如 vue-router

基于VUE的擴(kuò)展。在組件,插件的內(nèi)容提供一個(gè)install方法。如下

使用組件

上面幾個(gè)擴(kuò)展性的實(shí)例分別是原生對(duì)象,庫(kù),框架的擴(kuò)展,大家可能覺(jué)得有點(diǎn)夸夸而談,那下面就分享一個(gè)日常開(kāi)發(fā)常用的一個(gè)實(shí)例。
3.實(shí)例-表單驗(yàn)證

看了上面那些擴(kuò)展性的實(shí)例,下面看下一個(gè)在日常開(kāi)發(fā)使用得也很多的一個(gè)實(shí)例:表單驗(yàn)證。這塊可以說(shuō)很簡(jiǎn)單,但是做好,做通用不簡(jiǎn)單??戳恕禞avaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》,用策略模式對(duì)以前的表單驗(yàn)證函數(shù)進(jìn)行了一個(gè)重構(gòu)。下面進(jìn)行一個(gè)簡(jiǎn)單的分析。

下面的內(nèi)容,代碼會(huì)偏多,雖然代碼不難,但還是強(qiáng)烈建議大家不要只看,要邊看,邊寫(xiě),邊調(diào)試,不然作為讀者,很可能不知道我的代碼是什么意思,很容易懵。下面的代碼回涉兩個(gè)知識(shí):開(kāi)放-封閉原則和策略模式,大家可以自行了解。
3-1.原來(lái)方案
/**
 * @description 字段檢驗(yàn)
 * @param checkArr
 * @returns {boolean}
 */
function validateForm(checkArr){
    let _reg = null, ruleMsg, nullMsg, lenMsg;
    for (let i = 0, len = checkArr.length; i < len; i++) {
        //如果沒(méi)字段值是undefined,不再執(zhí)行當(dāng)前循環(huán),執(zhí)行下一次循環(huán)
        if (checkArr[i].el === undefined) {
            continue;
        }
        //設(shè)置規(guī)則錯(cuò)誤提示信息
        ruleMsg = checkArr[i].msg || "字段格式錯(cuò)誤";
        //設(shè)置值為空則錯(cuò)誤提示信息
        nullMsg = checkArr[i].nullMsg || "字段不能為空";
        //設(shè)置長(zhǎng)度錯(cuò)誤提示信息
        lenMsg = checkArr[i].lenMsg || "字段長(zhǎng)度范圍" + checkArr[i].minLength + "至" + checkArr[i].maxLength;
        //如果該字段有空值校驗(yàn)
        if (checkArr[i].noNull === true) {
            //如果字段為空,返回結(jié)果又提示信息
            if (checkArr[i].el === "" || checkArr[i].el === null) {
                return nullMsg;
            }
        }
        //如果有該字段有規(guī)則校驗(yàn)
        if (checkArr[i].rule) {
            //設(shè)置規(guī)則
            switch (checkArr[i].rule) {
                case "mobile":
                    _reg = /^1[3|4|5|7|8][0-9]d{8}$/;
                    break;
                case "tel":
                    _reg = /^d{3}-d{8}|d{4}-d{7}|d{11}$/;
                    break;
            }
            //如果字段不為空,并且規(guī)則錯(cuò)誤,返回錯(cuò)誤信息
            if (!_reg.test(checkArr[i].el) && checkArr[i].el !== "" && checkArr[i].el !== null) {
                return ruleMsg;
            }
        }
        //如果字段不為空并且長(zhǎng)度錯(cuò)誤,返回錯(cuò)誤信息
        if (checkArr[i].el !== null && checkArr[i].el !== "" && (checkArr[i].minLength || checkArr[i].maxLength)) {
            if (checkArr[i].el.toString().length < checkArr[i].minLength || checkArr[i].el.toString().length > checkArr[i].maxLength) {
                return lenMsg;
            }
        }
    }
    return false;
}

函數(shù)調(diào)用方式

    let testData={
        phone:"18819323632",
        pwd:"112"
    }

    let _tips = validateForm([
        {el: testData.phone, noNull: true, nullMsg: "電話號(hào)碼不能為空",rule: "mobile", msg: "電話號(hào)碼格式錯(cuò)誤"},
        {el: testData.pwd, noNull: true, nullMsg: "密碼不能為空",lenMsg:"密碼長(zhǎng)度不正確",minLength:6,maxLength:18}
    ]);
    //字段驗(yàn)證如果返回錯(cuò)誤信息
    if (_tips) {
        alert(_tips);
    }
3-2.存在問(wèn)題

這樣方法,相信大家看的也難受,因?yàn)閱?wèn)題確實(shí)是比較多。

1.一個(gè)字段進(jìn)入,可能要經(jīng)過(guò)三種判斷(空值,規(guī)則,長(zhǎng)度)。如果只是一個(gè)簡(jiǎn)單的電話號(hào)碼規(guī)則校驗(yàn),就要經(jīng)過(guò)其他兩種沒(méi)必要的校驗(yàn),造成不必要的開(kāi)銷。運(yùn)行的流程就如同下面。

2.規(guī)則校驗(yàn)里面,只有這幾種校驗(yàn),如果要增加其他校驗(yàn),比如增加一個(gè)日期的規(guī)則,無(wú)法完成。如果一直修改源碼,可能會(huì)導(dǎo)致函數(shù)巨大。

3.寫(xiě)法不優(yōu)雅,調(diào)用也不方便。

3-3.代替方案

針對(duì)上面2-2的三個(gè)問(wèn)題,逐個(gè)進(jìn)行改善。

因?yàn)檎{(diào)用方式就不方便,很難在不改變validateForm調(diào)用方式的同時(shí),優(yōu)化重構(gòu)內(nèi)部的代碼,又增加擴(kuò)展性。重寫(xiě)這個(gè)方法又不可能,因?yàn)橛袀€(gè)別的地方已經(jīng)使用了這個(gè)API,自己一個(gè)一個(gè)的改不現(xiàn)實(shí),所以就不修改這個(gè)validateForm,新建一個(gè)新的API:validate。在以后的項(xiàng)目上,也盡量引導(dǎo)同事放棄validateForm,使用新的API。

上面第一個(gè),優(yōu)化校驗(yàn)規(guī)則,每次校驗(yàn)(比如空值,長(zhǎng)度,規(guī)則),都是一個(gè)簡(jiǎn)單的校驗(yàn),不再執(zhí)行其他沒(méi)必要的校驗(yàn)。運(yùn)行流程如同下面。

let validate = function (arr) {
    let ruleData = {
        /**
         * @description 不能為空
         * @param val
         * @param msg
         * @return {*}
         */
        isNoNull(val, msg){
            if (!val) {
                return msg
            }
        },
        /**
         * @description 最小長(zhǎng)度
         * @param val
         * @param length
         * @param msg
         * @return {*}
         */
        minLength(val, length, msg){
            if (val.toString().length < length) {
                return msg
            }
        },
        /**
         * @description 最大長(zhǎng)度
         * @param val
         * @param length
         * @param msg
         * @return {*}
         */
        maxLength(val, length, msg){
            if (val.toString().length > length) {
                return msg
            }
        },
        /**
         * @description 是否是手機(jī)號(hào)碼格式
         * @param val
         * @param msg
         * @return {*}
         */
        isMobile(val, msg){
            if (!/^1[3-9]d{9}$/.test(val)) {
                return msg
            }
        }
    }
    let ruleMsg, checkRule, _rule;
    for (let i = 0, len = arr.length; i < len; i++) {
        //如果字段找不到
        if (arr[i].el === undefined) {
            return "字段找不到!"
        }
        //遍歷規(guī)則
        for (let j = 0; j < arr[i].rules.length; j++) {
            //提取規(guī)則
            checkRule = arr[i].rules[j].rule.split(":");
            _rule = checkRule.shift();
            checkRule.unshift(arr[i].el);
            checkRule.push(arr[i].rules[j].msg);
            //如果規(guī)則錯(cuò)誤
            ruleMsg = ruleData[_rule].apply(null, checkRule);
            if (ruleMsg) {
                //返回錯(cuò)誤信息
                return ruleMsg;
            }
        }
    }
};
let testData = {
    name: "",
    phone: "18819522663",
    pw: "asda"
}
//校驗(yàn)函數(shù)調(diào)用
console.log(validate([
    {
        //校驗(yàn)的數(shù)據(jù)
        el: testData.phone,
        //校驗(yàn)的規(guī)則
        rules: [
            {rule: "isNoNull", msg: "電話不能為空"}, {rule: "isMobile", msg: "手機(jī)號(hào)碼格式不正確"}
        ]
    },
    {
        el: testData.pw,
        rules: [
            {rule: "isNoNull", msg: "電話不能為空"},
            {rule:"minLength:6",msg:"密碼長(zhǎng)度不能小于6"}
        ]
    }
]));

如果又有其它的規(guī)則,又得改這個(gè),這樣就違反了開(kāi)放-封閉原則。如果多人共用這個(gè)函數(shù),規(guī)則可能會(huì)很多,ruleData會(huì)變的巨大,造成不必要的開(kāi)銷。比如A頁(yè)面有金額的校驗(yàn),但是只有A頁(yè)面有。如果按照上面的方式改,在B頁(yè)面也會(huì)加載金額的校驗(yàn)規(guī)則,但是根本不會(huì)用上,造成資源浪費(fèi)。

所以下面應(yīng)用開(kāi)放-封閉原則。給函數(shù)的校驗(yàn)規(guī)則增加擴(kuò)展性。在實(shí)操之前,大家應(yīng)該會(huì)懵,因?yàn)橐粋€(gè)函數(shù),可以進(jìn)行校驗(yàn)的操作,又有增加校驗(yàn)規(guī)則的操作。一個(gè)函數(shù)做兩件事,就違反了單一原則。到時(shí)候也難維護(hù),所以推薦的做法就是分接口做。如下寫(xiě)法。

let validate = (function () {
    let ruleData = {
        /**
         * @description 不能為空
         * @param val
         * @param msg
         * @return {*}
         */
        isNoNull(val, msg){
            if (!val) {
                return msg
            }
        },
        /**
         * @description 最小長(zhǎng)度
         * @param val
         * @param length
         * @param msg
         * @return {*}
         */
        minLength(val, length, msg){
            if (val.toString().length < length) {
                return msg
            }
        },
        /**
         * @description 最大長(zhǎng)度
         * @param val
         * @param length
         * @param msg
         * @return {*}
         */
        maxLength(val, length, msg){
            if (val.toString().length > length) {
                return msg
            }
        },
        /**
         * @description 是否是手機(jī)號(hào)碼格式
         * @param val
         * @param msg
         * @return {*}
         */
        isMobile(val, msg){
            if (!/^1[3-9]d{9}$/.test(val)) {
                return msg
            }
        }
    }
    return {
        /**
         * @description 查詢接口
         * @param arr
         * @return {*}
         */
        check: function (arr) {
            let ruleMsg, checkRule, _rule;
            for (let i = 0, len = arr.length; i < len; i++) {
                //如果字段找不到
                if (arr[i].el === undefined) {
                    return "字段找不到!"
                }
                //遍歷規(guī)則
                for (let j = 0; j < arr[i].rules.length; j++) {
                    //提取規(guī)則
                    checkRule = arr[i].rules[j].rule.split(":");
                    _rule = checkRule.shift();
                    checkRule.unshift(arr[i].el);
                    checkRule.push(arr[i].rules[j].msg);
                    //如果規(guī)則錯(cuò)誤
                    ruleMsg = ruleData[_rule].apply(null, checkRule);
                    if (ruleMsg) {
                        //返回錯(cuò)誤信息
                        return ruleMsg;
                    }
                }
            }
        },
        /**
         * @description 添加規(guī)則接口
         * @param type
         * @param fn
         */
        addRule:function (type,fn) {
            ruleData[type]=fn;
        }
    }
})();
//校驗(yàn)函數(shù)調(diào)用-測(cè)試用例
console.log(validate.check([
    {
        //校驗(yàn)的數(shù)據(jù)
        el: testData.mobile,
        //校驗(yàn)的規(guī)則
        rules: [
            {rule: "isNoNull", msg: "電話不能為空"}, {rule: "isMobile", msg: "手機(jī)號(hào)碼格式不正確"}
        ]
    },
    {
        el: testData.password,
        rules: [
            {rule: "isNoNull", msg: "電話不能為空"},
            {rule:"minLength:6",msg:"密碼長(zhǎng)度不能小于6"}
        ]
    }
]));
//擴(kuò)展-添加日期范圍校驗(yàn)
validate.addRule("isDateRank",function (val,msg) {
    if(new Date(val[0]).getTime()>=new Date(val[1]).getTime()){
        return msg;
    }
});
//測(cè)試新添加的規(guī)則-日期范圍校驗(yàn)
console.log(validate.check([
    {
        el:["2017-8-9 22:00:00","2017-8-8 24:00:00"],
        rules:[{
            rule:"isDateRank",msg:"日期范圍不正確"
        }]
    }
    
]));

如上代碼所示,這里需要往ruleData添加日期范圍的校驗(yàn),這里可以添加。但是不能訪問(wèn)和修改ruleData的東西,有一個(gè)保護(hù)的作用。還有一個(gè)就是,比如在A頁(yè)面添加日期的校驗(yàn),只在A頁(yè)面存在,不會(huì)影響其它頁(yè)面。如果日期的校驗(yàn)在其它地方都可能用上,就可以考慮,在全局里面為ruleData添加日期的校驗(yàn)的規(guī)則。

至于第三個(gè)問(wèn)題,這樣的想法,可能不算太優(yōu)雅,調(diào)用也不是太方便,但是就我現(xiàn)在能想到的,這個(gè)就是最好方案啊了。

這個(gè)看似是已經(jīng)做完了,但是大家可能覺(jué)得有一種情況沒(méi)能應(yīng)對(duì),比如下面這種,做不到。

因?yàn)樯厦娴腸heck接口,只要有一個(gè)錯(cuò)誤了,就立馬跳出了,不會(huì)校驗(yàn)下一個(gè)。如果要實(shí)現(xiàn)下面的功能,就得實(shí)現(xiàn),如果有一個(gè)值校驗(yàn)錯(cuò)誤,就記錄錯(cuò)誤信息,繼續(xù)校驗(yàn)下一個(gè),等到所有的校驗(yàn)都執(zhí)行完了之后,如下面的流程圖。

代碼上面(大家先忽略alias這個(gè)屬性)

let validate= (function () {
    let ruleData = {
        /**
         * @description 不能為空
         * @param val
         * @param msg
         * @return {*}
         */
        isNoNull(val, msg){
            if (!val) {
                return msg
            }
        },
        /**
         * @description 最小長(zhǎng)度
         * @param val
         * @param length
         * @param msg
         * @return {*}
         */
        minLength(val, length, msg){
            if (val.toString().length < length) {
                return msg
            }
        },
        /**
         * @description 最大長(zhǎng)度
         * @param val
         * @param length
         * @param msg
         * @return {*}
         */
        maxLength(val, length, msg){
            if (val.toString().length > length) {
                return msg
            }
        },
        /**
         * @description 是否是手機(jī)號(hào)碼格式
         * @param val
         * @param msg
         * @return {*}
         */
        isMobile(val, msg){
            if (!/^1[3-9]d{9}$/.test(val)) {
                return msg
            }
        }
    }
    return {
        check: function (arr) {
            //代碼不重復(fù)展示,上面一部分
        },
        addRule:function (type,fn) {
            //代碼不重復(fù)展示,上面一部分
        },
        /**
         * @description 校驗(yàn)所有接口
         * @param arr
         * @return {*}
         */
        checkAll: function (arr) {
            let ruleMsg, checkRule, _rule,msgArr=[];
            for (let i = 0, len = arr.length; i < len; i++) {
                //如果字段找不到
                if (arr[i].el === undefined) {
                    return "字段找不到!"
                }
                //如果字段為空以及規(guī)則不是校驗(yàn)空的規(guī)則

                //遍歷規(guī)則
                for (let j = 0; j < arr[i].rules.length; j++) {
                    //提取規(guī)則
                    checkRule = arr[i].rules[j].rule.split(":");
                    _rule = checkRule.shift();
                    checkRule.unshift(arr[i].el);
                    checkRule.push(arr[i].rules[j].msg);
                    //如果規(guī)則錯(cuò)誤
                    ruleMsg = ruleData[_rule].apply(null, checkRule);
                    if (ruleMsg) {
                        //記錄錯(cuò)誤信息
                        msgArr.push({
                            el:arr[i].el,
                            alias:arr[i].alias,
                            rules:_rule,
                            msg:ruleMsg
                        });
                    }
                }
            }
            //返回錯(cuò)誤信息
            return msgArr.length>0?msgArr:false;
        }
    }
})();
let testData = {
    name: "",
    phone: "188",
    pw: "asda"
}
//擴(kuò)展-添加日期范圍校驗(yàn)
validate.addRule("isDateRank",function (val,msg) {
    if(new Date(val[0]).getTime()>=new Date(val[1]).getTime()){
        return msg;
    }
});
//校驗(yàn)函數(shù)調(diào)用
console.log(validate.checkAll([
    {
        //校驗(yàn)的數(shù)據(jù)
        el: testData.phone,
        alias:"mobile",
        //校驗(yàn)的規(guī)則
        rules: [
            {rule: "isNoNull", msg: "電話不能為空"}, {rule: "isMobile", msg: "手機(jī)號(hào)碼格式不正確"},{rule:"minLength:6",msg: "手機(jī)號(hào)碼不能少于6"}
        ]
    },
    {
        el: testData.pw,
        alias:"pwd",
        rules: [
            {rule: "isNoNull", msg: "電話不能為空"},
            {rule:"minLength:6",msg:"密碼長(zhǎng)度不能小于6"}
        ]
    },
    {
        el:["2017-8-9 22:00:00","2017-8-8 24:00:00"],
        rules:[{
            rule:"isDateRank",msg:"日期范圍不正確"
        }]
    }
]));

看到結(jié)果,現(xiàn)在所有的不合法的數(shù)據(jù)的記錄都返回回來(lái)了。至于當(dāng)時(shí)alias現(xiàn)在揭曉用處。
比如頁(yè)面是vue渲染的,根據(jù)alias可以這樣處理。

如果是jQuery渲染的,根據(jù)alias可以這樣處理。

3-4.向下兼容方案

因?yàn)轫?xiàng)目之前有使用了以前的校驗(yàn)API,不能一道切,在以前的API沒(méi)廢棄之前,不能影響之前的使用。所以要重寫(xiě)以前的validateForm,使之兼容現(xiàn)在的新API:validate。

    let validateForm=function (arr) {
        let _param=[],_single={};
        for(let i=0;i
4.小結(jié)

今天的例子就到這里了,這個(gè)例子,無(wú)非就是給API增加擴(kuò)展性。這個(gè)例子比較簡(jiǎn)單,不算難。大家用這個(gè)代碼在瀏覽器上運(yùn)行,就很好理解。如果大家對(duì)這個(gè)例子有什么更好的建議,或者代碼上有什么問(wèn)題,歡迎在評(píng)論區(qū)留言,大家多交流,相互學(xué)習(xí)。

-------------------------華麗的分割線--------------------

想了解更多,關(guān)注關(guān)注我的微信公眾號(hào):守候書(shū)閣

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94783.html

相關(guān)文章

  • 容器和應(yīng)用程序:擴(kuò)展、重構(gòu)或重建?

    摘要:綜上所述,為使傳統(tǒng)應(yīng)用程序容器化,有以下幾種路徑擴(kuò)展重構(gòu)或者重建。在中運(yùn)行應(yīng)用程序的最大障礙之一是臨時(shí)文件系統(tǒng)。大體來(lái)說(shuō),利用容器技術(shù)實(shí)現(xiàn)傳統(tǒng)應(yīng)用程序的現(xiàn)代化并沒(méi)有硬性規(guī)則。 技術(shù)領(lǐng)域是不斷變化的,因此,任何應(yīng)用程序都可能在很短時(shí)間內(nèi)面臨過(guò)時(shí)甚至淘汰,更新?lián)Q代的速度之快給人的感覺(jué)越來(lái)越強(qiáng)烈,我們?nèi)绾问箓鹘y(tǒng)應(yīng)用程序保持活力不落伍?工程師想的可能是從頭開(kāi)始重建傳統(tǒng)應(yīng)用程序,這與公司的業(yè)務(wù)目...

    tigerZH 評(píng)論0 收藏0
  • 微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(一)

    摘要:微服務(wù)集成服務(wù)間通信微服務(wù)架構(gòu)下,應(yīng)用的服務(wù)直接相互獨(dú)立。微服務(wù)架構(gòu)傾向于降低中心消息總線類似于的依賴,將業(yè)務(wù)邏輯分布在每個(gè)具體的服務(wù)終端。 引言:微服務(wù)是當(dāng)前軟件架構(gòu)領(lǐng)域非常熱門(mén)的詞匯,能找到很多關(guān)于微服務(wù)的定義、準(zhǔn)則,以及如何從微服務(wù)中獲益的文章,在企業(yè)的實(shí)踐中去應(yīng)用微服務(wù)的資源卻很少。本篇文章中,會(huì)介紹微服務(wù)架構(gòu)(Microservices Architecture)的基礎(chǔ)概念,...

    libin19890520 評(píng)論0 收藏0
  • 微服務(wù)實(shí)戰(zhàn):從架構(gòu)到發(fā)布(一)

    摘要:微服務(wù)集成服務(wù)間通信微服務(wù)架構(gòu)下,應(yīng)用的服務(wù)直接相互獨(dú)立。微服務(wù)架構(gòu)傾向于降低中心消息總線類似于的依賴,將業(yè)務(wù)邏輯分布在每個(gè)具體的服務(wù)終端。 引言:微服務(wù)是當(dāng)前軟件架構(gòu)領(lǐng)域非常熱門(mén)的詞匯,能找到很多關(guān)于微服務(wù)的定義、準(zhǔn)則,以及如何從微服務(wù)中獲益的文章,在企業(yè)的實(shí)踐中去應(yīng)用微服務(wù)的資源卻很少。本篇文章中,會(huì)介紹微服務(wù)架構(gòu)(Microservices Architecture)的基礎(chǔ)概念,...

    HtmlCssJs 評(píng)論0 收藏0
  • 一文讀懂微服務(wù)架構(gòu)重構(gòu)策略

    摘要:相反,它由單體中的適配器和使用一個(gè)或多個(gè)進(jìn)程間通信機(jī)制的服務(wù)組成。因?yàn)槲⒎?wù)架構(gòu)的本質(zhì)是一組圍繞業(yè)務(wù)功能組織的松耦合服務(wù)。如果你嘗試將此類功能實(shí)現(xiàn)為服務(wù),則通常會(huì)發(fā)現(xiàn),由于過(guò)多的進(jìn)程間通信而導(dǎo)致性能下降。這是快速展示微服務(wù)架構(gòu)價(jià)值的好方法。你很有可能正在處理大型復(fù)雜的單體應(yīng)用程序,每天開(kāi)發(fā)和部署應(yīng)用程序的經(jīng)歷都很緩慢而且很痛苦。微服務(wù)看起來(lái)非常適合你的應(yīng)用程序,但它也更像是一項(xiàng)遙不可及的必殺...

    jaysun 評(píng)論0 收藏0
  • KubernetesDevice Plugin設(shè)計(jì)解讀

    摘要:摘要的生態(tài)地位已經(jīng)確立,可擴(kuò)展性將是其發(fā)力的主戰(zhàn)場(chǎng)。該功能由于只是替代了做了些更名的工作,所以在已經(jīng)是穩(wěn)定的狀態(tài)了。異構(gòu)計(jì)算作為非常重要的新戰(zhàn)場(chǎng),非常重視。而異構(gòu)計(jì)算需要強(qiáng)大的計(jì)算力和高性能網(wǎng)絡(luò),需要提供一種統(tǒng)一的方式與等高性能硬件集成。 摘要: Kubernetes的生態(tài)地位已經(jīng)確立,可擴(kuò)展性將是其發(fā)力的主戰(zhàn)場(chǎng)。異構(gòu)計(jì)算作為非常重要的新戰(zhàn)場(chǎng),Kubernetes非常重視。而異構(gòu)計(jì)算需...

    bladefury 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<