亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

貨運SaaS多租戶架構(gòu)設(shè)計與核心模塊源碼解析

貨運SaaS多租戶架構(gòu)設(shè)計與核心模塊源碼解析 貨運行業(yè)做SaaS和做普通企業(yè)管理系統(tǒng)最大的區(qū)別在哪里我先把話說在前面不是功能堆得多而是架構(gòu)扛得住。一套系統(tǒng)要同時服務(wù)幾十上百家物流公司每家公司看到的都是自己的訂單、自己的司機、自己的賬單可底層跑的是同一套代碼、同一個數(shù)據(jù)庫集群——這種“看起來各用各的、實際上共用一套”的玩法就是多租戶架構(gòu)要解決的核心問題。這篇博文圍繞我實際落地的一個SaaS化貨運平臺展開重點拆兩層內(nèi)容一是多租戶架構(gòu)從租戶識別、數(shù)據(jù)隔離到權(quán)限控制的完整鏈路怎么設(shè)計二是訂單中心、計費中心、運力池這三個核心模塊的關(guān)鍵源碼逐行怎么分析。適合正在做SaaS產(chǎn)品化改造的后端工程師、架構(gòu)師以及想把物流運輸系統(tǒng)從單客戶定制升級成多租戶訂閱模式的同學(xué)參考。我盡量把每一步選的什么方案、為什么這么選、踩過什么坑都講清楚你們看完能直接拿去用。1. 項目背景與整體架構(gòu)拆解1.1 為什么貨運系統(tǒng)一定要走SaaS化先說行業(yè)現(xiàn)狀。傳統(tǒng)的物流運輸管理系統(tǒng)基本都是定制開發(fā)或者單租戶部署一家干線物流公司一套系統(tǒng)一套數(shù)據(jù)庫代碼庫還經(jīng)常因為客戶需求不同而分叉出好幾個版本。早期這么搞沒問題客戶少、功能簡單但問題會隨著規(guī)模增長越來越明顯。我接觸過一個做了七八年的運輸管理系統(tǒng)代碼倉庫里按客戶名建了五六套分支每套分支的訂單表字段都不完全一樣A客戶加了“是否需要回單”B客戶加了個“冷鏈溫度記錄”C客戶要“多點配送”。每加一個新客戶不是復(fù)制一份代碼再改就是在一堆if (customerType ...)里繼續(xù)堆邏輯。升級一個公共功能要在所有分支里各改一遍漏一個就是線上事故。這種模式運維成本爆炸而且小物流公司根本養(yǎng)不起獨立的系統(tǒng)開發(fā)團隊他們也需要一套能按月付費、開箱即用的系統(tǒng)。SaaS化解決的就是這個問題一套代碼、一套基礎(chǔ)服務(wù)所有租戶共用但邏輯上互相隔離。貨主登錄看到的是自己的發(fā)貨記錄司機看到的是自己的運單平臺管理員看到的是全量數(shù)據(jù)。新接入一個租戶不是給它單獨部署一套實例而是開一個租戶賬號、配置好它的計價規(guī)則和權(quán)限角色當天就能用起來。我自己做這個項目的時候最深刻的體會是SaaS化不是把原來的單租戶系統(tǒng)加一個tenant_id字段這么簡單。它是一個從表結(jié)構(gòu)設(shè)計、接口規(guī)范、權(quán)限模型、數(shù)據(jù)備份、消息隊列到定時任務(wù)全部要重新過一遍的架構(gòu)升級。標題里說的“多租戶架構(gòu)”絕不僅僅是數(shù)據(jù)庫隔離層面的事。1.2 多租戶隔離模式怎么選三種方案對比多租戶架構(gòu)第一個要拍板的問題就是租戶之間在數(shù)據(jù)庫層面怎么隔離。這個決定直接關(guān)系到成本、擴展性和運維復(fù)雜度。行業(yè)里主流方案有三種我列個對比表你一看就明白。隔離方案數(shù)據(jù)隔離強度單租戶成本運維復(fù)雜度適用場景獨立數(shù)據(jù)庫最強最高高每個庫都要監(jiān)控備份大型租戶、簽約大客戶、數(shù)據(jù)敏感共享數(shù)據(jù)庫、獨立Schema較強中中一套庫管理多套表結(jié)構(gòu)中型租戶要求一定程度隔離共享表、租戶ID區(qū)分最弱最低低共用表結(jié)構(gòu)小微租戶、標準業(yè)務(wù)場景絕大多數(shù)物流公司的主營業(yè)務(wù)——運單、車輛、司機、線路——業(yè)務(wù)流程是高度標準化的。所以我的選擇是默認用共享表方案業(yè)務(wù)表統(tǒng)一帶tenant_id靠代碼層強制隔離少數(shù)頭部大租戶確實有數(shù)據(jù)私有化要求或者它的訂單量級實在太大會單獨給它拆一個獨立數(shù)據(jù)庫也就是“共享為主、獨立為輔”的混合策略。為什么這么選我給你算筆賬。假設(shè)平臺有三百家租戶每家平均一天一千單。共享表方案只需要一套訂單表加一個租戶ID索引數(shù)據(jù)庫連接池、緩存、備份都統(tǒng)一管理。如果三百家全部獨立數(shù)據(jù)庫光連接數(shù)就夠嗆更別說備份、升級、遷移的工作量中小團隊根本扛不住。而少數(shù)大租戶獨立庫是劃算的因為它們的單量可能占全平臺的三成以上獨立出來能避免互相影響也方便定制?;谶@個決策整個系統(tǒng)的設(shè)計原則就定了所有業(yè)務(wù)表必須包含tenant_id字段所有寫SQL的地方必須保證租戶隔離條件不缺失所有跨租戶的數(shù)據(jù)查詢必須走專門的平臺管理接口禁止在業(yè)務(wù)接口里傳遞其他租戶ID。1.3 系統(tǒng)整體模塊地圖SaaS化貨運平臺不是一個簡單的CRUD項目它至少要包含下面幾大塊租戶中心租戶的注冊、開通、套餐配置、狀態(tài)管理是整個多租戶體系的基礎(chǔ)基礎(chǔ)資料中心司機、車輛、線路、客戶檔案、貨物類型的統(tǒng)一管理訂單中心運單從創(chuàng)建、分配、運輸?shù)胶炇盏娜芷诠芾碚{(diào)度中心運力池維護、自動派單、人工調(diào)度、異常改派計費中心計價規(guī)則配置、運費計算、費用明細生成結(jié)算中心對賬、司機結(jié)算單生成、付款狀態(tài)跟蹤報表中心各租戶的運單量、收入、成本、時效統(tǒng)計模塊之間的依賴關(guān)系我用一句話概括租戶中心管“誰在用”基礎(chǔ)資料管“有什么資源”訂單中心管“產(chǎn)生了什么業(yè)務(wù)”調(diào)度中心管“誰來干”計費結(jié)算中心管“賺了多少錢”。這五條線串起來就是一個貨運SaaS的主干。我在拆分這些模塊時最看重的一點是訂單狀態(tài)不能被計費邏輯和調(diào)度邏輯直接亂改。后面源碼分析你就能看到訂單狀態(tài)機是單獨封裝的其他模塊只能通過領(lǐng)域服務(wù)的方法來改變訂單狀態(tài)不允許自己update order set status ...一把梭。2. 多租戶架構(gòu)落地租戶識別與數(shù)據(jù)隔離2.1 租戶上下文如何從HTTP請求傳到數(shù)據(jù)庫多租戶架構(gòu)的第一道關(guān)卡是確定“當前請求屬于哪個租戶”。這個信息最早上游起源于登錄用戶的租戶歸屬——一個用戶登錄時后端校驗完賬號密碼就從它的用戶信息里拿到tenantId。后續(xù)整個請求生命周期里所有查詢和寫入都要帶上這個標識。我用的方案是ThreadLocal結(jié)合攔截器。簡單畫一下結(jié)構(gòu)public class TenantContext { private static final ThreadLocalString TENANT_ID new ThreadLocal(); public static void setTenantId(String tenantId) { TENANT_ID.set(tenantId); } public static String getTenantId() { return TENANT_ID.get(); } public static void clear() { TENANT_ID.remove(); } }攔截器在HTTP請求進入Controller之前解析Token從Token里解出租戶ID寫入TenantContext請求結(jié)束在afterCompletion里調(diào)用clear()清理。這樣Controller層、Service層、DAO層所有代碼都能通過TenantContext.getTenantId()拿到當前的租戶標識不用每個接口都手動傳參數(shù)。注意ThreadLocal看著簡單坑卻不少。最典型的兩個問題一是線程池復(fù)用導(dǎo)致租戶上下文串了二是用完沒清理導(dǎo)致內(nèi)存泄漏或臟數(shù)據(jù)。第一個問題在異步場景里特別容易出現(xiàn)。比如訂單創(chuàng)建后發(fā)MQ消息給調(diào)度中心MQ的消費線程池里的線程是復(fù)用的。如果消費任務(wù)里沒有設(shè)置TenantContext那這個線程處理完A租戶的消息后到處理B租戶的消息時上下文里可能還殘留著A租戶的ID。解決辦法是每次MQ消費入口顯式設(shè)置租戶上下文并且在消費完finally中清理。第二個問題是clear()必須放進finally里否則請求拋出異常時上下文不會被清理長連接線程會把上一次的租戶ID帶到下一次請求查出來的數(shù)據(jù)就是串的。我見過線上事故就是這個問題導(dǎo)致的一個司機登錄后看到的運單是另一個公司的嚇死人。2.2 DAO層自動注入租戶條件攔截器源碼怎么拼SQL確定了租戶上下文的傳遞下一個核心問題就是不能每個SQL都手動寫where tenant_id ?。項目里上百個Mapper方法手寫必然漏。我采用的是MyBatis攔截器方案在SQL執(zhí)行前自動解析和拼接租戶條件。先定義一個注解用來標記哪些表不需要租戶隔離Documented Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface TenantIgnore { }然后在MyBatis的攔截器里對查詢語句做處理Intercepts({ Signature(type Executor.class, method update, args {MappedStatement.class, Object.class}), Signature(type Executor.class, method query, args {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) }) public class TenantLineInterceptor implements Interceptor { Override public Object intercept(Invocation invocation) throws Throwable { // 1. 判斷是否被 TenantIgnore 標記標記了直接放行 // 2. 從 TenanatContext 取租戶ID取不到直接放行可能是不需要租戶隔離的基礎(chǔ)數(shù)據(jù)操作 // 3. 改寫 SQL在 WHERE 后拼接 AND tenant_id ? // 4. 給 PreparedStatement 設(shè)置參數(shù) return invocation.proceed(); } }SQL改寫邏輯上我用的是JSqlParser這類工具把原始SQL解析成抽象語法樹找到對應(yīng)的表名在WHERE條件前面加上租戶條件。這里有一個細節(jié)要特別強調(diào)不是所有表都加租戶條件。比如系統(tǒng)級的字典表、租戶套餐配置表本身是全平臺共享的加上租戶條件反而查不到數(shù)據(jù)。所以TenantIgnore注解是必須的而且要在項目啟動時掃描一遍所有Mapper檢查哪些表既沒有被租戶表白名單包含、又沒有加注解直接啟動報錯把漏配的問題扼殺在編譯期。另外一個很重要的工程實踐是索引。共享表方案下所有業(yè)務(wù)表的數(shù)據(jù)都在一張表里tenant_id必須和其他業(yè)務(wù)唯一鍵組成聯(lián)合索引。舉個例子訂單表的索引不是只建order_no而是要建uk_tenant_order (tenant_id, order_no)。道理很簡單如果只建order_no唯一索引兩個租戶的訂單號都是DD20250600001時直接就沖突了。復(fù)合唯一索引既保證了租戶內(nèi)的單號唯一又保證了跨租戶不互相干擾。2.3 權(quán)限與數(shù)據(jù)范圍的聯(lián)動設(shè)計租戶隔離不等于權(quán)限控制。租戶隔離解決的是“A租戶不能看B租戶的數(shù)據(jù)”權(quán)限控制解決的是“同一個租戶里不同角色能看的數(shù)據(jù)范圍不一樣”。我實際用的是經(jīng)典的RBAC模型加數(shù)據(jù)范圍。一個租戶下的角色可以分為幾類租戶管理員能看全租戶數(shù)據(jù)調(diào)度員能看自己負責(zé)的線路和車輛司機只能看自己承接的運單。數(shù)據(jù)范圍的實現(xiàn)不是簡單在SQL里拼條件而是通過一個數(shù)據(jù)權(quán)限注解Documented Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface DataScope { // 數(shù)據(jù)范圍類型ALL / DEPARTMENT_VEHICLE / ONLY_SELF DataScopeType value() default DataScopeType.ALL; }在AOP攔截器里根據(jù)當前登錄用戶的角色和數(shù)據(jù)范圍類型自動把額外的過濾條件加到SQL上。它與租戶條件疊加的時候SQL最終會變成where tenant_id ? and driver_id ?。這兩層條件要一起生效缺一個都不行。這里我想提醒一句數(shù)據(jù)權(quán)限和租戶隔離是兩個獨立維度一定要拆開設(shè)計。如果把它們混在一個攔截器里后面調(diào)整權(quán)限模型或者調(diào)整租戶隔離策略時候拆起來非常痛苦。我第一版就是圖省事寫在一起的后來加了個“按線路配數(shù)據(jù)權(quán)限”的需求改得頭皮發(fā)麻。3. 核心模塊源碼分析訂單中心與狀態(tài)機3.1 訂單模型字段怎么設(shè)計既靈活又統(tǒng)一訂單模塊是整個貨運平臺的中樞。貨主下單之后從報價、派車、取貨、干線運輸?shù)胶炇账辛鞒潭家杂唵螢楹诵牧鬓D(zhuǎn)。我先把訂單相關(guān)的核心表結(jié)構(gòu)梳理一下。訂單主表字段大致分幾類基礎(chǔ)信息order_no租戶內(nèi)唯一單號、tenant_id、order_type整車/零擔(dān)/冷鏈等、goods_type、weight、volume、pieces地址信息start_province、start_city、start_address、end_province、end_city、end_address、planned_distance時效信息expect_pickup_time、expect_delivery_time、actual_pickup_time、actual_delivery_time狀態(tài)信息status、current_node、cancel_reason、reject_reason來源信息channelAPP/小程序/接口/人工錄入、customer_id、platform_order_no此外還有兩張擴展表訂單貨物明細表一單多貨和訂單運費明細表運費、裝卸費、等候費等。我強烈建議不要把所有信息塞進訂單主表原因不是范式強迫癥而是貨運場景里一對多的情況實在太常見。一車貨發(fā)往三個不同城市的客戶這在零擔(dān)場景下天天見如果把貨物和費用全塞在主表里拆單和計費邏輯會被字段結(jié)構(gòu)活活逼瘋。3.2 訂單狀態(tài)機從下單到簽收的流轉(zhuǎn)規(guī)則訂單狀態(tài)是訂單中心最容易做崩的地方。如果每個狀態(tài)流轉(zhuǎn)都散落在Service層不同的方法里用一堆if (order.status 1 ...)判斷項目到后期會出現(xiàn)“這個狀態(tài)應(yīng)該能取消但代碼里忘了放行”之類的隱蔽bug。我在項目里用枚舉加狀態(tài)流轉(zhuǎn)表來實現(xiàn)狀態(tài)機核心代碼大致是這樣public enum OrderStatus { PENDING(10, 待接單), ACCEPTED(20, 已接單), PENDING_PICKUP(30, 待取貨), IN_TRANSIT(40, 運輸中), PENDING_SIGN(50, 待簽收), SIGNED(60, 已簽收), CANCELED(90, 已取消), EXCEPTION(99, 異常處理中); private final int code; private final String desc; }每個業(yè)務(wù)方法要修改訂單狀態(tài)的時候統(tǒng)一走領(lǐng)域服務(wù)public class OrderStatusService { private static final MapString, ListOrderStatus TRANSITIONS new HashMap(); static { // 待接單 - 已接單 / 已取消 TRANSITIONS.put(10-20, Arrays.asList(...)); // 已接單 - 待取貨 / 已取消 // 運輸中 - 待簽收 / 異常處理中 // 異常處理中 - 運輸中 / 已取消 } public void transition(Order order, OrderStatus target) { String key order.getStatus().getCode() - target.getCode(); if (!TRANSITIONS.containsKey(key)) { throw new IllegalStateException(非法狀態(tài)流轉(zhuǎn): key); } order.setStatus(target); } }為什么用狀態(tài)機因為訂單的流轉(zhuǎn)不是線性的。正常流程是待接單-已接單-待取貨-運輸中-待簽收-已簽收但中間隨時可能插入異常分支客戶取消、司機拒單、貨物破損、天氣延誤。這些分支和主流程之間要有清晰、可控的轉(zhuǎn)換關(guān)系。狀態(tài)機把流轉(zhuǎn)規(guī)則集中在一個地方管理任何非法流轉(zhuǎn)直接拋異常日志里能明確看到誰想從“運輸中”改到“已簽收”——這明顯是邏輯漏洞。還有一點經(jīng)驗業(yè)務(wù)狀態(tài)不要只用字符串或者數(shù)字散落在代碼里要配合狀態(tài)變更歷史表一起用。每次狀態(tài)變更都記錄一條流水order_id、from_status、to_status、operator_type、operator_id、change_reason、create_time。后面排查問題的時候這張表是救命稻草。有一次客戶投訴說“我明明沒收到貨系統(tǒng)卻顯示已簽收”我直接查狀態(tài)流水發(fā)現(xiàn)是某個腳本批量調(diào)用把狀態(tài)改錯了十分鐘定位到問題靠的全是流水。3.3 拆單、合單與改派的源碼邏輯訂單中心除了狀態(tài)流轉(zhuǎn)還有幾個繞不開的業(yè)務(wù)邏輯拆單、合單、改派。拆單場景最常見的是一票貨物有多個收貨地址。核心邏輯是按收貨城市分組把原來的父訂單拆成多個子訂單。這里的關(guān)鍵是父訂單本身的金額怎么分攤子訂單之間怎么關(guān)聯(lián)運費怎么重新計算。我的做法是拆單時保留父單實體但父單狀態(tài)變?yōu)椤耙巡鸱帧苯痤~清零實際業(yè)務(wù)流轉(zhuǎn)全部走子單子單通過parent_order_no關(guān)聯(lián)。合單則相反同一發(fā)貨地、同一收貨地、要求時效接近的多個訂單合并成一個運單由一個司機承運。合單不是簡單把兩個訂單的金額相加而要重新按合并后的貨物總重、總體積計價。這里要特別小心合單前必須校驗兩個訂單有沒有沖突貨物類型是否兼容常溫貨和冷鏈貨不能合并甚至要考慮貨物是否超載。我見過一次線上合單事故兩個訂單各1噸合單后總重2.5噸調(diào)度員沒注意就把單派給了一輛核載2噸的4米2車最終以超載拒運收場。所以合單邏輯里必須有重量、體積、車型匹配的校驗而且合并后要重新跑一遍運力匹配不能直接把原來某個司機的運單合并給另一個司機。改派邏輯相對簡單但要注意權(quán)限邊界只有調(diào)度員角色能改派司機不能自行轉(zhuǎn)單。改派時的關(guān)鍵操作是同時改訂單的driver_id和車輛 ID并且新增一條調(diào)度流水記錄誰改的、從哪個司機改到哪個司機、原因是什么方便運費結(jié)算時的責(zé)任劃分。4. 核心模塊源碼分析計費中心與規(guī)則引擎4.1 計價規(guī)則為何一定要配置化貨運計價是所有運輸系統(tǒng)中的“萬惡之源”因為每家公司都有自己的報價算法。有的按重量、有的按體積、有的按里程、有的按車次還有的是“起步價加噸公里價”的復(fù)合模式。如果計價邏輯在全代碼里寫死每接入一個新租戶就得改一次代碼SaaS就搞不下去了。對應(yīng)的設(shè)計思路是“計價規(guī)則引擎”。核心抽象是策略接口public interface PricingRule { // 判斷當前規(guī)則是否適用 boolean supports(PricingContext context); // 計算運費 BigDecimal calculate(PricingContext context); }然后每種計價方式一個實現(xiàn)類Component public class WeightBasedPricingRule implements PricingRule { Override public boolean supports(PricingContext context) { return WEIGHT.equals(context.getPricingType()); } Override public BigDecimal calculate(PricingContext context) { BigDecimal unitPrice context.getUnitPrice(); BigDecimal weight context.getTotalWeight(); return unitPrice.multiply(weight); } }配置層面每個租戶可以在后臺配置計價方式、單價、起步價、階梯價格。訂單創(chuàng)建時計價引擎讀取租戶的配置動態(tài)選擇對應(yīng)的規(guī)則實現(xiàn)。這樣做的好處是新租戶接入時只需要在后臺配置計價模板不需要發(fā)版、不需要改代碼真正做到了“開箱即用”。計價規(guī)則配置化之后還有一層要考慮同一個租戶下不同線路的報價可能不同。比如華東線每噸200元東北線每噸300元。所以計價配置上不能只掛在租戶級別要支持“租戶線路”級別的配置。我的做法是配置表設(shè)三檔優(yōu)先級全局模板 區(qū)域模板 線路模板計價引擎按優(yōu)先級取最高匹配級的配置。4.2 從計費快照到費用明細的完整鏈路有個很容易忽略但是非常重要的點費用計算的結(jié)果必須存快照。什么意思就是說訂單簽收那一刻算出來的運費是1300元那它就是1300元。哪怕后來管理員修改了計價規(guī)則把單價從200改成250歷史訂單的運費也不應(yīng)該變。實現(xiàn)思路是在訂單費用表里把計算時的規(guī)則快照存下來public class OrderFee { private String orderNo; private String tenantId; private String feeType; // 運費/裝卸費/等候費/保價費 private String pricingRuleId; // 計算用的規(guī)則ID private BigDecimal unitPrice; // 計算時的單價快照 private BigDecimal quantity; // 計算時的數(shù)量 private BigDecimal amount; // 最終金額 private String snapshotJson; // 整個規(guī)則上下文的快照 }snapshotJson字段里面存的是計算當時的完整上下文包括貨物類型、重量、體積、起終點、計價規(guī)則版本。后續(xù)如果對賬有爭議或者司機投訴“運費算錯了”我們可以直接調(diào)出快照看看當時到底是怎么算出來的。這個快照機制幫我擋住了無數(shù)次的扯皮。費用明細和賬單是兩回事。費用明細是一筆一筆的費用記錄賬單是給貨主看的匯總單據(jù)。我的賬單生成邏輯是一個訂單的所有費用明細按費用類型匯總生成賬單賬單狀態(tài)有“待確認”“已確認”“已支付”。結(jié)算中心在賬單確認后生成應(yīng)收記錄。4.3 平臺與司機的對賬清分邏輯SaaS貨運平臺是中間平臺從貨主那里收運費再向承運司機支付運輸報酬。中間的差價就是平臺利潤。這里有一個非常核心的對賬需求平臺的錢和第三方的錢要對平。主要包括兩類流水平臺應(yīng)收流水貨主支付了多少錢司機應(yīng)付流水平臺要給司機結(jié)算多少錢支付渠道流水第三方支付平臺的收款回調(diào)我對賬模塊的處理流程是定時任務(wù)拉取一段時間內(nèi)的平臺應(yīng)收單和支付渠道流水按平臺訂單號金額匹配匹配上的標記為“已核銷”匹配不上的進入“差異池”差異池里的記錄由運營人工處理可能是渠道手續(xù)費差異、可能是退款、可能是系統(tǒng)漏單對賬的代碼核心是匹配邏輯簡單版本如下public class ReconciliationService { public void reconcile(LocalDate bizDate) { ListReceiptRecord receipts receiptMapper.selectByDate(bizDate); ListChannelTransaction transactions channelMapper.selectByDate(bizDate); for (ReceiptRecord receipt : receipts) { // 嘗試按平臺單號和金額精確匹配 OptionalChannelTransaction matched transactions.stream() .filter(t - t.getOrderNo().equals(receipt.getOrderNo())) .filter(t - t.getAmount().compareTo(receipt.getAmount()) 0) .findFirst(); if (matched.isPresent()) { markMatched(receipt.getId(), matched.get().getId()); } else { markDifference(receipt.getId(), 金額不一致或渠道無記錄); } } } }司機結(jié)算單的生成是另一條鏈路訂單簽收后系統(tǒng)按承運司機、結(jié)算周期按單/按天/按周把司機的應(yīng)得收入?yún)R總成結(jié)算單。這里司機和貨主的計價是分開的平臺向貨主收1300元給司機結(jié)算可能是1100元差價200元是平臺收入。兩套價目表相互獨立規(guī)則引擎分別配置不能混在一起。4.4 司機結(jié)算單生成流程實操司機結(jié)算單生成是一個典型的集成流程我列一下它要經(jīng)過的狀態(tài)節(jié)點等待生成訂單已簽收等待下一個結(jié)算周期已生成結(jié)算單創(chuàng)建完成包含一個或多個訂單的明細待審核財務(wù)審核結(jié)算單核對金額和運單明細待支付審核通過等待推送支付支付中已調(diào)用支付接口已支付支付回調(diào)確認完成支付異常打款失敗觸發(fā)人工處理這個流程里最容易出問題的節(jié)點是“已生成”到“待審核”因為結(jié)算單有可能包含多張運單每張運單的狀態(tài)必須全部是“已簽收”。只要有一張單處于“異常處理中”整張結(jié)算單就不能進入審核。我在代碼里用了一個校驗方法生成結(jié)算單前先遍歷所有關(guān)聯(lián)訂單狀態(tài)不滿足的訂單直接踢出結(jié)算單并把異常情況記錄到結(jié)算單備注里。支付回調(diào)的狀態(tài)同步也要注意。支付結(jié)果必須通過回調(diào)更新不能靠發(fā)起支付響應(yīng)成功就更新狀態(tài)。因為支付渠道的真實結(jié)果可能延遲只有回調(diào)到達才代表錢真到了司機賬戶。5. 核心模塊源碼分析運力池與調(diào)度中心5.1 司機、車輛、線路的租戶化建?;A(chǔ)資料中心的建模比訂單要簡單一些套路是一樣的所有表帶tenant_id。但有一些貨運特有的業(yè)務(wù)規(guī)則要注意。司機表tenant_id、driver_name、phone、id_card_no脫敏存儲、driving_type、status空閑/運輸中/休假/禁用、score車輛表tenant_id、plate_no、vehicle_type車型、load_weight、load_volume、status可用/在途/維修/禁用司機和車輛的綁定關(guān)系一個司機可以綁定多輛車但一輛車同一時間只能被一個司機使用??紤]到換班場景綁定關(guān)系表要有生效時間和失效時間。我在設(shè)計時沒有把“當前綁定車輛”直接放司機表里而是單獨一張driver_vehicle_binding表這樣一條司機記錄可以關(guān)聯(lián)多條車輛記錄同時通過is_active字段標記當前默認車輛換車時只需要改一條記錄的激活標記不需要動司機主表。還有一個容易被忽略的細節(jié)身份證號、手機號這類敏感字段無論從數(shù)據(jù)庫存儲到日志輸出都要做脫敏。司機手機號在日志里出現(xiàn)完整號段這種事故被客戶投訴一次就夠了。我的習(xí)慣是在實體類上定義SensitiveField注解Jackson序列化和日志切面統(tǒng)一脫敏日志里永遠只看到138****1234這種格式。5.2 運力池匹配邏輯車型、距離、評分多重篩選運力池是調(diào)度中心的核心。它本質(zhì)上是一個“當前租戶下所有可用運力”的集合作引。訂單創(chuàng)建后調(diào)度中心從運力池里找到合適的司機來承運。匹配邏輯的核心排序維度我總結(jié)為四層車型匹配訂單要求6米8車就絕不能派4米2車地理位置司機當前位置離裝貨地越近越優(yōu)先歷史評分同樣距離下評分高的司機關(guān)單率低優(yōu)先派活躍度最近48小時有完單記錄的司機優(yōu)先排除長期不接單的匹配邏輯示例public ListDriverVehicle matchDrivers(Order order) { String tenantId TenantContext.getTenantId(); // 第一步租戶內(nèi)所有可用車輛 ListDriverVehicle candidates driverVehicleMapper .selectAvailableByTenant(tenantId); // 第二步過濾車型和載重 candidates candidates.stream() .filter(dv - dv.getVehicleType().equals(order.getRequireVehicleType())) .filter(dv - dv.getLoadWeight().compareTo(order.getTotalWeight()) 0) .collect(Collectors.toList()); // 第三步按距離排序按經(jīng)緯度計算距離省略具體實現(xiàn) candidates.sort(Comparator.comparingDouble(dv - GeoUtils.calcDistance(order.getStartLat(), order.getStartLng(), dv.getCurrentLat(), dv.getCurrentLng()))); return candidates; }自動匹配結(jié)果不能直接當最終派單結(jié)果這很重要。平臺上一旦出現(xiàn)自動派單給一個評分極低的司機貨主基本就跑了。所以我的設(shè)計是“自動匹配生成候選列表調(diào)度員在列表中確認或改派”。完全無人化的自動派單需要足夠的數(shù)據(jù)積累和信用體系支撐貨運行業(yè)信用體系不成熟前人工兜底是必須的。5.3 調(diào)度臺的人工干預(yù)設(shè)計調(diào)度臺的人工干預(yù)能力包括手工指派、線路改派、強制派單。手工指派的核心是權(quán)限控制調(diào)度員只能選擇自己負責(zé)的線路范圍內(nèi)的司機不能看到全租戶的司機列表。數(shù)據(jù)范圍在這里和權(quán)限模型聯(lián)動正好用到了前面講到的DataScope注解。強制派單的場景比較特殊司機已經(jīng)拒絕接單但平臺的運營判斷這個運單必須由該司機承擔(dān)于是強制派給司機。這里需要給司機一個“強制派單”的明確標識并且在司機端的訂單列表里顯示“調(diào)度強制指派如有異議請聯(lián)系調(diào)度臺”。強制派單的次數(shù)要記錄作為司機月度考核的一個負面指標。如果不做次數(shù)統(tǒng)計強制派單就會被濫用司機體驗會很差最終導(dǎo)致司機流失。調(diào)度流水同樣要走獨立的變更歷史記錄便于事后審計和績效追溯。我見過很多團隊做調(diào)度中心時只設(shè)計了訂單狀態(tài)和司機信息沒有調(diào)度日志表結(jié)果司機投訴“為啥給我派這單”的時候完全查不到依據(jù)。一張調(diào)度流水表按時間順序記錄每次派單、改派、強制派單操作能解決大量客服糾紛。6. 實際踩坑與排查實錄6.1 我遇到過的租戶隔離問題這部分分享幾個實際線上踩坑案例都是血淚教訓(xùn)希望能幫你們繞過去。第一個是定時任務(wù)不經(jīng)過攔截器導(dǎo)致數(shù)據(jù)無租戶ID。當時有一個“超時未接單自動取消”的定時任務(wù)直接調(diào)用訂單Service但沒有經(jīng)過HTTP請求TenantContext是空的。這個任務(wù)把所有租戶的超時訂單都掃出來了但沒有租戶ID的條件更新時把tenant_id更新成空串導(dǎo)致一批訂單在下一次查詢時從任何租戶里都查不出來。排查方法很簡單掃訂單表發(fā)現(xiàn)一批tenant_id is null和tenant_id 的記錄。第二個是線程池復(fù)用導(dǎo)致租戶上下文串了。MQ消費端接入了一個新的異步處理器我在消費邏輯里忘了設(shè)置租戶上下文結(jié)果線程池上一個任務(wù)留下的租戶ID被新任務(wù)繼續(xù)使用。最終導(dǎo)致司機端一個查詢請求拿到了另一個租戶的訂單列表。這個問題的排查比第一個更難因為數(shù)據(jù)看起來沒有丟只是“臟”你必須事后比對日志才能發(fā)現(xiàn)上下文沒有正確切換。第三個是手動SQL沒有走攔截器。報表模塊有大量的聯(lián)表查詢、子查詢、UNION這些SQL在MyBatis攔截器里的解析邏輯對UNION支持不完善我當時直接在白名單里讓報表SQL繞過了租戶條件結(jié)果報表數(shù)據(jù)串得一塌糊涂。后來補丁是把報表SQL改成必須顯式傳入租戶ID拼到SQL里不允許繞過。第四個問題是SQL改寫對子查詢的處理。MyBatis攔截器在改寫SQL時如果不小心處理子查詢會把租戶條件同時拼到子查詢和外層查詢里結(jié)果造成where tenant_id ? and order_id in (select order_id from order where tenant_id ?)這種重復(fù)條件??雌饋聿恢旅坏┳硬樵兝锏谋韯e名叫錯了SQL直接報列名不明確線上直接報警。6.2 排查問題的方法與速查表遇到租戶數(shù)據(jù)異常先別急著改代碼我通常按這個順序排查看接口日志請求的租戶ID是什么返回的數(shù)據(jù)里有沒有跨租戶的ID看SQL日志執(zhí)行的SQL有沒有帶上租戶條件帶上的條件值是不是當前租戶看調(diào)用鏈這個請求是從HTTP進來的還是MQ消息還是定時任務(wù)看線程上下文確認TenantContext在當前調(diào)用鏈路的各個節(jié)點是否都正確設(shè)置我把常見的現(xiàn)象和原因整理成一張排查表你們可以截圖保存現(xiàn)象可能原因排查步驟查詢結(jié)果為空租戶條件值傳錯或傳成了空檢查請求Token里租戶ID是否正常檢查上下文設(shè)置處查詢結(jié)果串租戶線程池復(fù)用上下文未清理或未設(shè)置查MQ消費入口和異步線程包裝層插入數(shù)據(jù)沒有租戶ID定時任務(wù)/回調(diào)接口未設(shè)置上下文查任務(wù)調(diào)度入口和回調(diào)處理入口SQL報列名不明確攔截器改寫SQL時子查詢處理不正確打開SQL日志檢查改寫前后的SQL報表數(shù)據(jù)異常手動SQL繞過攔截器檢查是否在報表查詢中顯式拼接租戶條件6.3 架構(gòu)層面的經(jīng)驗總結(jié)走完整個SaaS化貨運平臺的落地我把最重要的幾條經(jīng)驗放到最后說這些比任何一段源碼都值錢。第一租戶隔離方案一定要在項目第一天就定下來。中途從單租戶改成共享表技術(shù)可行但要花三倍的測試時間。所有表加tenant_id所有索引變成“租戶ID業(yè)務(wù)鍵”的復(fù)合索引這個工作越早做越輕松。第二不要為了架構(gòu)而架構(gòu)。很多團隊一聽說SaaS就覺得必須上獨立數(shù)據(jù)庫反而把自己搞死。實際做下來90%以上的租戶共享一套服務(wù)完全沒問題少數(shù)高端、大額、定制化租戶才需要獨立部署。技術(shù)選型脫離商業(yè)場景就是耍流氓。第三多租戶SaaS的測試成本遠高于單租戶系統(tǒng)。單租戶系統(tǒng)只需要驗證功能對不對多租戶要驗證功能、隔離性、權(quán)限范圍、數(shù)據(jù)統(tǒng)計、并發(fā)隔離。我強烈建議測試環(huán)境里至少準備三個租戶的數(shù)據(jù)交叉驗證每次發(fā)布前跑一遍“租戶A登錄不能看到租戶B數(shù)據(jù)”的冒煙測試用例。第四訂單、計費、調(diào)度三個模塊在邊界上最容易打架。訂單狀態(tài)機統(tǒng)一管理計費模塊通過計費流水與訂單交互調(diào)度模塊通過與訂單領(lǐng)域服務(wù)協(xié)作完成派單絕不允許模塊間直接修改對方的表數(shù)據(jù)。這個約束寫進開發(fā)規(guī)范比寫進代碼注釋有用得多。最后再分享一個處理多租戶異步任務(wù)的小技巧所有MQ消息體里必須帶上tenantId字段消費者收到消息第一時間設(shè)置租戶上下文再加finally清理。這比依賴調(diào)用鏈傳遞上下文要可靠得多因為它不依賴線程池里的執(zhí)行環(huán)境消息是顯式攜帶了租戶歸屬的。我后來把所有異步任務(wù)都按這個規(guī)范重寫了一遍租戶相關(guān)的線上事故從此基本絕跡。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91久久堂| 密臀视频三区免费网站| 亚洲成人激情小说视频| 国产十八禁视频| 精品欧美不卡在线播放| 欧美中文字幕男人天堂久久精品 | 欧美色图天堂在线| 91狠狠综合久久| 久久香蕉国产线看观看猫咪av| 97久久精品国产| 97精品久久| 男人天堂婷婷五月天校园春色| 91痴汉| 国产区性爱在线视频秋霞豆| 午夜后入| 中文字幕一区二区韩| 校园春色综合色| 男人天堂网站| 亚州操操穴网| 中文字幕,人妻,日韩| 国产中文福利| 欧美日韩另类在线播放| 欲射影视| 亚洲中文日韩欧美大香蕉视频| 人妻熟妇久草在线| 黄色av片三级三级三级免费看| 少妇人妻激情四射| 91free福利| 男人的天堂VA| 亚洲AV资源| 日韩成人私密一级精品av| 日韩二三区| 在线免费观看高清无码视频| 男人天堂久久日韩| 欧美性特| 偷拍三区| 日韩无码服务区| 99精品无码| 色综91| 精品97久久综合| www.91理论| 黄色不卡视频| 天天欧美欧美亚洲网| 亚洲激情片| 97免费在线视频在线观看| TS人妖另类精品视频系列| 人妻在线中出视频| 国产一级高跟丝袜| 一牛影视成人片免费| 超碰在线第一页| 天天天天天干夜夜夜夜夜操| 一区二区三| 蜜臀AV成人精品蜜臀AV久久| 秋霞欧美性爰视频| 欧美成人免费在线观看| 台湾佬中文娱乐网久久久久久久久久com| 國產尤物AV尤物在線觀看| 玖玖久久久| 有码人妻系列| 国产高潮AA片免费看| 免费精品无码一级毛片牛牛影视| 神马久久网| 综合久久99| 狠狠色伊人亚洲综合网站色| 亚洲 中文 欧美 日韩 在线| 香蕉一区二区三区在线视频| 日本综合久久| 亚洲成人福利电影免费| 国产在线播放成人免费| 97精品一区| 色噜噜人妻丝袜AV资源| 9久热| 男女激烈网站最新| 九九九九国产| 麻豆色99999| 夜夜爽妓女| 天天做日日爱夜夜爽| 国产成人亚洲精品无码最新在线| 免费a v| 国产超碰欧美| 青青草白白色| 丝袜综合| 一本一道人妻久久一区二区三区| 国产女人操逼视频| 国产极品粉嫩馒头一线天av| 不卡二三区人妻少妇| 欧美日韩天堂| 天天综合欧美综合| 中文久久一区| 丰满精品人妻少妇久久字幕| 中 文字幕一区二区三四 五 区日 日 骚 | 天天操美美| 1024亚洲中文字幕久在线看片你懂的| 99精品久久久久久久婷婷蜜桃| 三级AV入口| a片久久久久久久久久久久 | 精品精品精品| 久草五月| 国产又色又爽又舒服的三级视频| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 黄色网址在线免费观看| 国产福利在线视频网站| 日韩欧美aⅴ综合网站发布| av三级电影在线播放| 亚洲成人在线资源| 一卡二卡三卡| 亚洲资源吧| 久久精品无码熟妇一区二区三区视频导航 | 久久婷婷色| 丁香婷婷九月| 国产精品99久久久www| 中国探花熟女| 成人午夜视频免费播放| 久久婷婷色| 亚洲欧美日韩电影网站一区| 97超碰公开| 91熟女少妇| 俺去啦自拍| 在线小视频| 加勒比性爱成人在线| 日韩欧美中文字| 嗯嗯,好大,好爽,好骚| 丰满人妻一区二区三区在线| 在线天堂999| 成 人 影视 一区 二区 三区 四区| 激情综合五月| 黄色成品网站| 人人超碰在线观看黄| 综合91网| 97综合久第一页| 97国产精选| 92久久| 国产又黄又爽| 精品国产一区二区三区四区在线看| 亚洲男人久久综合天堂| 最新三级网址| 又大又黄国产| 久久成年精品| 色欲久久99国产精品久久久久久| 欧美综合网在线| 亚洲国产成人精品久久久国产成人一区二区 | 99精品网站| 日韩大香蕉精品在线视频| 91美女国产在线| 美女啊啊啊啊啊啊| 乱欲一区二区| 清柠毛片| 国产中文福利| 中文字幕一区二区视频在线观看| 岛国黄色短视频| 免費黃色視頻觀看一| 美女尤物福利视频| 91bbbbbb| 一级片在线观看高清无码| 国产麻豆一级精品视频| 天天综合香 ld视频| 操亚州| 猛猛干| 韩国三级一线观看久| 欧美亚洲日本激情在线| 殴美日韩m| 成人九九| 天堂中文日本在线观看| 最新一二三区视频| 99re6在线视频播放免费精品| 日韩啊V| 免費黃色視頻觀看一| 啪啪视频mP4| 久久精品电影| 亚洲va有码在线天堂| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 亚洲av综合伊人久久| 日韩人妻一区二区精品| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 在线综合 亚洲 欧美中文字幕| AV色五月| 欧美国产精品| 91在线美女| 亚洲青青草| 91色人妻| 狼人综合婷婷激情四射 | 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 成人久久久精品| 黄片www视频免费| 国产呦精品一区二区三区下载| 久久天天躁日日躁狠狠躁| 亚洲欧美综合网| 极品白嫩美女白浆成人福利在线看| 97超碰色屌| 91亚洲欧美激情| 黑人嘿嘿嘿超爽免费视频| 上床不卡网站| 一本久道在线综合视频| 成人A片男人的天堂| 国产日韩久久| 国产精品经典一卡久久久 | 三四中文字幕| 操久久久久久| 国产女人视频三四五区| 亚州色交| 精品亚洲| 宗合情欲网| 另类亚洲一区二区三区| 欧美九九99久久精品| 17c嫩草51久久91嫩草| 九九热免费国产视频婷婷伊人五月 | yazhouzaixian| 久操网视频| 久久视频少妇美女| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 亚洲影视高清第一页| 国产精品一区二区 尿失禁| 日韩精品影视| 欧美夜夜狠| 色五月AV| 人人摸人人干| 亚洲天堂人妻熟妇视频| 色与欲影视天天看综合网| 超碰成人国产| 啊啊啊网站| 天天综合网久久ww| 操逼视频亚洲| 伊人久久亚洲色欲综合网站| 五月天婷婷基地| 亚洲交性| 1区2区3区在线视频| 视频不卡中文字幕| 国产一区二区三区不卡手机在线| 看免费一级在线播放毛片| 九一性生活免费视频| www.久久最新地址| 97精品视频在线播放| 亚洲日韩美女中文字幕乱| 天堂v无码免费视频| 欧美日韩99精品麻豆传媒| 日韩,欧美,中文在线| 校园春色家庭伦理欧美激情| 亚州精人品大香蕉| 欧美精品久久96人妻无码| 超碰97资源中文字幕| 国产日韩无码一区二区三区久久区| 欧美大香蕉97| 久久婷五月| 亚洲国产综合视频| 动漫av中文| 精品久久人妻成人网| 亚洲高清欧美总合| 97视频在线免费看| 日本操BAV| 欧美天天性| 色诱中文字幕| 午夜寂寞欧美| 欧美少妇色图| 欲香欲色天天天综合和网| 色播五月丁香| 日韩精品碰碰| 丁香色狠狠色综合久久小说| 91久久久久| 日韩精品.久久精品.AV女优.天美传媒| 热思思免费视频| 久久久久96| 亚洲情色五月天| av在线一区二区三区| 日韩人妻无码不卡网站| 强奸熟女一区二区三区 | 久久精品国产亚洲粉嫩| 精品然女一区二区| 中文字幕在线免费观看视频| 国产精品免费日韩| 婷婷五月天激情四射| 欧美性后入| 成人午夜小视频手机在线看| 青娱乐二区免费| 人妻喷水| 欧美日本天堂| 日韩精品亚洲专区在线影视| 午夜精品五区| 操逼视频国产无套| 免费AV中文网在线观看| 精品久9| 99色骚| 青青草在线视频欧美| 色九九综合| 欧美毛片在线网| 国产黄色av大片网站| 亚洲 小说 欧美 激情 另类| 人人妻人人玩人人澡人人爽| 日韩无码第3页| 亚洲宗合网| 久极品在线观看| 麻豆国产免费影片| 午夜偷拍久久熟女| 中文字幕一区电影在线观看| 肏逼视频日本| 国产成人无码啪| 婷婷伊人五月| 成年无码动漫av片无尽在线| 国产白丝精品在线观看| 久久在肏| rion磁力链接| 综合伊人网12色| 久夜视频| 久操97| 欧美色网络| 熟妇一区,二区,三区。| 神马九九九| 日韩熟女视频二区| 91美女視頻| 久久9免费视频| 国产久久久久影院老熟女| 日韩9999| 风骚少妇视频中文字幕| 人妻少妇久久| 加勒比综合88| 青青操网| 日本免费一级AAA大片器| 日韩无码精品综合久久| 玖玖资源综合在线视频| 最新啪啪视频| 国产无遮挡| 欧美日韩人人精品| 亚州综合色图| 久艹免费| 97天天操| 91亚洲电影| 午夜无遮挡男女啪啪视频| 性色av大全| 日日操免费视频| 加勒比在线观看一区二区| 大香蕉一区二区在线观看.| 无码av永久免费专区网站| 国产第25页在线观看| 乱伦日本色图AⅤ| 五月丁香激情综合| 久久久久密| 97一区二区蜜臀| 国产情色第一第二页在线观看| 欧美黑人91| 天堂综合网| 97欧美视频| 开心五月深爱五月| 大香蕉综合久久| 自拍亚洲综合| 91亚洲综合在线| 亚州熟女乱伦| 欧美在线观看综合国产| 操操操操网黑人| 超碰欧美97资源| 97超碰色情| 亚洲精品乱码线路中文字幕| 激情综合网激情五月天| 久久少妇人妻| 超碰人妻97| 成人a级高清视频在线观看| 大香蕉免费乱伦视频| 思思热在线观看| 黄资源| 一级二级在线观看| 果冻国产精品麻豆成人av| 女优视频第10页| 亚洲揄拍网| 98久久超碰| 亚欧性爱ab| 啊啊啊啊啊啊在线看| 九九九九97| 五月亭亭六月丁香| 综合一区中亚洲国产成人综合精品 | 亚洲精品久久久久毛片A片拉屎 | 久久精品国产亚洲AV无码电影| 女人天堂AV五区在线| 久久久久极品| 亚洲天堂五月天国产| 91久久久久久| 天天影视之亚洲综合网| 91人妻中文| 91精品人妻一区二区三区蜜桃臀| 超碰 欧美| 黑人精品一区二区在线播放| 欧洲天天在线| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 精品欧美А∨无码黑人大荫蒂| 久9热| 久草男人天堂| 91快色色色色色| 91精品人妻一区二区三区蜜桃臀| 亚洲欧美综合网| 国产乱码精品一区二区三区四川| 亚av顶级裸体一区二区三区四区五区 | 99热这里只有是精品10| 色黄污美女啪啪啪免费网站| 久久一二三四五六七八九区区区| 91国产丝袜白虎| 日日碰狠狠添天天爽超| 2017超碰| 乳欲人妻办公室奶水| 日韩欧美传媒一区国产| 亚州精人品大香蕉| 亚洲少妇视频| 欧美性天天影视| 91亚洲欧美激情| 狠狠干婷婷| 九九久久久| caorenqi shipin| 男人的天堂VA| 大香蕉在线视频15| 精品免费视频国产一区| 国产情色在线| 蜜乳av首页| 黄色成年| 日本有码影片下载| 2024黄色视频| 91丝袜在线视频| 久干9操| 偷拍片久久| 日本女优在线视频福利| 插插综合网天天影视网| 图色综合网| 国产精品日本无码A片| yazhousetuoumei| 自拍偷拍草一草| 99色婷婷中文字幕乱色| 女人爽到高潮潮喷18禁网站| 青草精品视频-日本久久久久网站| 亚洲综合在线视频| 国产成人久久精品蜜臀| 乱码熟妇人妻久久久| 久久精品亚洲成a人天堂| 99蜜月精品久久| 亚洲av无码成人精品国产| 成人性交午夜免费片| 玖色AV| 熟妇综合一区二区三区| 无卡一区=区| 日产狠狠干| 黄色免费网| 国产精品在线网站| 天天影视综合网欧美精品| 国产亚洲深夜激情| 在线播放中文字幕| 日韩AV一区二区三区三州三州| 91深夜夜| 免费国产视频| 天天操天天日天天干| 色婷婷av在线观看| 操婢日韩| 午夜欧美精品久久久| 蜜臀亚洲综合一二三四区| 久久婷婷精品| 国产美女自拍AV| 久久亚洲日韩国产欧| 欧美 亚洲 制服 精品| 国产女乱淫真高清免费视频| 熟妇乱伦一区二区| 亚洲骚逼少妇| 成人黄页| 看看小穴| 懂色av色欲av蜜臀av| 九九九九亚洲| 韩国三级一线观看久| 91美女国产在线| 精品97精品97| 成人资源中文字幕在线观看天天| 上海一级黄片| 久久 国产 无码| 999国产精品999久久久久久| 国产精品国产| 久久伊人网视频一区二区三区 | 精品人妻一区二区三区夜夜| 亚码激情| 九九热精品视频在线观看| 手机在线中文字幕国产| 色婷婷国产精品一区在线观看| 老熟妇一区二区三区| 97亚洲资源| 欧美综合色站| 狠狠躁AV| www.狠狠干.coom | 在线看片国产精品每日更新| 操b在线观看| 九七超碰| 精品视频一二三中文| 精品超碰色| 99精品久久久久久| 欧美白嫩女HD| 欧美日韩国产男人| 91在线免费观看处女| 色色色综合| 日本午夜久久电影| 人人操人人摸人人看人人插| 久久五月天婷婷丁香中文字幕| 青娱乐淫乱1314| 人人操人人肉久久精品| 中出欧美| 国产1024在线播放| 你懂的在线观看区国产| 一起草视频在线| 人妻熟女一区二区在线视频| 精品欧美乱码久| 神马久久久久久| 人人妻人人澡人人爽人人精品浪潮 | 神马九九九| 蜜桃中文字日产乱幕4区| 女一区二区| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 你操综合| 懂色AV中文| 亚洲精品一区二区免费在线观看| 超碰在线97国产| 中文字幕78| 青草影院内射高潮| 亚欧操逼片在线观看 | 国产夜夜艹| 中文字幕天天天天天| 色婷婷综合久久久久中文一区二区| 91在线免费观看处女| 东京热亚洲一区二区| 开心六月色| 欧美韩国你懂得在线| 亚洲资源网| 亚州免费啪啪视频| 免费看日产一区二区三区| 大香蕉五月天| 999久久久久久久精| 亚洲狼狼干综合1| 偷拍亚洲情色| 大香蕉久久| 肏逼视频日本| 人妻系列无码专区中文有码| 欧美躁死她一区二区| 男人下部插入女人下部| 九九热精彩视频| 亚洲日精品| 九九热AV| 久久久久婷婷| 国产嫩草精品A88AV在线| 日韩 女同 综合| 巨乳特殊服务按摩| 日韩亚洲国产视频| 亚洲欧美大香蕉| 国产成人AV麻豆| 亚欧美色图| 神马久久久久久| 性在久久久久久| 乱伦熟女区| 野狼激情网| 加勒比五月天| 亚洲欧美日韩免费观看| 亚洲一区中文字幕一区| 97久久精品国产| 大香蕉性欧美| 久久精品中文字幕无码l| 亚洲男人bt天堂| 先锋音影AV| 神马午夜久久| 色婷婷电影网| 久久精品99久久久久久| 丰满人妻区一区二区三| 淫荡熟女乱伦网| 亚洲综合113页| 九t超碰| 精品人妻一区二区视频| 天天干天天干天天干| 青青草五月份天| 国产精品盗摄 偷窥盗摄| 五月天婷婷成人网| 色777999综合| 国产偷拍自拍在线视频| 欧插网站| 亚洲欧美不卡线| 日韩欧美经典在线观看| 午夜操操操| 国产熟女完整版中字| 久久色激情一区二区三区| 青青草原av| 色婷婷亚洲婷婷| 日韩大香蕉精品在线视频| 美女操逼A A| 久久久久久性爱片| 婷婷色综合欧美日韩| 天天日少妇逼AV| 欧美一区二区三熟女剧情| 天天影视色香欲综合网小说| 蜜桃久久久久久久| 超碰97网站| 资源在线观一 二| 欧美在线视频观看一二三四区高清 | 狠狠2050在线观看| 日本性爱欧美性爱| 伊人991| 午夜爽爽爽在线观看永久入口姬片| 人人综合| 色999人与兽| 偷拍 亚洲 欧美| 欧洲Au麻豆| 激情熟女12P| 日本丝袜美腿人妻九九| 韩国手机不卡无码三级视频| 免费亚洲国产精品久久一区| 日韩欧美aⅴ综合网站发布| 国产一区二区三区久久精品太古里| 日韩中文字墓| 日韩精品操少妇| 日本人妻中文字幕| 91高潮喷水美女| 午夜精品视频777| 国际精品久久久| 激情开心五月天| 亚洲精品人体| 欧美72网页| 成人性爱视频在线看| 精品少妇人妻| 九色视频91| 一中国女人毛片水真多| 国产美女口爆吞精| 亚洲精品xxx| 久久久精| 91|九色|国产熟女| 91亚洲人| 天美传媒av一区二区| 黑人精品成人一区二区三区| 亚洲性天堂| 欲香欲色天天天综合和网| 中文字幕一区电影在线观看 | 99久久这里只有精品| 色综合国产在线观看| 九九九九精品一区| 熟妇熟女视频一区二区三区| 亚洲成人在线高清| 亚洲成人帖图| 亚洲精品久久久久久久久豆丁网| 顶级丝袜熟女一区二区三区| 伦理第一页| 第二页中文字幕| 中文自拍欧美影视| 成人av福利在线观看| 啊啊啊啊啊好舒服视频| 小草精彩毛片| 香蕉久久国产AV一区二区| 激情婷婷综合久久| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 综合av影片| 2020中文字幕| 国产精品自在线发布| 成人a v在线播放免费| WWW美腿丝袜香蕉中文| 又大又白奶子| 嫩草一区二区在线观看| 欧美成熟性爱精品| 亚洲图片 欧美电影| 青青草精品| 欧美 亚洲 制服 精品| 国产精品视频麻豆入口| 九九AV| 青青草玖玖爱| 撸撸成人在线视频| 五月天社区| 久久久久久国产手机AV| 国产久久成人| 91无遮挡| 变态另类专区| 经典丝袜一区| 韩日巨乳美女免费视频在线观看| 91天天日| 可以看的av| 丁香五月激情综合国产| 操逼国产免费| 国产一区免费午夜视频| www.婷婷| 91丨熟女丨丰满熟女| 亚洲性爱成人| 国产色图乱伦| 国产高清亚洲日韩一区| 97视频免费| 欧美色吧综合| 日韩性色| 久久激情四射婷婷丁香五月天| 日本新免费二区三区| 99亚洲天堂| AV综合中文字幕干| 欧美色综合影院| 天天天天天天天天天天干美女| 日韩人妻制服丝袜av| 日韩偷拍一区二区三区 | 日韩精品熟妇| 亚洲精品天天影视综合网 | 丁香五月天啪啪| 很很热性爱视频| 99热这里只有精品地址| 91足交| 国产人妻天天干精品| 国产97视频免费观看| 国产精品久久99日日| 手机在线人成免费视频| 强奸乱伦av电影| 性在久久久久久| 国产亚州高清国产拍精| 国产色呦呦| 亚洲国产高清福利视频| 国产v片在线免费观看| 亚洲图片激情综合另类| WWW啪啪的com| 操逼操网| 嗯嗯啊啊视频在线看| 欧美超碰9798| 手机不卡视频不卡在线一二三区| 麻豆成人av| 噜噜噜亚洲精品| 国产97综合| 国产精品96| 国产日韩手机视频在线| 成人三一级一片aaa| 2017人人操,人人摸| 婷婷视频在线免费观看| 操逼日韩无码 | 眼镜人妻101.com| 久久五月天婷婷丁香中文字幕| 国产成人在线观看综合| 一起草av| 91视频观看网站| 欧洲与亚洲欧美精品中文字幕| 国产精品大屁股999| 久久伊人影院| 国产精品午夜福利亚洲综合网| 深夜激情无码| 超碰三级秋霞| 丰满精品人妻少妇久久字幕| 久热这里只有精品9| 日韩无码一级黄色av片| 久久av一级av少妇av高潮| 超碰99在线| 国产夫妻一区二区| 日韩丨制服丨中文|在线| 嗯嗯啊啊好爽| 91狼人| 亚州情色j区| 好一吊区二区| 98人妻精品一区二区色欲| 第二页中文字幕| yazhououmeizongya| 九九色图| 麻豆国产精品午夜视频| 国产人妻精品久久久一区二区三区 | 国产女人和拘做爰视频 | 97人人草| 欧美视频中文字幕区| 麻豆久久精品亚洲精品88 | 精品国产一区二区久久| 色综合美国| 蜜桃久久一区二区三区| 成人片在线播放| 丁香五月婷婷五月| 天天干天天干天天干| 丁香五月性| 欧美日韩丝袜 | 新怡红院| 久草婷婷| 欧美精品,四区。五区| 2026国产精品视频| 亚州色图片在线色| 亚洲在线观看| 欧美激情亚洲| 99热在线播放| av影片在线观看不卡| 亚洲欧美综合| 亚洲天堂在线怕怕视频| 日韩 欧美 另类 人妻| 久久久久久久国产视频| 免费a在线播放v| 无码9区| 天天操女人| 射欧美综合| 啊啊啊男女| 上特色A在线| 日韩成人高清一区二区| 视频国产精品未满十八禁止在线观看| 国产精品无码在线| 久久九九网| 午夜天堂网| 九一性生活免费视频| 天天综合,91入口| 操逼A∨| 欧美精品日韩久久久九| 思思性爱| 秋霞男人网| 肉丝无码中文高清| 日韩精品午夜操呦呦不卡影院| 91香蕉国产尤物视频| 多毛小伙内射老太婆| 亚洲精品一区中文字幕乱码| 9 7超碰在线免费观看| 色97国产69香蕉| 国产日韩无码一区二区三区久久区| 欧美人与性动交a美精品| 五月丁香激情综合网| 亚洲AV无码久久精品蜜桃小说| 蜜桃臀一区二区aV | 天天影视网综合少妇| 99热精品国产| 99re6在线视频播放免费精品| 操B视频日韩无码| 欧美综合区| 97久久超碰国产网站| 超碰在线免费一区二区三区| www.色吧5.com| 视频分类 国内精品| 天天享受天天看| 97神马久久| 亚洲熟女精品| 青青草视频爽一爽| 人人妻人人色一区二区三区| 人妻天堂网| 色综合色欲色综合色综合色综合| 动漫片子网站3黄| 亚洲乱妇p22| 久久久久久国产精品免费网站| 99精品免费| 竹菊一区二区三区AV线| 97资源视频| av天天在线观看| 亚洲色图A| 凹凸视频在线观看伊人| 日本天堂网| 校园春色五月天| 亚洲国产欧美中文永久| 亚洲精品骚逼| 麻豆国产视频精品观看| 午夜男人天堂| 这里只有精品97| 91婷婷| 伊人久久亚洲色欲综合网站 | 国产亚洲精品第一最新| 亚洲av热热色| 人妻三级在线中文字幕| 色综合美国| 欧美色综合网| 亚洲中文字幕精品久久久久久直播 | 99九九精品| 国产熟女自拍| 亚洲一区日韩| 热久久无毒不卡| 色呦呦呦在线观看视频| 丝袜天堂网| 欧美人妻精品一区二区| 久久国产精品熟女人妻| 99久久婷婷丁香| 最新av在线| 熟女字幕| 色香91| 久久精品亚洲成a人天堂| 欧美在线|亚洲| 91动漫操逼视频| 天欧美在线| 婷婷色色五月| 亚洲小说视频| 日韩另类色图| 日本视频在线中文字幕| 九九久久久九九| 免费日韩黄片| 国产第11页| 亚洲日韩美国人妻| 久9爱精品| 骚逼高潮久久精品| 97亚洲自在精品在线观看| 女优视频第10页| 91骚熟女| 伊人aaa| 亚洲欧美国产成人综合不卡| 好湿好紧视频| 国内精品不卡无毒99999| 最新日本中文字幕| 欧美精品偷拍| 乱伦熟女区| 96麻豆精品一区二区三区| 97亚洲性爱| 插入逼91| a片亚洲一本通视频| 婷婷五月天AV| 久久永久无码人妻视频| www.高清无码诱惑一区.com| 日本道久久综合色色| 九九热三级片| 亚洲视频二区| 欧美一区二区亚洲天堂| 亚洲色狠| 91视频女生| 美女尤物福利视频| 97在线视频观看| 亚洲中亚日激情视频| 99热色精品| 中文字幕国产| 99久草| 国产午夜视频| 人妻啊啊人妻啊啊| 国产人妖的免费的视频| 日韩综合色图| 天堂资源站| 美女刺激久久国产欧美| 国产三级多多影院2022国产AA一级毛片无码 | 少妇同性| 大伊香蕉在线视频免费| 九九九久久久| 国产区在线| 色欲人妻一区二区在线| 亚洲一区二区性爱电影| 乱伦强奸区日韩| 亚洲清纯唯美| 97碰碰日本乱偷人妻中文的| 97人人射| 亚洲精品一区二区三区在线播放| 欧美一区二区三区不卡高清视频| 97欧美色| 超碰视97中文| 五月天久久婷婷亚洲| 久久最新免费视频23| 人人干人人搞人人摸| 国产黄色剧情影片麻豆免费播放| 国产路线专区| 91日日夜夜| 久久綜合很很很| 一区二区 韩日AV| 秋霞影音一区二区三区| 亚洲情色综合| 精品视频一二三中文| 天堂av最新电影网| 国产精品电| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | A级国产欧美激情在线| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | av毛片aaaaa免费看| 精品欧美乱码久| 久久亚洲天堂| 91爱看| 亚洲97P| 九久9精品| 亚洲色图欧美视频| 无码视频黄色网战| 亚洲免费在线探花| 边做饭边操逼逼| 天天射天天| 农村女一级毛卡片| 性色AV网站| 亚洲本色精品一区二区久久| 人人妻人人澡人人爽久久av| 日韩97在线| 少妇淫妇久久久久久久| 天天综合网网欲色| 精品久| 亚洲成人激情小说视频| 欧美综合天天| 96久久久久| 亚洲无992tv| 玖草在线视频| Av手机版天堂网| 国产成人 综合亚洲 天堂| 国内毛片欧美香蕉精品| 国产无码久久高清| a亚洲欧美色欲| 91视频在线观看18| 精品美女少妇一区二区| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 插入粉嫩少妇视频| 搡老女人老91妇女熟女| 人妻夜爽夜夜爽| 亚洲精品电影| 黄色免费网| 亚洲色欲天天天堂色欲网女| 萌白酱自拍视频| 久热9| 国产熟女少妇一区| 超碰中文字幕人妻草一区| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 色五月婷婷网| 第二页中文字幕| 久久综合女优| 丝袜色综合| 天天操夜夜操| 香蕉黄色一级视频| 日韩不卡av一二三| 丁香五月天视频| 久久久久久波多野吉衣高潮| 久久国产999| 欧美韩国你懂得在线 | 欧美十八禁导航成人| 亚洲精品中文字幕一区在线视频 | 超碰97爽| 伊人991| 91肉丝| 在线色导航| 欧美极品少妇交| 国产乱码精品久久久久久| 欧美性夜| 成人性爱AV在线免费观看| 久久久夜夜嗨免费视频| 中文字幕国产精品1区| 久久久久大香青草精品综合| 91成人18| 国产A v无码专区| 无码91| 老鸭窝日丰县女人| 精品蜜乳AV免费观看| 夜嗨影院| 亚洲色91C| 日日骚网站| 久久国产性爱| 欧美在线色图| 99精品综合久久久久五月天| 99久国产精品午夜性色福利| 欧美成va视频网站| 欧美综合网1| 大香蕉伊人网| 超碰在线99| 亚洲图片 激情小说| 蜜桃臀一区二区三区久久| 成人免费毛片| 韩日精品四区| 在线播放欧洲免费av| 天天视频网站黄| 天天操av懂色| 激情另类激情| 国产精品香蕉热久久新品| 亚洲综合113页| 97色欧洲| 岛国片国产成人亚洲播放| 91亚洲欧美激情| 超碰成人最新最好看| av在线浏览| 一区二区高清视频| 五月丁香婷婷色| 亚洲欧美激情小说| 探花一区二区三| 操一区| 青娱乐福利99| 自拍丝袜美腿人妻| 国产农村妇女精品| 成年女人一区| 国产在线激情| 约操熟妇| 亚州Av天美传媒| 久久国产免费激情视频| 色欲人妻一区二区在线| 一级性爱网| 久草色悠悠在线视频| 97综合久久| 国产精品久久久蜜臀| 91精片| 亚洲少妇诱惑| 欧美在线播放| 日韩少妇丰满亚洲| 四虎国产精品永久在线囯在线| 人人爱夜夜爱| 17c嫩草51久久91嫩草| 蜜桃久久久久久| 国产成人亚洲精品无码最新在线| 午夜精品久久久久| 国产操逼视频在线观看| 久草综合京东| 欧美呦呦性爱| 大香蕉国产中文自拍| 性爱视频无打码在线观看| 啊啊啊啊二区好大| 欧美国产伊人久久久久| 物业黑人 AV一区| 一区二区娱乐网站| 99re这里只有| 欧美成人亚洲精品| 高清无码在线播放网站| 精品视频久久区| 日韩激情中文字幕有码| 干B网| 天天操天天射青青草| 日本 色 导航| 欧美黑人91| 久久久久13| 人妻精品免费一二三区| 是还免费视频1727我| 在线国产一区二区av| 91国模| 中文字幕-区二区三区四区视频中国| 婷婷影院入口| 东京热av影院| 色五月第四色| 天天激情干| 大香蕉狠狠爱| 一区二区三区男女操逼黄色小电影| 黄色网址在线免费观看| 综合五月天| 日韩中文字幕av在线播放| 国产精品香蕉热久久新品| 天天色图| 久久美国毛片| 高潮内射在线| 国产精品无码av| 中国人高清www色视频免费| 伊人网在线观看| 操逼日韩无码 | 91 国产丝袜在线放观看| 国产成人无码啪| 啊啊啊啊啊啊在线观看| 四虎视频在线观看| 五月丁香影院| 久久透逼视频| 亚洲欧美999| 国产欧洲精品亚洲午夜拍精品| 色综合中文字幕不卡| 欧美性爱1080p| 人妻另类 专区 欧美 制服| 亭亭在线资源| 综合日韩激情另类图片| 国产视频一区二区免费| 亚洲天堂一区二区久久| 上床啊啊啊| 伊人午夜福利视频| 国产精品制服丝袜中文字幕日韩一区二区三区 | 情色五月天就去干| 2025亚洲男人天堂| 久久香蕉国产传媒一区剧情天美| 亚欧成人综合影院| 亚洲A曰本VA欧美VA视频| 97伊人超碰| 亚洲天天精品| 久插综合| 97 亚洲 日韩 欧美 在线| 操逼免费视频无码国产| 亚洲中文字母在线播放| 国产精品 久久久精品一牛| 欧美性爱一区二区三区| 超碰伊人在线| 久久25| 国产不卡片| 亚洲欧洲自拍图片专区满春格| 一区二区影视| 欧美亚洲厕所精品偷拍91| 99国产在线绯色一区| 亚洲码专区| 国产亚洲女v在线观看| 国产隔壁老王影院在线| 综合夜夜| 精品无码久久久久久久久果冻糖心| 日韩欧美三级| 蜜臀久久99精品久久久久久成人小说 | www.色婷婷色综合| 香蕉人人操tv| 精品人妻一区二区视频| 思思热久久成人| 熟女激情综合网| 日韩电影在线观看网址| 9久在线视频只有精品| av中亚| 三级日本一区二区三区| 屁股久久久久久久久久| 欧美亚洲小说| 日本506070| 日韩免费簧片| 中文乱码字字幕在线第5页| 日韩免费a级毛片无码a∨| 密臀在线视频| 诱惑网综合| 亚洲性爱成人| a在线视频免费观看| 日本三级日本三级99|