久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實戰(zhàn)洞察。

適配器模式實戰(zhàn):隔離第三方接口變化,防止代碼腐化

適配器模式實戰(zhàn):隔離第三方接口變化,防止代碼腐化 先說一個我自己的感受大部分代碼腐化不是從業(yè)務(wù)邏輯開始的而是從“依賴了一個不該依賴的外部接口”開始的。很多時候我們寫功能特別順手直接調(diào)第三方SDK、老系統(tǒng)接口、或者另一個團(tuán)隊的服務(wù)參數(shù)照著文檔填異常隨手拋字段直接用跑起來沒問題就算完事。直到某一天外部服務(wù)升級協(xié)議、換了返回結(jié)構(gòu)、或者干脆下線舊接口你才發(fā)現(xiàn)自己系統(tǒng)里有幾十處調(diào)用在跟著改而且每一處都改得提心吊膽。適配器模式要解決的核心問題就是把這種“變化”隔離在系統(tǒng)邊界之外。它的思想很簡單讓業(yè)務(wù)代碼只依賴自己定義的穩(wěn)定接口而把所有外部的東西塞進(jìn)一個適配層里由適配層去消化變化、翻譯差異、轉(zhuǎn)換模型。這篇文章我不會從類圖開始講因為講類圖的資料已經(jīng)夠多了。我想結(jié)合這些年做接口對接、老系統(tǒng)改造的真實經(jīng)驗把適配器到底隔離什么、為什么值得用、怎么一步步落地以及最容易把自己繞進(jìn)去的幾個坑全部攤開說清楚。適合正在接第三方服務(wù)的開發(fā)適合在維護(hù)老系統(tǒng)的團(tuán)隊也適合做設(shè)計決策時擔(dān)心“改一處炸一片”的架構(gòu)師參考。1. 先弄明白“變化”是什么適配器才不是空談1.1 適配器真正在處理的三種變化很多講適配器模式的文章一上來就畫三個類名然后說“這就是適配器”但看完你會發(fā)現(xiàn)還是不知道在項目里哪里該用。問題就出在沒有先回答一個更根本的問題適配器到底在隔離什么“變化”根據(jù)我自己的項目經(jīng)驗它要處理的“變化”主要有三類。第一類是外部依賴自身的演進(jìn)。第三方服務(wù)升級版本、調(diào)整參數(shù)名、增加鑒權(quán)方式、甚至直接下線某個老接口這些都不是你能控制的。你唯一能控制的是自己系統(tǒng)內(nèi)部的改動范圍。如果沒有適配層這種變化就會順著調(diào)用鏈一路傳染到所有業(yè)務(wù)模塊里。第二類是同類外部服務(wù)之間的差異。比如你接了兩家云存儲、兩個短信服務(wù)商或者多個支付渠道。它們做的是同一類事情但API風(fēng)格、數(shù)據(jù)結(jié)構(gòu)、鑒權(quán)方式、錯誤碼體系統(tǒng)統(tǒng)不一樣。適配器在這里的角色像是把“各國插座標(biāo)準(zhǔn)”統(tǒng)一成“我們內(nèi)部的插頭規(guī)格”讓上層代碼看到的永遠(yuǎn)是同一個樣子。第三類是外部模型和內(nèi)部模型之間的差異。外部SDK可能用“分”做金額單位業(yè)務(wù)系統(tǒng)用“元”外部狀態(tài)碼是“0成功、1失敗、2處理中”業(yè)務(wù)系統(tǒng)理解的是“SUCCESS、FAILED、PROCESSING”外部訂單號帶有廠商前綴而內(nèi)部訂單號有自己的長度限制。這些差異看著小但如果散落在每個調(diào)用點每次轉(zhuǎn)換都可能出錯。適配器模式之所以叫“適配器”就是因為它專門用來解決“接口形態(tài)不匹配”的問題。它不去改變外部系統(tǒng)的行為也不改變自己系統(tǒng)的業(yè)務(wù)規(guī)則它在中間做翻譯兩邊都保持原樣。這和一個電源轉(zhuǎn)換頭的邏輯完全一樣——墻上的插座不會變你的設(shè)備插頭也不會變中間加一個轉(zhuǎn)接頭就都能用了。1.2 適配器模式的結(jié)構(gòu)一句話說清楚適配器的標(biāo)準(zhǔn)結(jié)構(gòu)里有四個角色但真正理解它只需要抓住一句話調(diào)用方依賴自己的端口接口適配器負(fù)責(zé)把外部接口嫁接到這個端口上。Target也就是端口Port是調(diào)用方真正依賴的抽象接口由你系統(tǒng)內(nèi)部定義語義也必須由你來定。比如PaymentPort。Adaptee被適配的現(xiàn)有對象可能是第三方SDK、遺留系統(tǒng)的遠(yuǎn)程接口、或者另一個服務(wù)暴露的API。Adapter適配器本體實現(xiàn)Target接口內(nèi)部包裝Adaptee把外部調(diào)用轉(zhuǎn)成內(nèi)部語義。Client使用Target接口的業(yè)務(wù)代碼它完全不感知Adaptee的存在。這里的關(guān)鍵是端口接口的定義權(quán)必須在自己手里。如果你直接把外部SDK暴露出來的接口當(dāng)成本系統(tǒng)接口讓所有業(yè)務(wù)代碼去編譯依賴它那這個SDK的任何一個變化都會變成你的系統(tǒng)變化。反過來如果你先定義了業(yè)務(wù)真正需要的接口再讓適配器去適配外面的世界再怎么變業(yè)務(wù)代碼的編譯產(chǎn)物都可以一動不動。1.3 適配器和防腐層的關(guān)系聊適配器的時候經(jīng)常會冒出來另一個詞防腐層。很多人把它們當(dāng)成一回事實際上粒度不一樣。防腐層是領(lǐng)域驅(qū)動設(shè)計里常用的一個邊界概念它保護(hù)核心領(lǐng)域不受外部上下文污染除了接口轉(zhuǎn)換還會包含協(xié)議翻譯、數(shù)據(jù)校驗、模型映射、外部服務(wù)的開關(guān)與容錯。適配器是防腐層最常見的落地手段之一但防腐層更強(qiáng)調(diào)“邊界”適配器更強(qiáng)調(diào)“轉(zhuǎn)換”。你完全可以在一個防腐層里面放多個適配器分別對應(yīng)不同的外部服務(wù)。也可以只做一個適配器哪怕它只承擔(dān)了一次協(xié)議轉(zhuǎn)換。它們不是替代關(guān)系而是層次關(guān)系。把這個概念理清楚之后你再看網(wǎng)上的爭議文章就會發(fā)現(xiàn)絕大多數(shù)爭論都是因為把這兩個概念混在一起了。我在做邊界設(shè)計時一般會先識別“哪里是防腐邊界”再決定“邊界上需要幾個適配器”順序不要反。2. 為什么說隔離變化比消滅變化更務(wù)實2.1 你能控制的范圍往往比想象中小很多剛工作沒幾年的同學(xué)都有一個理想化的習(xí)慣看到外部接口不順眼就想著讓外部團(tuán)隊改改到符合自己的使用習(xí)慣。比如字段命名不規(guī)范、狀態(tài)碼含義模糊、沒有超時控制、文檔更新滯后。這些問題確實存在但現(xiàn)實是外部系統(tǒng)是別的團(tuán)隊在維護(hù)它的演進(jìn)節(jié)奏不會為你的適配感負(fù)責(zé)。老系統(tǒng)改造的場景里更明顯。遺留系統(tǒng)的接口不能動因為還有大量老業(yè)務(wù)依賴數(shù)據(jù)表結(jié)構(gòu)不能改因為幾百個查詢都在用。你能做的只有在新系統(tǒng)和老系統(tǒng)之間加一層翻譯。所以我在多次實踐中把設(shè)計心態(tài)理順了隔離變化不是消滅變化消滅變化是幻想隔離變化才是工程。外部世界你改不了你能控制的是把外部變化的影響控制在一個薄層里讓它不要在核心業(yè)務(wù)里到處流竄。這就是適配器最大的價值也是“隔離”二字的真正含義。2.2 隔離帶來的三個具體好處第一是可測試。業(yè)務(wù)代碼依賴的是自己定義的端口接口你完全可以在單元測試?yán)镉靡粋€模擬實現(xiàn)替代真實的第三方調(diào)用。不需要起動外部服務(wù)不需要準(zhǔn)備真實的測試賬號更不需要擔(dān)心測試環(huán)境網(wǎng)絡(luò)抖動。這一點在寫業(yè)務(wù)單測的時候非常舒服你會發(fā)現(xiàn)業(yè)務(wù)模塊的測試基本不需要再Mock外部SDK了端口后面掛的本來就是假實現(xiàn)。第二是可替換。哪天你發(fā)現(xiàn)當(dāng)前的外部服務(wù)費用太高、穩(wěn)定性太差、或者不再維護(hù)要切換到另一個同類服務(wù)理論上只需要寫一個新的適配器換上去業(yè)務(wù)代碼一行都不用動。我在現(xiàn)實中經(jīng)歷過一次支付渠道切換整個切換花了三天其中兩天半在寫新適配器業(yè)務(wù)側(cè)真正改動的代碼收斂在兩個配置項和一個開關(guān)上。如果沒有適配層這個時間至少要放大五倍。第三是可演進(jìn)。因為端口接口的語義是業(yè)務(wù)側(cè)的你可以讓接口向著自己系統(tǒng)的業(yè)務(wù)語言進(jìn)化。比如你可以在端口里定義一個queryTransferStatus方法而外部SDK可能叫g(shù)etTrade(queryOrderRequest)。名字不重要重要的是業(yè)務(wù)代碼讀起來像業(yè)務(wù)而不是像接口文檔。系統(tǒng)的長期維護(hù)性很大程度就體現(xiàn)在這種“業(yè)務(wù)代碼能否自解釋”上。2.3 適配器不是銀彈什么時候不該上隔離變化很香但不是所有場景都要上適配器。如果外部接口非常穩(wěn)定、改動頻率極低、系統(tǒng)生命周期又短那硬套一層適配器反而是過度設(shè)計的開始。我曾經(jīng)接手過一個內(nèi)部工具項目里面調(diào)了一個登錄服務(wù)接口三年沒變過但前任硬是給這個登錄服務(wù)加了三層接口抽象、適配器、封裝Facade每個方法都是三層轉(zhuǎn)發(fā)。結(jié)果代碼可讀性極差調(diào)試一個問題要跨三層斷點。判斷標(biāo)準(zhǔn)我用一個公式變化概率乘以影響范圍。只有在你判斷這個外部依賴有較大概率會變或者影響范圍很大時適配器才物有所值。給“永遠(yuǎn)不會變的只讀服務(wù)”加適配器跟“為了明天可能下雨就買一輛水陸兩用車”差不多。別為虛構(gòu)的明天設(shè)計這是隔離變化設(shè)計里最需要克制的一點。3. 核心實戰(zhàn)場景第三方支付接口的適配層設(shè)計3.1 場景還原為什么不能直接調(diào)SDK我拿一個最常見的場景舉例給業(yè)務(wù)系統(tǒng)接入在線支付。一開始你對接了某個支付服務(wù)商它的SDK提供了下單、退款、查詢等方法。業(yè)務(wù)團(tuán)隊為了趕工期直接在訂單模塊、退款模塊里四處調(diào)用這個SDK。一開始沒什么問題但很快你發(fā)現(xiàn)幾個隱患SDK的請求對象和響應(yīng)對象到處出現(xiàn)在業(yè)務(wù)代碼里代碼被第三方實現(xiàn)深度“綁架”異常處理不一致有的地方直接拋ThirdApiException有的地方捕獲后翻譯成自己的錯誤碼風(fēng)格混亂退款和下單的返回狀態(tài)語義不統(tǒng)一有的接口返回“成功”是指“提交成功”有的是“處理成功”。一旦業(yè)務(wù)代碼散落著外部SDK的類型換服務(wù)商或者升級SDK就會變成一場災(zāi)難。你必須在每個調(diào)用點去核對第三方返回值、異常類型、字段映射稍微漏一個地方生產(chǎn)環(huán)境就會冒出一堆詭異問題。適配器模式在這里不是可選項而是基本盤。3.2 端口先行先定義你的系統(tǒng)需要的接口正確做法是先忘掉那個支付SDK回到業(yè)務(wù)本身。問一個問題訂單系統(tǒng)、退款系統(tǒng)、賬務(wù)系統(tǒng)它們真正需要支付能力做什么答案大多是三件事發(fā)起支付、查詢結(jié)果、發(fā)起退款。于是你定義一個干凈的業(yè)務(wù)端口public interface PaymentPort { PaymentResult createPayment(PaymentCommand command); PaymentResult queryPayment(String bizOrderNo); PaymentResult refund(PaymentCommand command); }這個接口有幾個特點值得注意。第一參數(shù)是我方業(yè)務(wù)模型比如PaymentCommand里有bizOrderNo內(nèi)部訂單號、amountBigDecimal元、paySubject商品描述而不是第三方SDK里的供應(yīng)商編號、分單位金額、渠道編號等概念。第二返回值統(tǒng)一成PaymentResult業(yè)務(wù)層只用code、message、外部交易號即可不需要理會第三方的各種回調(diào)數(shù)據(jù)結(jié)構(gòu)。第三方法簽名以業(yè)務(wù)語義命名閱讀代碼的人不會產(chǎn)生理解偏差。我把這樣的接口稱為“端口”因為它是業(yè)務(wù)領(lǐng)域和外部世界之間一條定義明確的連接線。端口里面聲明什么、不聲明什么直接決定了后面變化侵入系統(tǒng)的面積。3.3 適配器實現(xiàn)的關(guān)鍵代碼有了端口接下來寫支付服務(wù)商的適配器。適配器的職責(zé)就是把外部SDK的調(diào)用方式“翻譯”成端口定義的方式。我給出一個典型骨架語言用Java描述其他語言的思路完全一致public class PayProviderXAdapter implements PaymentPort { private final PayProviderXClient client; public PayProviderXAdapter(PayProviderXClient client) { this.client client; } Override public PaymentResult createPayment(PaymentCommand command) { try { BuildPayRequest req new BuildPayRequest(); // 單位轉(zhuǎn)換元 - 分 req.setAmount(toCents(command.getAmount())); req.setBizOrderNo(command.getBizOrderNo()); req.setSubject(command.getPaySubject()); PayResponse resp client.pay(req); return PaymentResult.of(resp.isSuccess(), codeOf(resp.getStatus()), resp.getTradeNo()); } catch (PayProviderXTimeoutException e) { // 外部超時理論上訂單狀態(tài)未知需要查詢確認(rèn)不能直接算失敗 throw new PaymentPortUncertainException(provider timeout, e); } catch (PayProviderXRejectedException e) { // 業(yè)務(wù)拒絕余額不足、風(fēng)控攔截等 throw new PaymentPortBusinessException(e.getMessage(), e); } } Override public PaymentResult refund(PaymentCommand command) { // 同樣的翻譯邏輯 } }你別小看這個代碼片段里面每一個細(xì)節(jié)都是在實戰(zhàn)中打磨出來的。金額單位必須在這里轉(zhuǎn)一次避免業(yè)務(wù)層到處做“元轉(zhuǎn)分”。外部超時不能簡單當(dāng)作失敗因為第三方可能已經(jīng)扣款成功了所以拋出一個“不確定”異常讓上層走查詢補(bǔ)償流程。第三方業(yè)務(wù)拒絕要翻譯成業(yè)務(wù)拒絕讓上層能拿到可讀的錯誤語義。這些決策看起來很瑣碎但它們決定了整個系統(tǒng)的邊界質(zhì)量。3.4 模擬適配器不只是測試玩具按同樣的端口再寫一個模擬適配器public class MockPaymentPort implements PaymentPort { Override public PaymentResult createPayment(PaymentCommand command) { if (1.equals(command.getBizOrderNo())) { // 模擬一個被風(fēng)控拒絕的場景 throw new PaymentPortBusinessException(mock risk reject); } return PaymentResult.of(true, TRADE_SUCCESS, MOCK command.getBizOrderNo()); } Override public PaymentResult refund(PaymentCommand command) { return PaymentResult.of(true, SUCCESS, MOCK_REFUND command.getBizOrderNo()); } }很多人把模擬適配器只當(dāng)成單元測試的玩具其實它的價值遠(yuǎn)不止測試。在前后端并行開發(fā)、聯(lián)調(diào)環(huán)境不穩(wěn)定的時候業(yè)務(wù)模塊可以直接掛上模擬適配器先跑通流程等真實服務(wù)準(zhǔn)備好了再切換過去。想模擬第三方超時、風(fēng)控拒絕、重復(fù)回調(diào)都能在模擬實現(xiàn)里輕松構(gòu)造。我自己在項目里還會給模擬適配器加上延遲參數(shù)用來模擬真實網(wǎng)絡(luò)延遲讓前端體驗接近真實的交互耗時。需要注意的是模擬適配器不能偷偷留在生產(chǎn)環(huán)境里。它在開發(fā)環(huán)境是利器在生產(chǎn)環(huán)境就是事故導(dǎo)火索。我見過一個團(tuán)隊測試完忘改配置導(dǎo)致線上支付流程走的是模擬通道雖然最終沒有真扣款但對用戶已經(jīng)造成了明顯業(yè)務(wù)影響。所以切換邏輯要干凈最好通過配置中心控制并且配置變更要帶上線審批和監(jiān)控告警。4. 完整實操過程從一個老系統(tǒng)開始做適配改造4.1 第一步梳理調(diào)用點找到變與不變的分界線做適配改造尤其是給老系統(tǒng)做改造不能上來就寫抽象接口得先盤點現(xiàn)狀。我通常會做三件事找出所有第三方調(diào)用點列出外部接口的參數(shù)和返回結(jié)構(gòu)再標(biāo)記哪些字段是業(yè)務(wù)真正關(guān)心的。在調(diào)用點梳理過程中你會發(fā)現(xiàn)一個規(guī)律同一個外部接口常常被多個模塊反復(fù)調(diào)用而且每個模塊對返回結(jié)果的使用方式還不一樣。有的模塊關(guān)心外部單號有的關(guān)心狀態(tài)碼有的關(guān)心金額有的只關(guān)心是否成功。這些使用者都是你定義端口的參考對象。變與不變的分界線怎么找我建議以“業(yè)務(wù)世界”為準(zhǔn)。業(yè)務(wù)不關(guān)心第三方SDK怎么傳參它只關(guān)心“支付發(fā)起成功沒有”“退款到賬沒有”。所以端口接口應(yīng)該表達(dá)業(yè)務(wù)狀態(tài)而不應(yīng)該表達(dá)外部調(diào)用。簡單說如果你的端口方法簽名里出現(xiàn)了某個具體供應(yīng)商的名稱、字段、錯誤碼那這個端口就沒有設(shè)計到位。4.2 第二步寫適配器骨架把轉(zhuǎn)換規(guī)則列成表格動手寫編碼之前先把轉(zhuǎn)換規(guī)則列出來。我習(xí)慣在項目文檔里維護(hù)三張表形式類似這樣業(yè)務(wù)字段端口側(cè)供應(yīng)商字段SDK側(cè)轉(zhuǎn)換規(guī)則bizOrderNoout_trade_no直接映射amount元amount分乘以100取整paySubjectbody截斷到128字符供應(yīng)商返回狀態(tài)業(yè)務(wù)狀態(tài)說明TRADE_SUCCESSSUCCESS明確成功TRADE_CLOSEDFAILED系統(tǒng)關(guān)閉WAIT_BUYER_PAYPROCESSING等待支付UNKNOWNUNCERTAIN需查詢確認(rèn)異常類型業(yè)務(wù)異常后續(xù)處理建議超時異常UncertaintyException發(fā)起查詢或?qū)~業(yè)務(wù)拒絕BusinessException提示用戶簽名異常InfraException告警檢查配置限流錯誤RetryableException延遲重試或降級有了這三張表適配器的代碼寫起來就是純粹的“翻譯”不太容易漏邏輯。更重要的是這三張表沉淀下來之后下一次換供應(yīng)商新適配器的開發(fā)會快很多因為業(yè)務(wù)側(cè)要什么已經(jīng)是確定的只需填表映射。4.3 第三步異常翻譯與監(jiān)控埋點適配器里最容易忽略的不是主流程而是異常翻譯。很多代碼在外層兜底捕獲了一個Exception卻不知道怎么處理。真實的情況是外部異常至少分四類技術(shù)異常超時、連接失敗、簽名錯誤、業(yè)務(wù)異常余額不足、風(fēng)控拒絕、狀態(tài)不確定異常請求超時但可能已經(jīng)處理、編程異常參數(shù)非法、配置錯誤。這四類異常在上層看來處理策略完全不同不能在適配器里一鍋燴成RuntimeException。我處理的原則是端口接口只拋業(yè)務(wù)語義的異常。適配器要對每一種外部錯誤做翻譯把技術(shù)異常包裝成基礎(chǔ)設(shè)施異常把業(yè)務(wù)異常翻譯成業(yè)務(wù)錯誤把不確定異常單獨建模。這會讓上層代碼的錯誤處理邏輯變得很清晰而不會出現(xiàn)上層到處 catch 第三方異常類的情況。監(jiān)控埋點在適配器里也比在業(yè)務(wù)層里做更合適。每次調(diào)用記錄耗時、成功/失敗、失敗原因這些指標(biāo)天然和外部依賴綁定。我在適配器里加了簡單的計數(shù)器上線后能直觀看到每個供應(yīng)商的可用率。一旦某個供應(yīng)商出問題監(jiān)控圖上立刻能看出來而不是等到業(yè)務(wù)報障才發(fā)現(xiàn)。4.4 第四步雙實現(xiàn)切換與回歸測試?yán)舷到y(tǒng)改造最怕一次性一刀切切過去就回不來。我的做法是構(gòu)建雙實現(xiàn)并存機(jī)制保留舊的直連調(diào)用邏輯新適配器通過配置開關(guān)決定是否啟用。配置中心的開關(guān)打開后讓一小部分流量先走適配器觀察業(yè)務(wù)指標(biāo)和日志確認(rèn)沒問題再逐步切完。在回歸測試上我會重點驗證幾類場景正常成功鏈路、金額為0的邊界、超時后重查鏈路、第三方返回業(yè)務(wù)拒絕、重復(fù)退款、回調(diào)亂序。這些測試用例盡量用模擬適配器來測業(yè)務(wù)層用真實供應(yīng)商小額度來驗證適配器本身。兩者結(jié)合既能保障業(yè)務(wù)邏輯穩(wěn)定又能驗證真實接入正確性。這個改造過程看起來環(huán)節(jié)多但每一步都不難難的是沉住氣把調(diào)用點梳理清楚。很多團(tuán)隊改造失敗不是適配器寫得有問題而是根本沒盤點清楚哪些地方在用外部接口結(jié)果切配置之后漏了幾個調(diào)用點導(dǎo)致線上出現(xiàn)問題。5. 踩坑實錄適配器寫歪了以后的樣子5.1 坑一適配器里堆滿業(yè)務(wù)規(guī)則適配器最典型的腐爛方式就是寫著寫著把業(yè)務(wù)規(guī)則也塞進(jìn)去了。比如外部狀態(tài)為SUCCESS時適配器里順便做了一個“如果訂單金額大于1000元就走人工審核”的判斷或者適配器里直接操作了數(shù)據(jù)庫修改訂單狀態(tài)。這些規(guī)則一旦埋進(jìn)適配器就會變得難以測試、難以復(fù)用還會讓適配器層變成一個新的“大泥球”。為什么會出現(xiàn)這個坑因為寫代碼的時候覺得這個判斷順手放這里最方便不用再去改別的類。代價是邊界被悄悄模糊了適配器不再是純粹的翻譯層而是承擔(dān)了業(yè)務(wù)編排職責(zé)。我的糾偏經(jīng)驗是給適配器設(shè)定一個紀(jì)律它只能做四件事——參數(shù)映射、調(diào)用外部服務(wù)、響應(yīng)映射、異常翻譯。任何超出這四件事的邏輯一律放到適配器之外的業(yè)務(wù)服務(wù)里。評判標(biāo)準(zhǔn)很簡單如果適配器里出現(xiàn)“if 金額 xxx”這類業(yè)務(wù)分支就該重構(gòu)。5.2 坑二把外部異常直接拋給上層還有一個非常常見的坑就是適配器捕獲異常之后不做翻譯直接把第三方異常原樣拋出去。外面看日志還好但業(yè)務(wù)模塊的 catch 就遭殃了。業(yè)務(wù)層為了處理第三方異常你得引用對方的異常類型為了拿到錯誤詳情你得解析第三方錯誤對象。這等于把外部依賴的細(xì)節(jié)從適配器泄漏給了全部調(diào)用方。我在一個遺留系統(tǒng)里看過這樣的代碼業(yè)務(wù)層同時 catch 了兩家供應(yīng)商的異常類型還在 switch 里分別處理錯誤碼。每加一個供應(yīng)商業(yè)務(wù)層就要加一組 case這就是沒有做異常翻譯的后果。適配器的異常出口應(yīng)該是自解釋的上層看到一個PaymentPortBusinessException就知道這是“業(yè)務(wù)可以處理的失敗”看到技術(shù)異常就知道得走降級邏輯。5.3 坑三適配器實例狀態(tài)混亂造成線程安全問題適配器在大多數(shù)情況下應(yīng)該是無狀態(tài)的但有些人習(xí)慣在適配器里保存某個本次請求的上下文比如請求ID、用戶ID。一旦這個適配器被多個線程共享這些字段就會被互相覆蓋輕則日志串號重則把A用戶的請求參數(shù)拼到B用戶的請求里。我見過一個真實事故適配器里一個成員變量保存了訂單號然后業(yè)務(wù)用異步線程池去調(diào)用支付多筆訂單并發(fā)時訂單號互相污染導(dǎo)致扣錯了款。排查到根因后把成員變量全部改成方法參數(shù)傳遞問題才徹底消失。所以要牢記適配器實例本身是單例擴(kuò)用的臨時數(shù)據(jù)必須走方法參數(shù)不能存成員變量。如果需要保存請求上下文要使用獨立的上下文容器而不是直接定義在適配器里。5.4 坑四為適配而適配純粹的過度設(shè)計和前面幾個坑相反還有一種失敗是搞了一堆不必要的抽象。比如系統(tǒng)里只有一個外部服務(wù)這個服務(wù)也很穩(wěn)定但設(shè)計者還是畫了三層接口配了四個適配器類然后到處聲明“為未來擴(kuò)展做好準(zhǔn)備”。結(jié)果是任何人讀代碼都要在多層間接里跳來跳去還沒等到那個“未來”團(tuán)隊已經(jīng)被維護(hù)成本拖垮了。判斷是不是過度設(shè)計我會看一個信號適配器的文件名里是不是全部帶同一個動詞比如XxxAdapter、YyyAdapter、ZzzAdapter但其中至少有兩個方法體是完全一樣的轉(zhuǎn)發(fā)。如果出現(xiàn)這個信號說明抽象粒度有問題不如先合并或者刪掉一層。5.5 排查適配層問題的檢查清單經(jīng)驗沉淀后我給團(tuán)隊整理過一份適配層自查清單每次代碼評審都拿出來對著過一遍外部SDK類型是否出現(xiàn)在端口接口和業(yè)務(wù)代碼里出現(xiàn)即視為泄漏。適配器里是否存在業(yè)務(wù)分支、數(shù)據(jù)庫操作、狀態(tài)判斷存在即視為越權(quán)。外部異常類是否被上層直接引用參考所有 catch 的異常類型。單位轉(zhuǎn)換、字段映射是否只出現(xiàn)一次重復(fù)出現(xiàn)就是隱患。適配器是否可單測可測試的標(biāo)準(zhǔn)是不依賴真實外部服務(wù)。換一個供應(yīng)商業(yè)務(wù)側(cè)需要改幾行理想答案是0行。這份清單雖然簡單但能擋住大部分適配層的低級問題。我在多次評審里發(fā)現(xiàn)真正被攔下來的代碼問題其實都是這些看起來基礎(chǔ)的規(guī)則被忽略了。6. 適配器與鄰接模式邊界劃分和配合6.1 策略模式和適配器一起用適配器負(fù)責(zé)把外部接口翻譯成內(nèi)部端口策略模式負(fù)責(zé)讓同一端口下多個實現(xiàn)可以靈活選擇。兩者經(jīng)常一起出現(xiàn)。比如你定義了SmsPort然后寫了ProviderAAdapter和ProviderBAdapter再按流量比例切換或按地區(qū)路由這就是策略調(diào)適配器。沒有適配器策略模式的選擇對象會變成各種外部SDK接口語義差異會放大沒有策略模式你每次想切供應(yīng)商就得改適配器的實例化代碼。它們的關(guān)注點不同適配器解決的是“長什么樣”的問題策略解決的是“選哪個”的問題。在代碼結(jié)構(gòu)上就是兩層策略層持有端口引用適配器實現(xiàn)端口。這個組合幾乎覆蓋了所有“多供應(yīng)商接入”的需求。6.2 門面與適配器簡化不等于轉(zhuǎn)譯門面和適配器經(jīng)常被搞混因為它們都可以包裝某個復(fù)雜的子系統(tǒng)。區(qū)分方式很簡單適配器是為了讓“本來不兼容的接口變得兼容”門面是為了讓“一堆復(fù)雜的交互變得簡單”。比如你有一個短信服務(wù)、一個郵件服務(wù)、一個站內(nèi)信服務(wù)然后做一個通知門面上層調(diào)一個send()就完成多渠道通知這是門面。而針對其中某一家短息服務(wù)商做協(xié)議翻譯那是適配器。門面可能沒有外部兼容問題它只是簡化。適配器則有明確的兩側(cè)協(xié)議不兼容才需要翻譯。在系統(tǒng)設(shè)計時常見的情況是門面后面再掛適配器門面提供統(tǒng)一入口適配器負(fù)責(zé)對接不同供應(yīng)商。這兩者的協(xié)作會讓邊界更清晰但如果混用代碼讀起來就會很迷糊。6.3 代理與適配器控制訪問與協(xié)議轉(zhuǎn)換代理模式也和適配器很像都持有目標(biāo)對象都包了一層。但代理的核心目的是控制訪問比如延遲加載、訪問控制、日志記錄它不改變接口形態(tài)適配器的核心目的是轉(zhuǎn)換接口它必須改變接口形態(tài)。所以在實現(xiàn)上有一個簡單判斷法客戶端拿到的對象接口和代理持有的目標(biāo)對象接口是否一致一致是代理不一致是適配器。實際項目中我也會把兩者疊起來先用適配器把外部接口翻譯成內(nèi)部端口然后在適配器外包一層監(jiān)控代理統(tǒng)計調(diào)用指標(biāo)。這樣適配器仍然專注于翻譯代理專注橫切關(guān)注點各司其職。6.4 模板方法固定適配流程策略處理差異性如果適配多個供應(yīng)商時發(fā)現(xiàn)它們的調(diào)用流程高度相似只是細(xì)節(jié)不同可以用模板方法模式把流程固定下來把差異部分交給子類實現(xiàn)。比如不管是哪個支付服務(wù)商調(diào)用流程都是“組裝請求、發(fā)請求、解析響應(yīng)、處理異?!敝皇墙M裝方式不同、解析方式不同。做成一個抽象的BasePaymentAdapter提供process()模板子類只需實現(xiàn)buildRequest()和parseResponse()能大幅減少重復(fù)代碼。但這個優(yōu)化有兩個前提流程確實高度一致并且你有多個適配器。如果只有兩個適配器模板方法也可以但一定要警惕“為了復(fù)用而硬抽出公共父類”那會讓父子類關(guān)系變得很別扭。做過的系統(tǒng)越多我越發(fā)現(xiàn)一個規(guī)律真正讓項目長期穩(wěn)定的往往不是復(fù)雜的業(yè)務(wù)模型而是這些看起來不起眼的隔離層。適配器就是典型代表它的實現(xiàn)成本不高收益卻非常直接——外部世界再亂業(yè)務(wù)代碼依然可以保持自己的語言和節(jié)奏。我的建議是在項目里第一次出現(xiàn)“后面可能要換供應(yīng)商”“這個接口是別的團(tuán)隊維護(hù)的”這種話時就順手把適配器建起來。就算最終沒換成你也會得到一個更干凈的測試接口和一個更容易解釋的系統(tǒng)邊界。設(shè)計這東西很多時候圖的就是關(guān)鍵時刻不用抓瞎。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99欧美| 爱妃国产亚洲视频中文字幕| 国产福利影视| 精品人妻中文字幕高清| 欧美色图在线视频少妇| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 啪啪91| 亚洲日产专区婷婷| 在线亚洲丝袜视频网站| www激情| 一区二区三区国产在线播放| 99这里都是精品| 懂色AV一区二区三区| 在线看的av| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 91伊人影视综合| 日本高清_区二区三区| 国产精品久久泡妞网站| 四虎免费视频| 狠狠干精品一二三四五六2022| 国产亚州精品美女久久久免费| 东北熟女91| 欧美第一页| 夜夜高潮夜夜爽高清视频一| 丝袜美腿诱惑亚洲欧美视频在线观看| ji熟女.com| 天天日天天干天天摸天天操| 嗯嗯啊啊的视频| 久久少妇视频| 久久久久久久久久久久久9999| AV不卡在线| 日产欧美电影一区二区三区| 96久久久久| 骚女高跟AV在线| 天天日天天色| 极品欧美一区二区三区| 人妻少妇无码| 超碰在线第一页| 国产丰满熟夫69mpp| 97九色人妻| 岛国1区2区3区在线观看| 亚洲熟女综合一区二区| 亚洲情色 自拍| 91美女国产在线| 欧美在线 亚洲| 91在线欧色| 伊人91| 麻花传媒免费网站在线观看| 日本人妻中文字幕精品| 精品丝袜无码一区二区三APP| 91女优在线观看 | 人妻丰满熟妇一区二区三| 18精品一二区| 狠狠躁天天躁日日躁97| 国产在线激情| 黑人娇小av在线播放| 一区二区三区看视频| 大香蕉狠狠爱| 精品无码欧美三级| 欧美精品99久久久**| 免费无码国产精品v片在线观看| 欧美在线91| 色姑娘综合网| 蜜臀AV秘一区翔田千里| 波多野结衣一级视频| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 家庭乱伦国产| 口爆吞精在线观看| 操逼不卡中文字幕| 日韩伦理视频| 综合网97| 超碰九区| 无码国产Av| 国产黄片精品在线| 久久久国产三级黄色片| 青娱乐导航AV| 蜜臀无码一区二区| 情色大香蕉| 亚洲动态色图| 黄色操人| 久久精品国产精品亚洲艾通辽熟妇| 午夜激情床戏激情| 天天射天天色成人| 99e久久国产精品| 色欲无码人妻日韩欧美精品| 99视频自拍| 好吊色在线观看| 五月天激情影院| 97精品一二区| 国产熟女自拍| 亚洲熟女乱色一区二区三区| 五月综合婷婷久久网站| 久久AV无码1区2区3区| 懂色av中文字幕一区二区三区天美| 在线看污网站| 男人的天堂一区三区| 久久久久久性爱片| sewuyueav| 国产又黄又粗的视频| 高清国产av无码| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 人妻丝袜一区二区三区在线| 国产精品呦一区二区三区| 99无码精品| 亚洲免费97免费| 一级免费精品| 国产精品探花视频| 一区| 乱伦一二三| 99操99| 99久久9| 成年人黄色视频免费| 日本污ww视频网站| 亚州色阁| 在线无码视频| 欧美中文狠| 亚洲人成在线放东京热| 亚洲欧美精品一区天堂久久| 中文字幕精品专区搜索结果91| 无码国产精品96久久久久孕妇| 91三级理论片播放器| 啊啊啊啊视频免费| 爱爱动态60秒| www.狠狠操| 久久偷偷色综合蜜桃| 啪啪视频免费在线观看| 伊人久久亚洲中文字幕| 人人操人人肉久久精品| 国产69精品久久久久99尤物| 天天操天天日青青草超碰av| 国产欧美精选自拍一区| oumeizonghese,www| 久久 精品| 日本三级韩三级99久久| 东北毛片| 国产SV一线| 91精品人| com 首页 18岁 禁区 女优 免费 精选 同城 | 蜜臀AV成人精品蜜臀AV久久| 久久精品日韩| 神马久久网| 天天插夜夜操| 欧美 日韩第一性色| 国产女性无套 免费观看| 人人九九精| 丁香六月综合激情| 操国产逼| 91丝袜激情在线| 国产强奸乱伦xd| 97精品国产精品免费观看| 国产精品熟女九色九色蜜臀| 粉嫩久久久极品| 不卡日本一区二区| 麻豆AV短剧| 在线观看免费视频国产| 久久久女人| 亚洲成人碰碰| 欧美熟妇色| 爆乳免费黄网站| 国产无码精品高清| 99这里都是精品| 97精品综合久久| 久久春色| 综合网亚洲1| 夂久色| 男人女人18禁片免费看网站| 亚洲熟女少妇免费视频| 激情一区二区三区在线观看| 午夜精品五区| 久久久久久久| 天美传媒Av在线| 亚洲一区二区三区AV无码| 夜夜嗨一区二区三区直播内容| 丁香激情五月| 婷婷午夜成人色中色| 青青草色AV| 久久 亚洲 日韩 人妻| 亚洲第一无码播放立川理惠| 内射夫妻三片| 97久久久久| 亚洲三级网址久久最新| 亚洲天堂久久| 中文字幕交换人妻| 澳门黄片一香蕉视频| 国产精品午夜精品| 五月丁香社区婷婷日韩欧美精品影院 | 国内三级自拍小视频在线观看| 欧美熟妇精品黑人巨大91| 秋霞男人网| 中文字幕成人| 婷婷九月| 亚洲二区精品在线观看| 熟妇色99| 亚洲精品乱码久久久久久蜜桃麻豆| 啪啪91| 91在线无码精品秘 软件| 日韩欧美亚洲自拍偷拍| 久久三区四区| 桑老女人九区| 欧美色日本| 日韩亚洲美女一区久久| 婷婷五月天av| 亚洲国产日韩欧美熟妇在线| 国产精品久久久久无码A√| 亚洲在饯| 91老司机在线| 中国熟妇| 欧美97免费| 中文字幕AV片| 99精品伊人| 性色国产东北露脸精品视频| 大香蕉AV丝袜| 亚洲人成色9999精品久久| 婷婷午夜成人色中色| 澳门黄片一香蕉视频| 五月婷亚洲精品天堂| 久久久久久久| 欧美中文综合| 超碰免费97| 麻豆av一区二区| 久肏视频字幕| 人妻欧美| 91在线国产后入风骚翘臀美女素人| 久久曰曰| 亚洲色图 图片| 最新精品久久蜜桃 | 久操在97| 久久同城AV| 天天操美美| 亚洲 图片 欧美 色图| 一区二区三区男女操逼黄色小电影| 色色婷婷五月| 人人天天欧洲| 人人爽人人精品乱人伦AV| 制服中出中文人人精品| 亚洲欧美综合图片| aaa亚无码专区| 91午夜无码| 久久精品中文字幕无码l| 日本免费专区| 性爱1区| 亚洲国产尤物yw在线观看| 性在久久久久久| 亚洲1区2区三区高清中文字幕| 国产精品久久99日日| 大香蕉一区二区在线观看.| 中文字幕日韩专区精品系列| 手机看片1025| 最新欧洲欧美日本激情网站| 无码免费一区二区三区啪啪| 国产精品乱码久久久久久久久久久久| 欧美国产有色电影| 久久香蕉国产线看观看亚洲女人 | AV在线性爱| 大香蕉免费乱伦视频| 两性综合网| 久久超碰爱| 伦理弟一页| 9久9久| 无遮挡男女激烈动态图| 久久香蕉国产线看观看猫咪av| 五月天偷拍| 黄片在线免费在线观看| 精品一区二区三区四区女| 热的中文 热的有码 热的国产| 久久久啊啊啊| 神马久久久久久伦理片| 女人的久久久| 欧美黑人日韩少妇色情| 91久久久亚洲| 日韩不卡在线一区二区| JULIA一区二区三区在线播放| 婷婷五月综合在线| 亚洲性猛| www.亚洲黄色| 久久国产精品91| 日韩一级二级三级免费看完整版国语版 | 色噜噜国产精品视频一区二区| 人人干人人操人人爱| 国产黄色av大片网站| 亚洲一区二区三区麻豆传媒| 亚州欧美色图| 无码99| 免费看国产大AB| 中文?日韩?免费?精品| 亚洲国产日韩欧美熟妇在线| 九九国产| 成人无遮挡毛片免费看| 91人妻人人妻| 热久久无毒不卡| 久久av无码| 国产人妻精品久久久一区二区三区 | 少妇被c 黄 免费观看| 色五月首页| 久久久久久久久久久久欧美日| 探花精品 一区二区| 色婷婷五月综合激情中文字幕| 99综合自拍| 好爽视频在线观看视频| 久久日韩毛| 色婷婷蜜臀av| 国产一级不卡在线观看| 久久爱超碰网| 欧美性爱十八禁| 久久超碰大香蕉| 丁香婷婷五月| 亚洲91网。| 狠狠操狠狠操操| 91九九九馒头| 国产精品999aaa| 很黄很污的免费网站| 伊人视频| 国模少妇一区二区三区| 东北女人性交| 深夜啪啪啪视频免费| 99re视频在线播放青草| 人妻天天爽夜夜爽爽| av黄图片在线观看| 理论久久婷婷网 8| 国产午夜福利专区综合| 久久色一区二区| 丝袜剧情| 9久久久久久| 久久一二三四五六七八九区区区| 97色亚洲| 国产久久一区二区| 婷婷视频在线免费观看| 精品一级| 吉川爱美98堂在线| 91精品人妻电影| 日韩BBN| 亚洲高潮少妇| 一区二区影视| 精品少妇后入一区二区三区四区人妻巨乳| 秋霞操逼片| 中文字幕二区日韩天堂| 黄色电影在线播放综合网站| 懂色av中文字幕一区二区三区天美| av一区二区三区四区| 久久精品视| 99热国产| 高潮毛片无遮挡高清免费| 麻豆精品三区视频| 99ri视频| 亚洲无码免费看| 美欧色综合| 亚洲黄日韩无码专区| 美女极品一区二区三区| 亚洲天堂久久久久久粉红视频| 色婷婷成人综合| 蜜乳中文字幕a在线| 一级免费精品| 操逼精品视频| 六月婷婷五月丁香| 亚洲小电影免费涩涩成人在线高清| 吊色| 国模不卡一本二本三电影| 精品一区二区亚洲国产| 自拍偷拍亚洲熟女妇人精品| 啪啪啪男女亚洲中文字幕99| 粉嫩AV一区夜夜嗨| 97亚洲国产影视| 欧美成人黄网色网站| 亚洲精品久久久久毛片A片拉屎| 日日摸日日碰| 日本精品不卡一二三区| 国产亚洲精品无码三区| 60秒不遮不挡| 夜草欧美| 国产传媒1234区| 99这里只有精品| 最近2019中文字幕国语免费版| 女优大全 - 91n| 超碰碰小说97| 自拍欧美| 97天天爽| 嗯嗯啊啊视频在线看| 国产v片在线免费观看| 天天网综合| 33044男人的天堂深夜备| 中文字幕国产精品1区| 亚洲一本大道中文字幕无码在线| 操操操五月天婷婷丁香影院| 国产精品白丝| 伊人加勒比| 日日骚一区二区三区| 粉嫩久久久极品| 国产精品情侣啪啪| 殴美综合色88| 91激情网| 日本曲间由美性生活片| 色呦呦、国产精品| 无码外流操逼视频| 国产一区二区二区按摩精品啪视频| 90后后入| 啊啊啊慢点| 91精品人妻五十路| 97伦综合| 好涩综合| 欧美97| 精品午夜福利| 亚洲成a人v欧美综合天堂下载| 欧洲精品二区| 日躁天天爽爽| 国内偷拍精品一区二区| 日韩欧美午夜一区二区| 久久久亚洲高清不打码| 国产农村一一级特黄毛片| 曰韩无码777| 色狠狠色| 四虎影视在线| 亚洲成人色情五月天丁香花| 97精品久久久久中文字幕| 狠狠搞 亚洲91| 久久久久久久久久久久黄色 | 蜜乳视频网站| 国产探花精品在线| 一区二区三区欧美激情| 亚洲国产一区二区三区在线| 天天综合网在线| 夜夜骑天天燥| 国产青青美女玩逼视频| 日本高清一本二本免费不卡| 今日头条成人一区二区三区四虎精品| 熟女熟妇一区二区三区视频| 久久久性爱| 26UUU欧美日本| 欧美一区二区三区另类精品| 九九亚洲| 60秒免费小视频| 羞答答AV中文字| 亚洲97在线观看| 久草精品国产99| 亚洲二区精品在线观看 | 丰满人妻一区二区三区免费,| 色噜噜人妻av 中文字幕| 嗯嗯啊啊好疼| 91无码人妻精品一区二区三区蜜桃 | 无码区蜜乳| 操美女高潮抽搐白浆| 少妇一线天久久久久久| 在线五区| 在线中文字幕| 成人精品在线观看| 欧美日韩亚洲电影| 久久的免费性爱视频| 强奸乱伦资源| yazhousetuoumei| AV色五月天| 久久大黄片| 无码视频黄色网战| 丁香婷婷激情五月天无毒不卡 | 日本亚洲vr欧美不卡高清专区| 国语人妻精彩刺激| 国产中文字幕在线| 电家庭影院午夜69久久夜色精品国产69乱 | 亚洲一区亚洲天堂| 婷婷久久五月综合激情| 十八禁啪啦拍视频无遮挡| 一区二区久久天天干狠狠| 日本不卡免费二区| 亚洲免费成人精品电影| 熟女自慰久久久| 精品人妻一区二区三区视频在线| 国产三级多多影院2022国产AA一级毛片无码 | AND人妻系列| 欧美性高潮| 久久久亚洲欧美综合| 欧美永久激情一区二区| 精品人妻一区二区三区四区不卡在| www.久久最新地址| 亚洲少妇在线影音| 妇女性内射冈站HDWWWCOM| 黄污污污污| 欧洲中文字幕| 中日韩免费看男女操逼大全| 久久婷婷一区二| 国产激情在线| 蜜臀av一区二区三区免费观看| 五月天亚洲网| 亚洲精品亚洲人成在线麻豆| 亚洲欧美在线综合| 欧美日韩香蕉| 国产丝袜一区二区三区| 亚洲最大无码中文字幕网站 | 欧美在线永久天堂| 亚洲色图欧美色图制服丝袜| 亚洲九九九| 91爽啪| 香蕉99秘 一区精品蜜桃臀| 天堂无码精品国产久| 东京热熟女亚洲视频网站| 一区不卡在线观看av| 1204av韩国| 亚洲在线网站| 国精综合一二三区影视| 搞中出久久| 噜噜在线| #NAME?| 亚洲色图殴美色图激情乱伦| 国产黑白丝在线| 人妻精品视频一区二区| 国产和美国毛片| 久久五月天婷婷丁香中文字幕| av操操不卡| 久久男人精品| 99精品在线| 天天爽天天干| JIZZJIZZ亚洲女人被躁| 国产视频第2页| 久久6热视频免费观看| 久久精品操| 日韩不卡毛片Av免费高清| 韩日欧亚a级| sss视频华人在线| 亚洲AV成人无码一二三久久| 综合熟女| 无码区蜜乳| 九久久九精品视频| 3P乱轮视频| 偷拍 亚洲 欧美| 又大又白奶子| 日韩Va亚洲va欧美Ⅴa久久| 91欧美情色| 日本天堂网| 91久久精品中文字幕| 麻豆视频一区二区| 99精品人人爽| 人妻久久久久久久久久久久久久久| 欧美国产精品久久九九| 后入福利| 岛国AV一区二区电影| 被体育老师抱着c到高潮| 综合 亚洲 欧美| 午夜欧美神马久久久久| 亚洲午夜福利在线影院| 欧美激情视频在线一区| 精品免费囯产一区二区三区| 人妻爽爽啪视频| 天天干一干| 亚洲最大的综合性av| 91欧美亚洲| 夜夜嗨TV| www.AV有限公司一区| 爱爱60秒免费视频| 91在线精品| 大香蕉乱级| 九九热三级片| 亚洲熟女乱色| 野狼激情网| 26uuu偷拍亚洲欧洲综合| 91精品国产一区三一| 日本道日本道中文字幕日本道最新日本道在线观看| 精品视频日日夜夜| 五月丁香成人网| 在线啊v一区| 国产精品白丝| 亚洲欧美高清无码| 无遮挡又黄又刺激的视频| 骚女天天综合网| 综合网 欧美| 日日摸日日碰夜夜爽视频| 欧美热图99| 欧美96交| 综合网亚洲| 国产99999| 在线视频免费观看午夜| 很很操在线| 成人97人人超碰人人| 成人一二| 人人看欧美性爱| 亚洲 国产 精品一区| 国内毛片婷婷六月色| 你想操日本小逼吗| 国产精品一区二区 尿失禁| 青青草天天亲夜夜操网| 丁香九月激情啪| 天天爽爽爽爽| 后入人妻一区| 黄色十八禁| 久热精品在线| 成人久久久| 中文人妻av高清一区| 91亚洲色人| 色综合网1| 91操碰| av婷婷色网| 久久一本大香蕉 | 风月影院男女十八禁| 亚洲精品黑丝| 中文有码9| 精品无码一区二区三区色欲| 另类TS人妖一区二区三区 | 人妻少妇无码| 亚洲天天更新| 国产中文精品一区二区在线观看| 欧美视频中文字幕区| 欧州色图区| 天天综合网入口~91| 亚洲色天堂九9| 中文字幕在线免费观看| 亚洲色系另类精品国产| 九色在线熟女国产黑人| 男人的天堂亚洲| 午夜毛片高清免费不卡| 91欧美情色| 美女熟妇色| 国产视频一区二区免费| 熟妇熟女一区二三区| 是还免费视频1727我| 久草午夜| 亚洲成人黄色在线观看| 色99视频| 国产热av| 亚洲在线网站| 99这里只有精品| 天美传媒AV国产在线| 97在线免费| 激情综合网五月婷婷五月天| 91国产大片| 婷婷九月国产| 日韩无码精品综合久久| 久久久999日本大片| 物业黑人 AV一区| 欧美福利视频啊啊啊啊| 色婷五月| 另类老少妇| 男生通女生屁股| 黄色小视频日本txt| 人人澡综合涩| 放黄片放3级黄片没穿衣服| 久久综合激情| 青青伊人这里只有精品| 亚瑟国产精品久久无码| 青青草在线成人视频| 97国产精品一区| 免费黄色片。| 老熟女熟妇| 国产精品久久久吖| 98色网| 欧美亚洲手机在线| 国产AV高清AV无码| 亚洲素人综合| 日本人人操人人操| 超碰9 7女人| 天天操天天舔| 不卡六六在线91| 香蕉人人操tv| 色天堂在线观看| 亚洲国产精品无码AV在线| 用力操死我| 国产精品午夜福利亚洲综合网| 久热久一区二区三区| 三级色影综合网| 成人欧美一区二区三区黑人一| 久久精品综合| 婷婷五月天在线观看| 蜜桃传媒视频第一区入口在线看| 中文字幕 国产区| 国产精品一区二区密臀| 开心五月激情网| 91性网| 91狠狠色丁香婷婷综合久久| 老熟女网站| 人妻激情另类| 欧美一区二区福利在线| 国产精品天干天干综合网麻豆 | 国产情色第一第二页在线观看| 中文字幕日韩电影人妻| 国偷自 一区二区| 久久综合九九| 天天澡天天爽日日AV| 日韩懂色网| 青娱乐欧美激情一区二区| 天天天操天天天爱| 欧美黄色大香蕉一区二区| 好吊色综合| 女生自91网站| 天天操天天舔| 在线免费观看高清无码视频| 国产偷仑| 超碰在线人妻| 91天天综合| 中文一区在线日| 99热官网| 丰满人妻一区二区三区性色| 99色在线| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 久插综合| 日本一级性爱| www.99色| 大香交| 嗯嗯啊啊操死我| 中国国国产一级特黄毛片| 久久三区四区| 亚码人妻| 日本免费中文一区二区三区四区| 不卡av在线中文字幕| 亚热日本熟女| 国产黄a三级三级三级av在线看 | 四虎AV影视国产精品亚洲精品| 中文字幕aⅴ在线视频| 熟女熟妇一区二区三四区| 97 国产一区| 精品久久人妻成人网| 看免费的黄片| 97干色| 99re热| 爱欲AV| 久久草大香蕉| 黄片无码在线制服| 91人妻最真实刺激绿帽| 精品久久97| 国产精品电| 日本精品88888888| 超碰79人人乐| 久艾草在线精品视频在线观看| 蜜臀Av一区二区三区| 精品中文一区二区| 色一射色一射| 桃色五月天| 丝袜剧情| 中文字幕精品一区二区精| 五月天我淫我色av| 手机在线大香蕉| 久草电影网| 亚洲男人天堂2016| 久久大线蕉一区| 4141514逼喷水三级片| 国产久久久久久久久一区二区| 影音先锋视频在线| 黄色片A级一区二区三区| 人妻夜夜爽天天爽三区麻豆AV网站| 午夜亚洲| 超碰在线综合97| 人妻无码一区二区三区久久99| 亚洲精品欧洲精品| 香港成人一级视频在线青青草| 欧美熟爽综合| 六月婷婷五月丁香| 狠狠干综合| 久热99| 欧美1727免费观看视频| 日韩一级二级| 欧美日不卡| 美女露胸露奶头| 口爆综合网| 综合久久欧美| 免费看日产一区二区三区| 狠狠中文字幕| 一区二区三区黄色片a| 无码不卡八戒| 亚欧成人综合影院| 美国人人操人人操| 久久肏大逼| 综合色久| 亚洲影视综合网| 一区二区三区日韩欧美 | 肉动漫无遮挡h在线观看| 日韩欧美亚欧在线视频| 国产精品视频内谢女人| 18禁在线视频| 久久人人爽爽人人爽人人片αV| 逼逼逼逼操操操操操操操操操午夜剧场| 国产精品无码av在线 | 亚洲色图加勒比| 91色爽欧美| 亚洲综合贴图91| 夜夜骑操视频| 青草地一本线一区二区三区| av亚欧| 翔田千里一区二区三区奶水| 韩国三级理论在线| 色综合九九| 91亚洲不卡一区| 日本久久999| 91天美免费| 国产精品分类在线观看| 国产成人91一区二区三区| 欧美一区二区三区入口| 99超级碰免费视频| 欧美日韩国产传媒在线精品| 亚洲综合射| 国产日韩久久| 一本精品日本在线视频精品| 久操婷婷| 91丝袜美女| 正宗无毛一线天嫩逼| 日韩激情电影中文字幕| 国产专区第一页| 3571色综合一区二区二区| 婷婷激情啪啪| 欧美 亚洲 另类 综合| 男人综合网| 久久黄片国产一区二区| 99色视频| 男女性扦B| 97免费在线观看视频| 成年人黄色小视频网站| 男人天堂2019亚洲| 熟女熟妇一区二区三区视频| 亚洲电影中字一区二区| 在线观看成人性爱免费小视频| 青青草丝袜在线视频| 亚洲色图 欧美热图 清纯唯美 另类自拍| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 亚洲精品国产AV天美传媒| 天天综合网~91| 久久久久亚洲三级电影| www.91色综合| 97日韩欧美亚洲| av一区二区三区四区| 99热超碰| 蜜臀中文无码午夜| 国产综合网站在线播放 | 中文字幕人妻色偷偷久久皮| 大香蕉综合网| 九九在线精品| 黄久在线| 中文字幕交换人妻| 欧美性生活内射| 欧美同性恋 的搜索结果 - 91n| 在线人成亚洲视频免费观看| 在线播放成人网站| 欧美色图97| 夫妻天天操岛国视频| 婷婷中文字幕| 亚洲欧美91| 一区二区三区在线美女| 天天日天天舔东京热| 亚洲在线网站| 婷婷五月天激情网| 久久久久女教师免费一区| 留下AⅤ黄色片| 91伊人影视综合| 三男一女不戴套的A片| 淫色网综合| 熟女少妇视频| 密桃99999| 99热这里只有精品18| 精品国产91av一区二区三区 | TS人妖另类精品视频系列| 亚洲综合激情五月久久| 中文字幕乱码在线观看| 人人乐大香蕉| 大香蕉久久| 亚洲91亚洲| 欧亚性爱在线视频| 日本大香蕉| 国产大学生口爆吞精合集| 学生妹天天看| AA特级绝黄| 中文字幕欧美精品亚洲日韩蜜臀| 国内三级自拍小视频在线观看| 伊人991| 伊人久操| 天堂综合网| 秋霞视频一区二区| 日韩人妻无码不卡网站| 久久久久9久久久久| 91中出| 久久综合精品一区二区三区| 乱伦1色页| 淫乱图区 | 亚洲国产欧美日韩人妻日中文| 97这里只有精品| surenchaopeng| 亚洲成人日韩小说| 午夜啊啊| 97超碰色屌| 色天使亚洲综合在线观看| 一区二区三区四区在线不卡| 丁香九月婷婷| 色吧 综合| 老司机午夜精品福利视频一区二区 | 桃色六月天| 亚洲人妻中文高清| 97精品在线| 人人乐大香蕉| 特级毛片特黄久久免费看| 90后后入| 91热情品| 久热免费视频| 自拍内地三级在线观看| 亚洲激情深爱文学小说网站| 国产视频一区二区在线观看| wwwxxx日本爽| 亚洲se91| 少妇丝袜在线观看AV| 任你爽视频| 国产日韩区| 东北熟女91| 色情亚洲日本成人| 五月花婷婷| 色伊人91| 激情小说亚洲色图| 婷婷九月丁香| 久久綜合很很很| 色色色色网站| 久久成人午夜精品影院| 欧美91精品国产自产| 欧美少妇性乱| 超碰爽人妻熟女Av| 99久视频| 午夜.DJ高清在线观看免费7| 91亚洲电影| 亚欧美无遮挡| 天天天乱色综合全| 另类综合另类| 免費黃色視頻觀看一| 国内精品a| 在线日韩精品一区二区三区| 99少妇内射| 丝袜亚洲91| 无码视频一区二区| 超碰 另类 欧美| 色色综合网站| 亚洲成人久久美女| 亚洲最大的综合性av| 国产在线观看一区二区三区| 天堂成人网| 老司机福利社视频在线观看| 亚洲国成人情色好看电影| 亚洲色图激情小说| 婷婷五月丁香五月| 秋霞欧美性爰视频| 亚洲操逼无码| 国产第25页在线观看| 午夜福利国产欧美日韩夜夜| 久久产精品一区二区三区电影| 亚洲国产天堂| 日日骚av| 国产免费内射视频| 欧美大的香蕉有线电视视频| 亚洲综合小视频小说在线观看 | 97在线免费观看视频| 婷婷10月天青娱乐| 色欧美在线| 啊啊啊啊免费视频| 爱丝福利| 四虎在线视频| 欧美成人精品欧美一级乱黄一区二…| 久久中文字幕女同性恋一区| 欧美性五月| 大茄子熟女AV导航| 一区中文字幕二区日韩| 强乱老妇中文字幕| av中亚| 日韩免费在线观看不卡| 亚洲久久久久| 成人无遮挡毛片免费看| heyZO天然素人无码AⅤ专区| 伊人网青青| 青青久日| 偷拍偷窥与盗摄视频专区| 综合久久久久久久久91| 色综合V| 啪一啪免费视频| 91久久久久久| 久久一二区四| 97超碰中文| 精品无码一区二区人妻久久蜜桃| 超碰午夜| 色欧美综合| 在线观看不卡一区二区三区| 粉嫩粉嫩一区性色AV片| 色色五月婷| 久久一二三四五六七八九区区区 | 九九毛片这里只有精品| 亚码人妻| 日本精品五区| 全免费a敌肛交毛片免费| 天天综合色| 亚洲日韩少妇一道本视频| 精品国产乱码久久久A| AV一起草在线| 超碰狠狠操| 国产一区二区在线看| 久96热在线观看视频| 操操碰| 美女丝袜激情小说| 在线免费观看高清无码视频| 丁香婷婷啪啪| 欧洲精品欧洲精品| 又粗又长又爽在线观看| 99久久无色码| 国产白丝AV| 国产高潮AA片免费看| 日日日骚女人精品| 74成人在线| 丝袜天堂| 91丨九色丨国产丨人妻在线| www.97在线| 亚洲精品久久久久久| 夜夜春夜夜操| 亚洲国产精品无码AV久久久| 国产一区二区精品久久99| 综合婷婷| 中文字幕在线2| 国产一区二区三区白丝| 开心五月激情网| 蜜臀AV成人精品蜜臀| 久久蜜桃一区二区| 最新中文字幕精品在线| 特级大荫道BBwBBwBBW| 久草综合网| 404操逼福利视频| 日韩熟女视频二区| 亚洲av综合伊人久久| 久久久一区二区三区四曲免费听 | 蜜臀久久99精品久久久久久无删减 | 欧美不卡二区| 97精品视频免费| 狠狠干91| 欧美天天拍| 亚洲成人在线乱码色午夜| 国产精品麻豆视频网站| 久艹伊人精品综合在线| 国产精品人妻免费精品| 97久久精品亚洲| 1769成人国产精品视频| 精品一区二区啪啪啪| 夜夜高潮夜夜爽夜夜爱爱一区| 成人三一级一片aaa| 综合av影片| 韩国成人精品久久久免费看| 10000部十八禁看电影| 亚洲无码精品AV久久久| 日本一片一区| 亚洲成a人片在线观看中文!!!| 欧美另类自拍 | 久久一区二区高清免费| 精品久久九| 欧美人人AAA| 91在线欧美| 欧美日韩大陆黑人少妇99| 玖玖爱免费观看视频| 国产9熟妇视频网站| 狠狠干综合| 岛国毛片手机在线观看| 蜜桃精久三区| 婷婷综合网站| 国产成人 综合亚洲 天堂| 香蕉免费一区二区三区不读 | 午夜男人一级A片7777| 夜夜国自区| 亚洲欧洲日韩中文字幕一区| 美女干逼2| 国产一区二区三区久久精品太古里| 国产高潮AA片免费看| 国产亚洲精品无码三区| 欧美人与动性人交a| 欧美日本成人一区二区| 免费观看一区| 国产乱码久久久| 久操视频免费观看| 久久精品国产99国产精品亚洲| 中文字幕五区| 欧美综合自拍成人自拍第二十页| 国产亚洲色婷婷久久99精品91| 99爱精品| 天美国产精品| 亚洲五码一区二区三区| 综合操逼| 99热在线观看| 色综合网1| 六月婷婷色综合| 上海一级黄片| 爱我干综合| 激情综合五月| 中文字幕丝袜人妻| 蜜臀AV成人精品蜜臀AV久久| 亚洲午夜av| 综精品久久久aaaa| 日本九九久久99| 青青操视频在线| 久久系列| 久久性爱网站| www.色婷婷色综合| 日韩一级片在线看| 99性爱视频| 大香蕉宅男伊人| 婷婷10月天青娱乐| 国产福利合集| 秋霞成人一级在线观看| 曰韩无码777| 99热啪啪| 亚洲。天堂。日本在线观看| 天天日夜干| 日本无码1| 91 手机在线播放 绯色| 欧美一区二区三区成人性生活| 亚洲图片91| 国产亲戚伦亲在线| 亚洲日韩av一区二区三区百合| 日韩综合色网| 久久受www免费人成| 99碰碰| 蜜桃香蕉久草精品在线| 午夜久久无码1000合集| 二区熟妇韩日| 狠狠97| 中文字幕日本久久| 亚州色站 日韩电影| 啊啊啊久久| 97色干| 久久久啊啊啊| 综合久久婷婷| 久艹免费| 欧美做爰无码A片视频| 日本性一区| 免费人成?大片在线播放| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 精品国产肉丝袜在线拍国语| 加勒比综合九九99视频在线播放| 九九九九热| 红桃视频高潮| 国产美女销魂在线观看不卡| 亚洲情色91| 久久av无码| 91久久久老司机| 久久91视频| 亚洲国产亚洲天堂| 色小视频蜜乳| 婷婷丁香激情| 性生活久久久久久久久久| 欧美呦呦性爱| 另类专区加勒比| 天天插天天射| 久久精品午夜国产亚洲AV无码 | 国产97在线播放| 狠狠狠狠狠干| A片大香蕉在线| 亚洲精品97久久中文字幕| 嗯嗯嗯好爽| 精品人妻一区二区视频| 欧美色亚洲色| www被窝色com| 日本精品一区二区不卡| 欧洲熟妇xxXx欧美老妇裸体| 中文字幕精品一区二| 久久人妻少妇| 婷婷国产精品九区| 免费a在线播放v| 国产女人与拘做受视频免费| 一本大道久| 青青草狠狠撸| 日本五十路在线| 色999人与兽| 丁香五月婷婷啪啪| 亚洲精品久久久久久久蜜桃臀| 99色网| 9久久久久| 蜜臀久久99精品久久久久久酒店| 超碰到97情色| 天天天天天超碰| www成人啪啪18秘 免费| 一本一道vs波多野结衣| 久热影视| 色在线亚洲视频www|