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

ARTICLE DETAIL

資訊詳情

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

Java后端門診服務(wù)聚合系統(tǒng)實戰(zhàn):Spring Boot模塊化設(shè)計與訂單狀態(tài)管理

Java后端門診服務(wù)聚合系統(tǒng)實戰(zhàn):Spring Boot模塊化設(shè)計與訂單狀態(tài)管理 簡介基于Java語言開發(fā)的門診服務(wù)聚合系統(tǒng)設(shè)計源碼面向醫(yī)療信息化開發(fā)者和有一定Java基礎(chǔ)的后端學(xué)習(xí)者可用于解決預(yù)約掛號、排隊叫號、醫(yī)療記錄管理等門診服務(wù)場景中的流程聚合、數(shù)據(jù)管理與系統(tǒng)整合問題。整個資源包共包含51個文件壓縮后大小約220KB其中以34個Java源文件為主另有8個XML配置文件、1個YAML配置、1個properties屬性文件及少量構(gòu)建與部署文件Java源文件承載各功能模塊的業(yè)務(wù)邏輯配置文件負(fù)責(zé)管理數(shù)據(jù)庫連接、事務(wù)處理和安全控制等參數(shù)整體結(jié)構(gòu)清晰便于按模塊查看與復(fù)用。目前已有246人學(xué)習(xí)/下載系統(tǒng)采用模塊化、服務(wù)化開發(fā)思想結(jié)合Spring Boot、Spring MVC和MyBatis完成后端業(yè)務(wù)處理前端通過AJAX方式與后端交互并引入Spring Security增強(qiáng)醫(yī)療數(shù)據(jù)訪問安全。配套文檔提供了項目介紹、接口說明和部署指引讀者結(jié)合源碼可以梳理從功能模塊劃分到數(shù)據(jù)持久化的完整設(shè)計鏈路也能借鑒其在用戶管理、預(yù)約掛號、排隊叫號、醫(yī)療記錄管理等模塊的代碼組織方式為同類醫(yī)療信息化項目提供有價值的參考。1. 門診服務(wù)聚合系統(tǒng)為什么一個Java后端能頂?shù)羧齻€窗口患者就診最煩的不是排隊而是為了“辦好一件事”在掛號、繳費(fèi)、報告窗口之間來回跑。門診服務(wù)聚合系統(tǒng)的思路很直接把掛號、候診隊列、繳費(fèi)單、報告狀態(tài)這些分散在不同科室、不同系統(tǒng)里的服務(wù)用同一個Java后端統(tǒng)一聚合起來。前端只需要調(diào)一次接口就能拿回患者當(dāng)前的全部就診進(jìn)度。它適合課程設(shè)計、畢業(yè)設(shè)計也適合小型診所自建門診系統(tǒng)。很多人拿到這類源碼項目第一反應(yīng)是拆微服務(wù)結(jié)果還沒開始寫就被注冊中心、配置中心拖住。門診場景并發(fā)沒那么極端用Spring Boot做模塊化聚合先把訂單狀態(tài)串起來才是性價比最高的做法。2. 門診聚合系統(tǒng)的模塊拆分與數(shù)據(jù)庫設(shè)計把掛號、繳費(fèi)、報告做成可聯(lián)調(diào)的表結(jié)構(gòu)門診聚合系統(tǒng)的核心不在代碼而在數(shù)據(jù)模型。我見過不少java課程設(shè)計案例源碼所有業(yè)務(wù)邏輯堆在一個Controller里數(shù)據(jù)庫只有三張表一聯(lián)調(diào)就露餡。聚合系統(tǒng)要聚合的是“一次完整的就診數(shù)據(jù)”如果表結(jié)構(gòu)里連統(tǒng)一訂單號都沒有后面所有接口都只能東拼西湊。這一章先講清楚模塊怎么分再給出一套可以直接建表的SQL。2.1 聚合系統(tǒng)的核心模塊劃分患者端、醫(yī)生端、統(tǒng)一網(wǎng)關(guān)層聚合服務(wù)不一定要拆成微服務(wù)。我一般把工程拆成四個Maven模塊就夠用common模塊放統(tǒng)一返回體、業(yè)務(wù)異常、訂單號生成器、狀態(tài)枚舉aggregation模塊是真正對外提供聚合接口的BFF層負(fù)責(zé)把其他模塊返回的碎片數(shù)據(jù)組裝成前端需要的視圖模型patient模塊負(fù)責(zé)預(yù)約掛號、支付、報告查詢doctor模塊負(fù)責(zé)排班、叫號、醫(yī)生工作臺。每個模塊按包名隔離最終打成一個可執(zhí)行jar包。這樣既保留了模塊邊界又不需要部署多個進(jìn)程課程設(shè)計的答辯現(xiàn)場也不會因為起不來服務(wù)而翻車。為什么這樣拆因為聚合系統(tǒng)最忌諱把聚合邏輯和基礎(chǔ)業(yè)務(wù)寫在一起。聚合層只做編排不碰業(yè)務(wù)細(xì)節(jié)業(yè)務(wù)模塊只關(guān)心自己的領(lǐng)域不需要知道前端要什么字段。典型例子是患者首頁要同時顯示“待繳費(fèi)金額”和“報告已出”兩個信息聚合層拿到patient模塊的數(shù)據(jù)后直接組裝不再查一次數(shù)據(jù)庫。如果讓patient模塊直接返回視圖對象下次前端要加一個字段就得改patient模塊并重新測試聚合層形同虛設(shè)。2.2 核心表結(jié)構(gòu)與訂單狀態(tài)串起全流程下面是一套我在類似項目中用的核心建表SQL基于MySQL 8.0。第一張是“就診聚合訂單主表”整個系統(tǒng)的所有流程都圍繞它轉(zhuǎn)。-- 就診聚合訂單主表將掛號、繳費(fèi)、取藥、報告串聯(lián) CREATE TABLE t_treatment_order ( id bigint NOT NULL AUTO_INCREMENT COMMENT 物理主鍵, order_no varchar(32) NOT NULL COMMENT 業(yè)務(wù)訂單號全局唯一, patient_id bigint NOT NULL COMMENT 患者ID, doctor_id bigint NOT NULL COMMENT 醫(yī)生ID, dept_id bigint NOT NULL COMMENT 科室ID, schedule_id bigint NOT NULL COMMENT 排班ID, status tinyint NOT NULL DEFAULT 0 COMMENT 狀態(tài)0待支付,1已支付待就診,2候診中,3就診中,4待取藥,5已完成,6已取消, pay_type tinyint DEFAULT NULL COMMENT 支付方式1微信,2支付寶,3醫(yī)保, total_amount decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 訂單總額, paid_amount decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 實付金額, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_patient_status (patient_id,status), KEY idx_doctor_status (doctor_id,status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT門診聚合訂單主表;訂單主表的status字段是整套系統(tǒng)的狀態(tài)樞紐。0是待支付1是已支付待就診2開始進(jìn)入候診3就診中4待取藥5完成6取消。注意狀態(tài)0不是“已創(chuàng)建”因為門診掛號的號源是稀缺資源如果允許創(chuàng)建訂單后一直不支付號源會被無限制占用所以我一般會加上“30秒內(nèi)未支付自動取消”的定時任務(wù)。對外暴露用order_no而不是自增id既防止被遍歷也方便在多個模塊間傳遞。接下來是支付流水子表和候診排隊子表。支付流水必須拆出來因為同一個訂單在多科室就診時可能發(fā)生多筆支付比如先微信付掛號費(fèi)再在診室補(bǔ)繳檢查費(fèi)。候診排隊子表單獨(dú)存叫號狀態(tài)方便護(hù)士站刷新隊列。CREATE TABLE t_payment ( id bigint NOT NULL AUTO_INCREMENT, payment_no varchar(32) NOT NULL COMMENT 支付流水號, order_no varchar(32) NOT NULL, pay_channel tinyint NOT NULL COMMENT 1微信,2支付寶,3醫(yī)保, pay_status tinyint NOT NULL DEFAULT 0 COMMENT 0待支付,1支付中,2成功,3失敗,4已退款, trade_no varchar(64) DEFAULT NULL COMMENT 渠道交易號, amount decimal(10,2) NOT NULL, callback_time datetime DEFAULT NULL COMMENT 渠道回調(diào)時間, PRIMARY KEY (id), UNIQUE KEY uk_payment_no (payment_no), KEY idx_order_no (order_no) ) ENGINEInnoDB COMMENT支付流水子表; CREATE TABLE t_queue ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL, doctor_id bigint NOT NULL, queue_no int NOT NULL COMMENT 當(dāng)天叫號序號, status tinyint NOT NULL DEFAULT 0 COMMENT 0等待,1呼叫中,2過號,3已就診, called_time datetime DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_order_doctor (order_no,doctor_id), KEY idx_doctor_status (doctor_id,status) ) ENGINEInnoDB COMMENT候診排隊子表;支付流水表里pay_status和訂單表status是兩個維度的狀態(tài)。支付流水只關(guān)心這筆錢有沒有付成功訂單狀態(tài)關(guān)心整個就診流程走到哪一步。如果混在一起取消訂單、退款、部分支付這些場景會非常難寫。候診隊列的queue_no是當(dāng)天從1開始累加的序號不是全局自增這個字段在叫號時直接展示所以不需要全局唯一。2.3 報告狀態(tài)同步表LIS/PACS不是你的系統(tǒng)門診報告檢驗、檢查往往不由聚合系統(tǒng)生成而是由LIS或PACS系統(tǒng)負(fù)責(zé)。聚合服務(wù)要拿到報告狀態(tài)常見做法是“同步狀態(tài)不同步文件”。在本地建一張報告狀態(tài)同步表通過定時任務(wù)或回調(diào)更新。CREATE TABLE t_report_status ( id bigint NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL, report_type tinyint NOT NULL COMMENT 1檢驗,2檢查, report_name varchar(128) NOT NULL, status tinyint NOT NULL DEFAULT 0 COMMENT 0未出,1已出,2已領(lǐng)取, result_url varchar(256) DEFAULT NULL COMMENT 報告文件地址, PRIMARY KEY (id), KEY idx_order_no_status (order_no,status) ) ENGINEInnoDB COMMENT報告狀態(tài)同步表;本地只存報告元數(shù)據(jù)患者查詢時先讀本地狀態(tài)status1且result_url存在再跳轉(zhuǎn)到文件服務(wù)。如果直接去LIS系統(tǒng)查詢每次患者刷新首頁都會把壓力打到檢驗科的系統(tǒng)這是典型的“聚合系統(tǒng)拖垮被聚合系統(tǒng)”的翻車現(xiàn)場。聚合查詢時還有一個容易踩的坑不要試圖用一條大SQL把訂單、支付、隊列、報告全部LEFT JOIN出來。如果同一訂單有多筆支付結(jié)果集會從一行變多行Java組裝時還得去重。我在第3章里說的聚合層“分多次查詢用Java組裝”就是因為這個。數(shù)據(jù)庫不擅長做視圖拼接Java配合CompletableFuture反而又清晰又快。3. 用Spring Boot搭建門診聚合服務(wù)最小可運(yùn)行項目的核心代碼這一章進(jìn)入動手環(huán)節(jié)。我會把項目骨架、聚合接口、關(guān)鍵配置拆開講給出一套能直接跑起來的最小核心代碼。讀者只要照著建表再把下面代碼填進(jìn)自己工程就能把聚合接口跑通。3.1 項目骨架與依賴版本先用一套穩(wěn)妥的Java技術(shù)棧門診聚合系統(tǒng)的選型不能太激進(jìn)。我一般用Spring Boot 2.7.x配Java 8因為很多課程設(shè)計環(huán)境、學(xué)校機(jī)房、舊服務(wù)器都還是Java 8。如果直接上Spring Boot 3.x要求Java 17不少人會在環(huán)境變量配置或IDE編譯那一步卡住最后還沒跑起來就放棄了。如果你已經(jīng)有java基礎(chǔ)想嘗鮮也可以升到3.x但下面代碼基于2.7更穩(wěn)。核心依賴如下parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version relativePath/ /parent dependencies !-- Web入口 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 數(shù)據(jù)庫訪問 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.2/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.0.33/version /dependency !-- 緩存用于排班與門診狀態(tài)查詢 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !-- 參數(shù)校驗 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies參數(shù)說明MyBatis Plus 3.5.3.2這個版本跟Spring Boot 2.7配合很穩(wěn)定不會有兼容性報錯。mysql-connector-j 8.0.33是MySQL 8.x的官方驅(qū)動注意驅(qū)動類名是com.mysql.cj.jdbc.Driver老項目里寫的com.mysql.jdbc.Driver已經(jīng)廢棄。Redis在這套方案里不是強(qiáng)依賴如果只想把源碼跑通可以先把Redis依賴注釋掉但后面第4章要講分布式鎖建議還是配上。3.2 一個聚合Controller把掛號詳情、候診隊列、繳費(fèi)單、報告狀態(tài)一次返回聚合層的關(guān)鍵是“并行查詢、統(tǒng)一超時、失敗降級”。下面這個Controller是整套系統(tǒng)最核心的對外接口患者進(jìn)入門診首頁時前端只調(diào)它一次就能拿回今天的全部就診信息。RestController RequestMapping(/api/aggregation) RequiredArgsConstructor public class TreatmentAggregationController { private final TreatmentOrderService orderService; private final QueueService queueService; private final PaymentService paymentService; private final ReportService reportService; private final AggregationThreadPool pool; GetMapping(/patient/today) public ApiResultTreatmentFlowVO getTodayTreatment(RequestParam Long patientId) { // 1. 先查訂單主表拿到患者今天的主訂單 TreatmentOrder order orderService.findTodayOrder(patientId); if (order null) { return ApiResult.success(TreatmentFlowVO.empty()); } // 2. 并行查詢支付、候診、報告狀態(tài)互不阻塞 CompletableFuturePaymentVO paymentFuture CompletableFuture.supplyAsync(() - paymentService.getLatest(order.getOrderNo()), pool); CompletableFutureQueueVO queueFuture CompletableFuture.supplyAsync(() - queueService.getCurrent(order.getOrderNo()), pool); CompletableFutureListReportVO reportFuture CompletableFuture.supplyAsync(() - reportService.listByOrder(order.getOrderNo()), pool); // 3. 整體超時1200毫秒任何一個子任務(wù)卡住都直接失敗 try { CompletableFuture.allOf(paymentFuture, queueFuture, reportFuture).get(1200, TimeUnit.MILLISECONDS); } catch (Exception e) { throw new BusinessException(門診信息查詢超時請稍后重試); } // 4. 組裝視圖對象如果某個子查詢失敗則返回空值 TreatmentFlowVO vo new TreatmentFlowVO(); vo.setOrderNo(order.getOrderNo()); vo.setOrderStatus(order.getStatus()); vo.setPayment(paymentFuture.getNow(PaymentVO.empty())); vo.setQueue(queueFuture.getNow(QueueVO.empty())); vo.setReports(reportFuture.getNow(Collections.emptyList())); return ApiResult.success(vo); } }邏輯說明第一步查訂單主表是串行的因為后面所有查詢都依賴orderNo。第二步用CompletableFuture把三個獨(dú)立查詢并行化這里有一個新手高頻翻車點(diǎn)默認(rèn)的ForkJoinPool適合CPU密集任務(wù)不適合IO密集的數(shù)據(jù)庫查詢必須自定義線程池否則并發(fā)一上來會餓死應(yīng)用里的其他并行流。第三步用allOf().get(1200ms)統(tǒng)一超時意味著任何一個子查詢超過1.2秒整個接口直接失敗而不是無限等。第四步用getNow取默認(rèn)值即使某個子任務(wù)拋了異常也能把其余正常數(shù)據(jù)返回給前端做到局部降級。超時參數(shù)1200毫秒不是隨便定的。自助機(jī)、手機(jī)端患者操作的感知閾值通常在1秒左右如果后端占滿1200毫秒前端只剩800毫秒渲染勉強(qiáng)及格。如果在內(nèi)網(wǎng)環(huán)境可以提到1500毫秒超過這個值說明有慢SQL該去查執(zhí)行計劃而不是調(diào)超時。3.3 關(guān)鍵配置參數(shù)線程池、連接池、Redis緩存超時聚合接口的穩(wěn)定性不在代碼在配置。下面是一份我驗證過的application.yml核心配置spring: datasource: url: jdbc:mysql://localhost:3306/clinic?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: root hikari: maximum-pool-size: 20 minimum-idle: 5 connection-timeout: 3000 redis: host: localhost port: 6379 timeout: 1000ms lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 mybatis-plus: configuration: map-underscore-to-camel-case: true global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 app: aggregation: core-pool-size: 4 max-pool-size: 8 queue-capacity: 50 query-timeout: 1200參數(shù)說明HikariCP的maximum-pool-size設(shè)成20對單體門診系統(tǒng)足夠。connection-timeout設(shè)為3000毫秒意味著拿連接超過3秒直接報錯避免線程全部卡死在等連接上。Redis的timeout是1000ms如果Redis抖動寧可讓緩存查詢失敗走數(shù)據(jù)庫也不拖垮聚合接口。app.aggregation是自定義參數(shù)對應(yīng)線程池構(gòu)造核心4個線程、最大8個、隊列容量50。這里不要開太大因為聚合接口一次會同時占用三個線程線程數(shù)開成8極限只能支撐約2.6個并發(fā)聚合請求但好處是每個請求都有獨(dú)立線程不會因為等待線程池排隊而超時。想要支持更高并發(fā)應(yīng)該縮短子查詢耗時而不是盲目加大線程池。補(bǔ)充一個關(guān)于緩存的建議聚合查詢不要緩存訂單主表。支付回調(diào)改庫后緩存不失效患者端會一直看到舊狀態(tài)。我通常只緩存報告狀態(tài)列表和醫(yī)生排班TTL設(shè)5分鐘后臺修改排班后主動刪除對應(yīng)緩存鍵。這樣既減少了數(shù)據(jù)庫壓力又不用寫一套復(fù)雜緩存一致性邏輯。4. 門診聚合系統(tǒng)的核心業(yè)務(wù)實現(xiàn)預(yù)約掛號與聚合支付對賬這一章講兩個最容易出問題的業(yè)務(wù)預(yù)約掛號和支付對賬。業(yè)務(wù)實現(xiàn)不好前面的聚合接口再漂亮也是空殼?!癹ava怎么保證數(shù)據(jù)一致性”是面試??嫉母哳l題也是這套系統(tǒng)里真正的難點(diǎn)。4.1 預(yù)約掛號的分布式鎖與重復(fù)下單防護(hù)預(yù)約掛號是門診聚合系統(tǒng)里并發(fā)壓力最大的接口。真實場景是8點(diǎn)放號同一秒內(nèi)幾百人搶一個專家號如果沒有防護(hù)訂單表會出現(xiàn)同一患者同一排班的多條重復(fù)訂單。解決方案分三層數(shù)據(jù)庫唯一索引做兜底、Redis鎖做前置攔截、業(yè)務(wù)層再次校驗。下面這個RedisLock工具類是可運(yùn)行的版本Component public class RedisLock { Resource private StringRedisTemplate stringRedisTemplate; /** * 嘗試加鎖過期時間默認(rèn)10秒 */ public boolean tryLock(String key, String requestId, long expireSeconds) { // 使用setnx 過期時間保證原子性 return Boolean.TRUE.equals(stringRedisTemplate.opsForValue() .setIfAbsent(key, requestId, expireSeconds, TimeUnit.SECONDS)); } public void unlock(String key, String requestId) { String value stringRedisTemplate.opsForValue().get(key); if (requestId.equals(value)) { // 只刪除自己持有的鎖 stringRedisTemplate.delete(key); } } }在掛號服務(wù)里的用法String lockKey appointment:lock: scheduleId : patientId; String requestId UUID.randomUUID().toString(); boolean locked redisLock.tryLock(lockKey, requestId, 10); if (!locked) { throw new BusinessException(請不要重復(fù)提交掛號請求); } try { // 再次查數(shù)據(jù)庫防止鎖處理期間已經(jīng)有訂單 int count treatmentOrderMapper.countByScheduleAndPatient(scheduleId, patientId); if (count 0) { throw new BusinessException(您已掛過該號源請勿重復(fù)掛號); } treatmentOrderService.createOrder(...); } finally { redisLock.unlock(lockKey, requestId); }邏輯說明lockKey由排班ID和患者ID組成鎖粒度精確到“某個患者掛某個號”不是整個排班一把鎖。requestId是隨機(jī)UUID解鎖時校驗是不是自己加的鎖防止因為鎖過期把別人的鎖誤刪。過期時間10秒正常創(chuàng)建訂單不到1秒10秒足夠但如果數(shù)據(jù)庫卡了10秒以上鎖自動釋放后續(xù)線程能拿到鎖就可能再次產(chǎn)生重復(fù)訂單。所以數(shù)據(jù)庫唯一索引仍然是最后一道防線Redis鎖只是降低沖突概率。這里還有一個隱藏細(xì)節(jié)tryLock里的setIfAbsent和expire必須是原子操作不能先setnx再單獨(dú)expire否則setnx成功后進(jìn)程突然退出鎖永不釋放整個號源會被鎖死。上面代碼用的帶過期時間的setIfAbsent重載方法就是Redis官方推薦的原子寫法。4.2 聚合支付回調(diào)與對賬java怎么保證數(shù)據(jù)一致性支付是聚合系統(tǒng)最需要摳細(xì)節(jié)的地方?;颊呖赡芟扔梦⑿鸥稈焯栙M(fèi)再在診室補(bǔ)繳藥費(fèi)兩筆支付掛在同一個訂單號下。微信和支付寶的回調(diào)是異步的不保證只通知一次所以回調(diào)接口必須先做冪等再寫庫。下面這段代碼是核心處理邏輯Transactional(rollbackFor Exception.class) public void handlePayCallback(PayCallbackRequest req) { // 1. 用支付流水號作為冪等鍵 String paymentNo req.getPaymentNo(); Integer currentStatus paymentMapper.selectStatusByPaymentNo(paymentNo); if (currentStatus ! null currentStatus 2) { // 該流水已支付成功直接返回不重復(fù)處理 return; } // 2. 校驗渠道簽名與金額 boolean signOk payChannelService.verifySign(req); if (!signOk) { throw new BusinessException(支付回調(diào)簽名校驗失敗); } PaymentEntity payment paymentMapper.selectByPaymentNo(paymentNo); if (payment null) { log.warn(回調(diào)的支付流水不存在: {}, paymentNo); return; } // 3. 更新支付流水狀態(tài) payment.setPayStatus(2); payment.setTradeNo(req.getTradeNo()); payment.setCallbackTime(new Date()); paymentMapper.updateById(payment); // 4. 嘗試推進(jìn)訂單狀態(tài) treatmentOrderService.tryAdvanceOrder(payment.getOrderNo()); }冪等處理分兩步第一步進(jìn)來先查當(dāng)前支付流水狀態(tài)如果已經(jīng)是成功payStatus2就直接返回不重復(fù)改訂單。這個判斷防的是延遲重復(fù)通知。第二步真正的高并發(fā)沖突要用數(shù)據(jù)庫樂觀鎖兜底。把updateById改成帶條件的更新UPDATE t_payment SET pay_status 2, trade_no #{tradeNo}, callback_time #{now} WHERE payment_no #{paymentNo} AND pay_status ! 2影響行數(shù)為0時說明已經(jīng)被其他線程處理過直接返回。這樣即使兩個回調(diào)線程并發(fā)進(jìn)入也只有一條SQL能更新成功。tryAdvanceOrder做的是狀態(tài)機(jī)推進(jìn)只有當(dāng)一個訂單所有支付流水掛號費(fèi)、檢查費(fèi)、藥費(fèi)全部成功才能把訂單狀態(tài)從“待支付”變成“已支付待就診”。這里不能只更新支付流水就改訂單狀態(tài)否則可能患者只付了掛號費(fèi)系統(tǒng)就認(rèn)為整個訂單已經(jīng)支付完成候診隊列會提前放行。如果只依賴回調(diào)一旦回調(diào)丟失患者明明付了錢訂單還停在待支付就需要補(bǔ)償對賬。常見做法是每天凌晨跑一個定時任務(wù)調(diào)用支付渠道提供的賬單下載接口逐筆比對本地payment表和渠道賬單把本地仍然待支付但渠道已扣款的單子找出來主動刷新狀態(tài)。這個對賬任務(wù)在源碼里至少留一個接口入口面試時說到“數(shù)據(jù)一致性”可以按“回調(diào)冪等樂觀鎖定時對賬”三層去講比背八股文有意思得多。4.3 狀態(tài)機(jī)設(shè)計從待支付到已完成的流轉(zhuǎn)門診訂單狀態(tài)不能靠代碼里到處setStatus亂跳。我一般把狀態(tài)機(jī)寫成枚舉再提供一個統(tǒng)一流轉(zhuǎn)方法public enum OrderStatus { PENDING_PAY(0, 待支付), PAID(1, 已支付待就診), WAITING(2, 候診中), TREATING(3, 就診中), WAIT_MEDICINE(4, 待取藥), DONE(5, 已完成), CANCELED(6, 已取消); private final int code; private final String desc; } public class OrderStateMachine { private static final MapInteger, SetInteger ALLOW_TRANSITIONS new HashMap(); static { ALLOW_TRANSITIONS.put(0, Set.of(1, 6)); // 待支付 - 已支付/取消 ALLOW_TRANSITIONS.put(1, Set.of(2, 6)); // 已支付 - 候診中/取消 ALLOW_TRANSITIONS.put(2, Set.of(3)); // 候診中 - 就診中 ALLOW_TRANSITIONS.put(3, Set.of(4, 5)); // 就診中 - 待取藥/已完成 ALLOW_TRANSITIONS.put(4, Set.of(5)); // 待取藥 - 已完成 } public static void transition(OrderEntity order, OrderStatus target) { SetInteger allowed ALLOW_TRANSITIONS.get(order.getStatus()); if (allowed null || !allowed.contains(target.getCode())) { throw new BusinessException(非法狀態(tài)流轉(zhuǎn): order.getStatus() - target.getCode()); } order.setStatus(target.getCode()); } }狀態(tài)機(jī)的好處是避免“已取消還能變成候診中”這種邏輯漏洞。注意狀態(tài)值從0到6和第2章表結(jié)構(gòu)一致。為什么支付成功后不能直接跳到就診中因為中間還需要生成候診隊列記錄叫號系統(tǒng)只有在“已支付待就診”狀態(tài)才能進(jìn)入隊列。如果直接跳到候診中排班和隊列的數(shù)據(jù)對不上護(hù)士站會看到患者不在隊列里。5. 門診服務(wù)聚合系統(tǒng)排查5個高頻踩坑與解決記錄這一章不是網(wǎng)上復(fù)制的java八股文是我實際調(diào)門診聚合系統(tǒng)時踩過的坑。每條按“現(xiàn)象、原因、解決”寫讀者可以直接按圖索驥排查。5.1 掛號成功后查詢不到聚合記錄事務(wù)邊界不一致現(xiàn)象患者在掛號接口返回成功后前端立刻調(diào)用聚合查詢首頁接口結(jié)果提示“今日無就診記錄”隔幾秒再查又有記錄。原因掛號接口里開啟事務(wù)后先插入主訂單再更新排班余票事務(wù)還沒提交就對外返回成功聚合查詢在另一個數(shù)據(jù)庫連接里讀不到未提交的數(shù)據(jù)。如果系統(tǒng)用了主從分離還可能是主從延遲。解決單體項目里Transactional的事務(wù)提交發(fā)生在方法返回前所以問題大多不在應(yīng)用事務(wù)而在主從延遲。聚合查詢關(guān)鍵數(shù)據(jù)強(qiáng)制走主庫最簡單的方式是在聚合Service里使用一個獨(dú)立DataSource路由到主庫。同時可以在訂單創(chuàng)建后刪除該患者的訂單緩存聚合接口先查Redis查不到再走主庫能大幅降低延遲影響。5.2 支付回調(diào)重復(fù)通知導(dǎo)致狀態(tài)錯亂沒有做冪等現(xiàn)象患者微信支付成功后訂單狀態(tài)被反復(fù)更新最后一次更新被覆蓋回“待支付”導(dǎo)致患者已付款卻被叫號系統(tǒng)拒絕。原因微信回調(diào)會多次通知高并發(fā)下兩個線程同時讀到支付流水是待支付都執(zhí)行了狀態(tài)更新。如果回調(diào)接口沒有冪等判斷也沒有樂觀鎖后來的線程會把已成功狀態(tài)覆蓋回去。解決回調(diào)入口先按payment_no加分布式鎖鎖內(nèi)再查狀態(tài)更新語句必須帶條件“WHERE pay_status ! 2”訂單狀態(tài)推進(jìn)放在支付流水更新之后用事務(wù)包裹。這樣即使渠道重復(fù)通知十次也只有第一筆能真正生效。5.3 聚合查詢超時拖垮整個接口慢SQL與N1現(xiàn)象聚合接口響應(yīng)時間從200毫秒漲到5秒壓測時線程池被打滿連登錄接口也跟著變慢。原因查詢報告列表時在循環(huán)里逐條查報告明細(xì)典型的N1問題t_payment表數(shù)據(jù)量上來后order_no字段沒有索引LEFT JOIN變成全表掃描。解決報告列表用一次in查詢替代循環(huán)給t_payment的order_no加普通索引聚合線程池單次任務(wù)超時控制在800毫秒內(nèi)超過直接返回空。壓測后我保留一個習(xí)慣所有聚合子查詢SQL單獨(dú)打印執(zhí)行計劃先看rows是不是幾十萬再談加緩存。5.4 科室排班數(shù)據(jù)緩存穿透空值緩存與布隆過濾器現(xiàn)象醫(yī)生突然停診前端查排班緩存為空大量請求直接打到數(shù)據(jù)庫數(shù)據(jù)庫CPU報警。原因緩存里沒有對應(yīng)排班鍵時請求會穿過緩存直擊數(shù)據(jù)庫。搶號高峰時一個不存在的scheduleId可能被刷幾千次數(shù)據(jù)庫撐不住。解決排班查詢加空值緩存把null值緩存起來并設(shè)置TTL 60秒更嚴(yán)的場景在接口層用布隆過濾器把有效scheduleId集合放進(jìn)去能濾掉絕大多數(shù)無效請求。布隆過濾器適合排班ID這種整體變化頻率低的場景刪除排班時要重建過濾器否則新排班會查不到。5.5 部署后接口報日期格式錯誤Jackson時間序列化配置現(xiàn)象前端看到的createTime是“2023-12-01T10:00:00”部分老瀏覽器解析失敗就診日期顯示NaN。原因Java 8時間類型默認(rèn)序列化不格式化后端返回ISO格式前端期望“yyyy-MM-dd HH:mm:ss”。解決在application.yml里統(tǒng)一配置spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8所有LocalDateTime和Date字段會按統(tǒng)一格式輸出。同時確認(rèn)jdbc連接參數(shù)里有serverTimezoneAsia/Shanghai否則存儲和讀取會各差8小時。這個坑通常在本地Windows環(huán)境不出現(xiàn)部署到Linux服務(wù)器后突然冒出來因為本機(jī)時區(qū)和服務(wù)器時區(qū)不一致。6. 門診服務(wù)聚合系統(tǒng)的進(jìn)階驗證用Docker一鍵起全套環(huán)境并統(tǒng)計聚合成功率項目跑通后真正要問自己的是聚合接口到底成功了多少次失敗分支占多少第2章到第5章解決了“能不能用”這一章解決“用了之后怎么驗證它真的好用”。6.1 用docker-compose快速拉起MySQL與Redis聯(lián)調(diào)最怕環(huán)境不一致。我習(xí)慣在項目里放一個docker-compose.yml讓評審和同學(xué)一條命令起全套基礎(chǔ)環(huán)境。version: 3 services: mysql: image: mysql:8.0 container_name: clinic-mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: clinic ports: - 3306:3306 command: --default-time-zone08:00 redis: image: redis:7-alpine container_name: clinic-redis ports: - 6379:6379注意command里加了--default-time-zone08:00這是為了規(guī)避容器默認(rèn)UTC時區(qū)和服務(wù)器本地時間不一致的問題。很多人本地跑MySQL好好的部署到服務(wù)器后所有時間字段差8小時就是因為沒設(shè)置時區(qū)。6.2 在聚合網(wǎng)關(guān)埋點(diǎn)統(tǒng)計聚合成功率驗證聚合接口是否健康可以寫一個簡單的AOP切面統(tǒng)計所有聚合Controller的成功和失敗次數(shù)。Aspect Component public class AggregationMetricAspect { private final AtomicLong successCount new AtomicLong(); private final AtomicLong failCount new AtomicLong(); Around(execution(* com.clinic.gateway..*Controller.*(..))) public Object count(ProceedingJoinPoint pjp) throws Throwable { long start System.currentTimeMillis(); try { Object result pjp.proceed(); successCount.incrementAndGet(); log.info(aggregation success, cost{}ms, System.currentTimeMillis() - start); return result; } catch (Exception e) { failCount.incrementAndGet(); log.error(aggregation fail, e); throw e; } } }再通過Spring Boot Actuator暴露一個自定義Endpoint把successCount和failCount輸出成JSON。這樣壓測的時候能看到失敗率也能在聯(lián)調(diào)時快速發(fā)現(xiàn)某個子服務(wù)掛了導(dǎo)致聚合接口整體失敗。統(tǒng)計出來的數(shù)據(jù)比我自己的感覺可靠得多——有一次我覺得系統(tǒng)很穩(wěn)結(jié)果失敗率1.2%排查后發(fā)現(xiàn)是候診隊列子查詢偶爾拋超時異常被全局異常處理器吞成了空隊列返回前端顯示“正在候診”但其實隊列里沒人。我在這套系統(tǒng)里吃過最大的虧就是只測主流程、沒測支付回調(diào)重復(fù)通知上線第二天被對賬數(shù)據(jù)打臉。后來我強(qiáng)制自己把每個對外接口都當(dāng)成“會被重復(fù)調(diào)用”來設(shè)計冪等鍵先行再到狀態(tài)機(jī)里檢查非法流轉(zhuǎn)這個習(xí)慣幫我避開了很多類似的坑。聚合系統(tǒng)的價值不在用了多新的框架而在把狀態(tài)邊界和失敗分支理順。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情综合五月婷婷| 日本媚薬中文字幕在线| 国产精品天美传媒| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 91亚.色| www.色99| www.婷婷五月天| 在线观看高清AV| 欧美综合综合| 91欧| 亚洲欧洲久久天堂| 强奸乱伦亚洲第一页| 夜夜嗨一区二区三区直播内容| 欧美伦乱爱| 人妻碰碰碰碰碰碰| 天天综合网站| 五月色网| 日韩在线观看中文字幕视频| a级理论午夜日本| 99视频这有这里有精品| 亚洲美女AV无码| 在线小视频| 熟妇亚洲一区二区三区| 美中韩AV综合网| 郑州宾馆老熟女露脸啪啪| 国产最火爆久久国产网站网站| 色爱亚洲| 青青草福利视频| 人妻99p| 26uuu国产日韩综合在线观看| 97欧美日韩综合| 大屁股熟女一区二区三区| 久久神马影院| 日韩97精| 狠狠干2020| 亚洲性猛| 日本亚欧爱爱| asc国产精品| 日本一二三免费久久| 97超碰总站| 使劲用力艹少妇视频一区二区| 欧美久久毛片基地| 天堂国产AV| 超碰97玖玖爱| 久久久∴| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久热最新在线杭州| 欧美日韩精品青青| 97这里有精品| 国产400孕妇孕交群| 91网站18禁| 欧美碰碰综合色| 亚欧美综合网| 狠狠婷婷亚洲中文综合久久| 超碰在线人妻中文字幕| 欧美人与性动交a美精品| 97在线精品观看视频| 免费啪啪av| 思思热免费视频观看| 九月丁香婷婷| 国产黄色动态精品| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 人妻少妇精品视频一区二区三区| 蜜臀99久久精品久久久懂爱| 欧美日韩国产成人高清| 亚洲熟女中文字幕在线| 香蕉在线一区二区三区| 中文字幕女同在线| 激情欧美97| www.亚洲黄色| 青青操少妇| 91在线/欧洲| 激情综合97| 亚洲日韩肥臀视频在线观看| 免费看污网址| 久久丝袜| AA特级绝黄| 99热这里都是精品| 日韩中文字幕av在线播放| 九九热在线精品视频| 97超碰伊人| 亚洲影院成人| 欧美成人午夜免费福利785| 厕所偷拍在线| 久夜操| 中文字幕一区二区日韩网| 操比国产| 97网址97| AV一起草在线| 麻豆亚洲Av成人无码一区精品| 粉嫩久久久久| 国产女人视频三四五区| 亚洲美女自拍偷拍视频| 精品91摸| 97久久超碰日韩精品| 国产三级在线现体验区| 成 人 影视 一区 二区 三区 四区| 综合久久99亚洲人妻中文在线| 丰满人妻-区二区三区| 国产一级特黄大片处女| 99re6久热只有精品6在线直播| 在线黄色污污网站| 成人性爱免费播放| 国产精品青青草| 亚洲国产精品久久久久婷婷老年| 国产福利影视| 99国内熟女露脸视频| 亚洲一区操| 五月天成人综合| 加勒比伊人综合| 欧美大香蕉久| 色女网日韩| 久久亚洲AV无码白度| 色婷久久| 9久久久久| 婷色五月| 91bbbbbb| 天天添天天干电影| 国产99999| 清柠毛片| 精品在线蜜臀| 色呦呦、国产精品| 不卡中文字幕aⅴ在线| 中文字幕第页| 天天看夜夜看日日干| 亚洲av在线免费观看| 婷婷激情丁香| 色穴精品| 操逼逼一区视频| 欧美精品第四五页中文字幕在线观看| 欧美日韩国产成人高清| 久久精品亚洲东京热色播| 婷婷五月天激情四射| 九九亚洲| 欧美一区二区男人天堂| 欧美日韩黄色片一区二区三区四区人与兽做爱| 日本操逼视频免费| 久久精品老司| 免费啪啪一级视频| 九九九国产精品| 狠狠操狠狠插| 日逼逼免费看| 骚妻少妇精品性色无码四色A V| se01国产在线视频| 加勒比久久av| 日韩一级二级在线| 欧美国产精品| 欧美少妇高潮| 日韩美女久久一区二区三区| 国产亚洲精品av一区| 久久久少妇诱惑精品视频| 亚洲日韩精品在线播放| 日本色色色网站免费看不卡| 国产精品第二页| 五月天大香蕉| 日韩熟女无码| 91模特在线观看| 人人爽天天爽| 欧美日韩性爱操大逼| 中文字幕av一区二区三区人妻少妇| 中文字幕日本久久| 色色毛片| 久久久久女教师免费一区| 久久综合乱子伦国产免费| 国产一区二区在线播放量| 乱子伦一区二区三区国产精品| 亚洲无码一区二区三区三州| 亚洲免费在线探花| 2017大香蕉| 都市激情人妻一区二区青青操视频 | 蜜臀久久99精品久久久久久-DVD| 欧美青青视频| 欧美美女在线高潮999| 97人妻免费中文字幕| 超碰精品97| 欧美在线啊啊啊 | 土豪酒店各种姿势玩弄极品幼稚| 人妻精品综合中文字幕在线 | 99国产精品自在自在| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 日韩一级二级三级免费看完整版国语版| 黄色片大香蕉| 国产探花精品在线| 五月丁香黄色网| 色图四区| 中文字幕熟女人妻丝袜丝| 欧美日韩精品国产91| 97色干| 国产综合永久精品日韩鬼片| 综合久久久久久久久91| 亚州男人天堂| 国产极品馒头逼| 中出20p| 久久精品一区二区三区蜜桃臀| 96精品久久久久中文字幕| 超碰99在线| 久久6热视频免费观看| 日欧操屄| 国产成人超碰在线| 20cm女自慰在线日韩欧美| 国产农村妇女毛片精品久久| 精品二区三四区五电影| 91中出在线| 亚洲九九爱| A男人的天堂| 欧美性区| 久久鲁夜| 影音先锋一区二区在线资源| 噜噜噜噜天天狠狠| 揉揉日日日日| 免费无码婬片AAAA片直播色戒| 97网色| 超碰97男女| 青青草综合在线| 亚洲另类色综合网站| 欧美,亚洲,日韩,v,天堂,手机在线观看| 日本一天色道久久久精品视频| 国产精品久久发布| 欧美国产一区二区三区麻豆传媒| 91av天美性媒精品视频| 熟女91网| 国产精品成人午夜福利| 伊色综合天堂色97| 秋霞午夜视频一区二区| 欧美第二页午夜| 91色伦| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 91精品伊人久久久大香线蕉91| 国产精品免费日韩| 日韩av在线播放不卡| 日本在线不卡v二区| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 熟女精品va中文字幕| 亚洲Av诱惑| 熟女熟妇一区二区三区视频| 色色热| 97视频在线观看高清资源| 999久久久久久久精| 91亚洲黑人| 欧美最婬乱婬爆婬性视频| 操B久久| 国产AV人人夜夜澡人人爽麻豆| 亚洲高清视频在线免费观看| 日韩啪啪啪啪啪| 51久久夜色精品国产麻豆| 久久久神马影院| 色999;丁香五月| 久久精品人妻一区二区| 97色涩| 操屄日韩| 性色高清在线| 亚洲天堂99| 91精品婷婷国产综合久久| 亚洲欲| 亚洲最大AV网| 9美女超碰在线免费观看| 亚洲夜色在线| 国产多人在线观看视频| 无码聚合| 人人操人人爽人人操人人| 激情视频网址| 69一区二区三区| 天天色综亚洲91污| 天天久久| 欧美色图 人妻| 福利在线黄片| 国产多人在线观看视频| 白丝AV| 后入内射蜜桃臀| 国产精品久久久久久久久久梁医生| 亚州 综合 色图| julia ann久久| 色婷婷影院| 男人天堂网站| oumeizonghese,www| 亚洲影视第一页| 亚洲成人一区二区精品| 在线综合 亚洲 欧美中文字幕| 夜夜嗨av午夜成人| 刺激性视频黄页| 丰满人妻-区二区三区免费| avav青青草久久夜| 欧美图片校园春色| 精品亚洲国产成人av网站| 18一区二区三区| 欧美激情在线观看视频| 国产一区二区三区精品观看啪| 99无码狠狠久久| 国模一区二区三区| 久久成人东京热人妻| 国产精品干干干| 亚洲色图国产另类| 亚洲啪AⅤ永久无码| 亚洲天堂性爱| 韩国一级做a久久久久| 99操碰| 精品久久久久成人码免| 久久人人看| 精品玖九九久| 99热在线观看| 久久久久九九九| 亚洲性爱高潮影院| 操b在线观看| 久久久久性熟视频| 人人人干干人人干| 亚洲五区熟女| 插穴性爱视频在线观看| 一本一道久久综合久久| 欧美专区第一页| 免费观看成人www精品视频| 91N欧美| 亚洲欧美高清无码| 男人的天堂无码| 日本精品一区二区中文字幕| 欧美熟妇色| 98色网| 亚洲成a人v欧美综合天堂下载 | 日韩成人大片在线观看| 69久久| 伊人网av| 人人妻人人爽 97人人看碰人免费公开视频 | 天堂射| 国产操偷| 好爽视频在线观看视频| 91偷拍欧美亚洲| 波多野结衣一级视频| 亚洲综合色在线| 97超碰伊人| 久热超碰| 色婷婷六月丁香七月婷婷| 白丝少妇一区二区| 91精品国产高清久久久久久,亚洲成人 | 俺去啦自拍| 天天爽天天爽| 特级毛片特黄久久免费看| 欧美超碰人妻97| 99精品久久| 午夜福利国产欧美日韩夜夜| 欧美线天码中字| 大鸡吧尹人在线| 久久人人舔人人爽舔人人av片| 就去色综合| 有码人妻系列| 两性综合网| 国产偷拍网站| 久久久一区二区三区麻豆| 天天亚洲综合| 中文字幕高清20页视频| a v网站在线播放| 五月丁香激情四射| 欧美少妇高潮视频| 1024手机看片欧美日韩| 婷婷色一区| 女人被添高潮免费视频| 国产不良强奸视频免费看| 欧美色爱综合| 色香伊人| 操曰本熟女| 嗯……啊…嗯嗯…啊…好舒服| 一区二区娱乐网站| 久久久久亚洲AV无码专区少妇 | av中文字幕在线熟女| 久久男人精品| 欧美黑人精品在线播放| 欧美岛国精品在线观看| 久久久一区二区三区四区五区| 999熟女精品| 日韩情色AV| 中文字幕片| 五月天丁香欧洲日韩| 日本三级大片| 久久99综合| 深夜激情无码| 婷婷五月天AV| 日韩欧美视频青青| 91亚州日韩高清| 黑丝内射一区二区三区| 少妇 综合| 91狠狠综合久久久久久| 国产一级片| 国产精品久久久鸭无码的功能| 亚洲综合另类小说色区亚洲成av人片在www| 爱逼综合| 妇女性内射冈站HDWWWCOM| 大象AV在线| 综合夜夜| 亚洲无码 国产无码| av中亚| 五十路熟女人妻一区二区在线观看| 久久精品操| 天天日天天干天天摸天天操| 91人人操| A一区片| 亚洲密乳AV| 九色精品视频导航1| 亚洲欧美在线观看免费| a在线观看| 亚洲激情网一二三四区| 蜜桃久久久久久久| 久久亚码| juliaann欧美丝袜办公室| 玖玖综合网| 黄色大片视频在线免费看| 中英熟女操女| 中国东北熟女老太婆内谢| 男人的天堂一区三区| 九九伊人网| 精品免费一区二区三区在线亚洲人成| 91天美传媒精品| 九九九精品一区二区无码| 亚洲高清男人天堂| 久久久久97| 国产精品ⅴ无码大片在线看.| 日韩亚洲中文有码视频| 丰满人妻-区二区三区免费| 久久久不能久久久久| 97视频900| 人人妻人人爽| 亚洲va有码在线天堂| 欧美性生活综合| 1024亚洲中文字幕久在线看片你懂的| 亚洲欧洲第二视频在线观看色图| 中国熟妇| 亚洲第一无码播放立川理惠| 天天操女人| 蜜桃臀一区二区三区久久| 亚洲性高潮| 欧美偷拍区| 婷婷久久久| 亚州色图欧美| 婷婷综合伊人一区| 亚洲欧洲综合视频在线| SS久久| 91国模| 亚洲第一黄色av网站| 婷婷色婷婷| 国产精品天干天干综合网麻豆| 少妇色欲综合网2| 秋霞免费无码视频日韩A片| 精品人妻美妇91job| 人人综合| 中文一区二区三区影院| 久久,精品一二三| 99精品高潮| 欧美精品精品一区二区| 丁香五月天啪啪| 青娱乐手机日韩在线视频| 欧美91在线| 丁香六月啪| 2019午夜福利视频| 国产一在线观看| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 中文字幕美女91| 中文字幕一区av| 草B在线| 久久久久亚洲Aⅴ无码| 亚洲色图加勒比| 99中文字幕| 开心五月婷婷激情| 91综合网在线| 中文字幕 码 自拍 视频 区| 91 综合网| 日韩不卡a级视频专区| 色男人色天堂东京热| 国产第12页| 嗯嗯嗯,草死我| 久久大黄片| 国产熟女少妇一区| V A在线| 久久蜜桃综合网| 黄色免费一级在线毛片| 91精品丝袜久久久久久无码人妻| 翔田千里A片一区二区| 亚洲天堂色图| a级免费在线观看| 99999精品视频| 亚洲成a人v欧美综合天堂下载 | 丁香九月婷婷| 国产精品小视频一区二区三区| 九九九九九精品| 亚洲图片欧美日韩| 男女做爰猛烈动高潮A片免费应用| 日韩熟女精品无码专区一区二区 | 天堂av2019| 韩国免费播放一级毛片| 超碰97最新人妻| 91快色色色色色| 美女爽爽爽刺痛洞洞| 黄aaaaaaaaaaaaaaaaaa色网站| 久久久无码精品人妻二区| 亚洲男人天堂Av| 国产精品一二三区18| www.高清无码诱惑一区.com| 91狼人| 97在线免费看视频| 亚洲精品 超碰| 日本免费中文字幕在线| 91美女片在线| 午夜天堂精品久久| 综合五月婷婷| 一区AV| 女上位精品在线| 大奶啊啊好爽| 国产精品毛片?v一区二区三区 | 日本黄色大片一级视频免费麻豆| 超碰在线第一页| 美中韩AV综合网| 操逼逼一区视频| 亚洲综合另类色图| 人人爱夜夜爱| 欧美一区二区亚洲天堂| 香伊人在线| 国产乱码久久久| 亚洲色图欧美色图制服丝袜| 亚洲精品人妻吞精av| 操碰97| 97超碰色中文字幕| 久久超碰亚洲人| 日本护士高潮| 东北丰满熟女国产一区| 欧美天天综合| 91视频女生| 青青草手机在线免费观看| 无码视频黄色网战| 强奸乱伦AV网址| 中文字幕一二三| 加勒比性爱成人在线| 九月AV| 欧美另类色图片| 日韩A优精品在线观看| 好吊色综合| aV中文麻| 天天影视91看看| 精品人妻一区二区三区视频| 欧美久久毛片基地| 九九热免费国产视频婷婷伊人| 大香蕉免费乱伦视频| 国产成人精品必看 | 日本 欧美 亚中文字幕| 国产呦精品一区二区三区下载| 久热精品在线国产| 欧美精品三级黄片| 黄色大片视频在线免费看| 东北女人性交| 久久成人东京热人妻| 激情五月天校园春色网| 五月婷婷hd| 97精品国产97久久久久久户外免费| 国产精品亚洲免费| 日本精品一区二区中文字幕| 手机在线人成免费视频| 近亲乱伦一区二区| 超碰成人最新最好看| 视频黄色国产一级| 日韩性爱免费视频在线网站| 国产精品婬乱一级毛片彝族| 色网在线视频观看免费| 中文字幕亚洲永久精品| 91c色| 亚洲av影音先锋| 夜间福利片1000无码| 乱伦图av| 去干网最新版| 国产日韩人人| 天天综合网~91入口| 欧美日韩亚洲五月天婷婷| 婷婷另类小说| 国产欧洲精品亚洲午夜拍精品| 在线视频一区二区传媒| 久久性爱网站| 欧美很很操视频| 婷婷综合久久| 九九久久一区二区三区| 天天α片| chaopen97久久| 超碰在线免费一区二区三区| 亚洲激情综合另类| 老司机深夜18禁污污网站| 亚洲第一精品在线视频| 破苞ⅩXXX性无码动漫无码| 色99在线| 爱干爱射网啊啊啊| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 日韩中文字幕宗合在线| 中出20p| 亚洲图片激情小说| 国产对白刺激视频| 五月婷婷AV| 91九久| 国产精品在线一区二区| 91精品人妻一品二品三品| 草草草视频在线免费看| 八人操人人摸人人看| 99热网站| 欧洲精品人妻| 日日摸天天爽夜夜欢| 精品人妻中文字幕4399| 激情五月天婷婷| 久久精品国产亚洲AV清纯| 欧美色999| 亚洲91在线播放影院| 色999五月色| 青青草视频在线观看一区二区| 97欧美色综合| yaouchengrenav| 无套内射性感少妇视频| 成人一区二区三区四区| 诱惑网综合| AAAAAAAAA黄片| www.97在线| 97久久超碰亚洲| 最新亚洲人成网站在线影院| 亚洲老熟妇xxx| 在线色资源| 欧美日韩黄片精品在线| 欧美色棕合| 久久久久久99999国产精品| 亚洲欧洲av影音| 青青久久久| 亚洲av综合色区图片亚洲| 婷婷香蕉欧美在线一区二区三区| 九99久久| 九九超碰综合网| 色五月AV| 亚洲精品亚洲人成人网| 99re在线精品78| 一级片视频啪啪| 98色网| 久久日韩肥臀| 欧美久久伊人| 亚州九九九精品视频| 日本一区二区三区免费观看| 精品一区二区三区蜜桃臀赵总| 91视频综合在线| 高潮的A片激情扒开一区| 91色鬼| 一起草三级AV电影在线观看| 亚洲熟妇自偷自拍另欧美| 狠久久| 九九99精品| 97精品一区二区视频在线观看| 国产 热久久久久国产精品| 国产精品视频| 逼操网站| 乱码人妻一区二区三区| 操逼不卡中文字幕| 破处bbq| 女人高潮大叫一级毛片| #NAME?| 99久久99久久综合| 一区二区三区四区理论片| 天天爽天天操| 亚洲无 码A片在线观看麻豆| 亚洲91色| 吉川爱美98堂在线| 免费1级a做爰片观看| 黑丝日韩av丝袜av| 中文字幕日韩人妻视频一区二区三区 | 狠狠操狠狠插| 1000部熟女视频在线观看| 男女91| av绯色| 亚洲风情综合网| 亚洲综合在线视频| 久久大黄片| 伊人网在线观看| 亚洲最新中文字幕免费| 精品丰满熟妇人妻一区| 水澄无码AV| 亚洲AV成人无码一二三久久| 伊人久久蜜月| 五月丁香激情啪啪| 丁香九月激情啪| 伊人四虎综合| juliaann欧美丝袜办公室| 亚洲成av人片色午夜乱码| 97色爱| 国产精品点击进入在线影院| 99re综合伊人| 人妻熟女字幕一区二区| 人人干人人操人人爱| 五月开心久久AV官网| 曰韩av中文字幕专区| 天天综合网91| 综合97亚洲| 中文字幕在线观看丝袜| 天堂v无码免费视频| 日韩无码AB| 天天射影院| 狠狠操官网| 东北女人高潮视频| 午夜啊啊啊| 色综合婷婷| 翔田千里无码一区| 大色网久久| 干b在线性社区| 人人操人人狠狠操| 熟女这里只有精品6| 亚洲欧美激情小说| 啊啊啊不要啊啊受不了了视频在线 | 蜜臀久久99精品久久久久久成人小说 | 精品人妻1237| 欧亚性爱视频免费看| 欧美色人| 福利天天都操| 青青草色情网站视频| 长长久久88视频| 激情小说成人日本无码一| 91欧美综合| 欧美日日人人天天| 欧美在线啊啊啊| 久久久蜜桃一区二区三区| Blackedraw视频一区二区| 亚洲一区二区三区春色| 欧色网址| 校园春色美腿丝袜| 足交视频老司机| 中文字幕少妇色| 吻戏激情性巴克| 欧美猛交黑寡妇中文字幕| 日本在线不卡123| 婷婷色综合| 日本在线激情一区二区三区| 先锋色眉乱伦资源| 永久免费av无码网站国产app| 伊人九九九| 亚洲天堂电影网99999| 天堂涩涩| 久久久久9999精品九九九| 99热精品国产| 久久视网78| 麻豆黄四叶草网站| 久久成年精品| 三男一女不戴套的A片| 色哟哟AV| 碰人碰碰人人开房人肉| 国产99999久久精品| 久久人爽| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 人妻夜夜爽天天爽麻豆三区网站| 亚洲天堂综合AV| 五月激情综合网| 91美女丝袜诱惑视频| a久久| 丁香五月激情综合| 2020中文字幕| 国产不卡精品91| 人妻在线臀日韩| 在线综合 亚洲 欧美中文字幕 | 久久夜夜| 韩美日操逼| 伦激情人妻另类人妻| 精品国产91内射久久| 免费家庭乱伦视频| 国产精品午夜福利亚洲综合网| a亚洲欧美色欲| 国产91av在线播放| 乱伦图av| 国产一区二区三区精品观看啪| 综合久久中文字幕综合日韩精品| 日韩午夜啪啪视频| 欧美亚州手机在线| 综合网欧| 亚州国产成人精品女人久久| 亚洲天天天| 屁股久久久久久| 欧美片第一页| 插日本熟女视频| 25国产精品免费观看| 久久综合18p| 日本999精品| 蜜桃AV天堂| 偷拍亚洲| 波多野结衣先锋影音| 在线毛片片免费观看| 色播五月丁香| 影视综合无码少妇| 97在线播放 | 自拍内地三级在线观看| 涩涩涩综合| 色色五月婷| 大香蕉 222| 18禁看网站一区| 岛国黄| 99热国产| 清清草影| 欧美性性性| 国产亚洲美日韩Aⅴ中文字幕无码成人| 91天堂色男人的天堂| 东京热男人的天堂网| 97欧美日韩中文| 97免费在线观看视频| blacked精品一区国产| 操狠狠| 欧美性Fer办公室秘书| 91久久青青草原精品| 中文字幕亚洲热播人妻| 懂色AV一区二区三区| 国产精品午夜福利视频| 国产又黄又爽| 探花激情视频| 黄色不卡视频| 超碰97精品| 91干熟女| 一二三四视频在线社区中文字幕| 凹凸精品熟女在线观看| 曰韩成人免费视频| 天天天乱色综合全| 欧美se综合| 福利伊人玖玖国产| 美骚妇av高清在线| 亚洲色人| 激情五月天色播| 亚洲日韩黑丝| 性影在线视频| 青青国产在线拍揄自揄拍| 97日韩| 婷婷六月色| 久久精品国产97欧美精品亚洲 | 日韩人妻操B| 91宗合网| 99这里有精品视频| 日日干日日摸| 一区在线观看中文字幕| 丰满人妻一区二区中文| 免费αⅴ在线观看| 亚洲人妖网| 婷婷丁香九月| 久热久操| 日本色色色视频| 国产性爱欧美性爱在线 | 中文字幕超碰CAO| 91丨九色丨国产丨人妻在线 | 蜜臀99999| 亚洲男人久久综合天堂| 欧美性,色九九| 无码人妻精品一区二区三区99不卡| 午夜精品一区二区三区三上悠亚| 嗯嗯啊啊啊好爽| 九九色色| 免费国产视频| 精品一区96| 欧美夜夜草视频| 亚洲第一页欧美| 操B视频日韩无码| 超碰人妻中文在线| 国产无马视频| 国产精品69久久久久孕妇欧美| 色爱三区| 丰满人妻-区二区三区免费看| www.色婷婷| 91精片| 亚洲 图片 欧美 色图| 免费中文综合精品| 伦在线97| 国产又爽又黄| 试看60秒 爽| 97色色色综合网站| 国产毛片在线| 欧美人妻一区二区| 在线 制服丝袜中出 人妻| 国产精品美女| 在线黄色污污网站| 日本一区二区做爱的视频| 97久久久网站| 熟妇最新先锋一二三区| 国产传媒操逼视频| 后入精品| 亚洲精品国产AV天美传媒| 久久久久亚洲?V片无码V| 国产后入式在线观看| 国语人妻精彩刺激| 日韩乱伦AⅤ| 91欧| 97色欧州| 色吧五月| 久久久亚洲Av| 大香蕉视频啪啪啪啪| 嗯啊不要啊啊在线观看视频| 精品一区二区成人| 久 久无码人妻AV| 九九九九九九九九九五码| 午夜男人一级A片7777| 中文操逼字幕| 中文字幕一品色图| 夜夜操av亚洲一区二区| 嫩草影院在线观看精品| 91在线视频国产网站| 国产欧美后入| 久久久久国产亚洲一区欧美色图日韩| 亚洲最大成人a毛毛片| 人妻丝袜一区二区三区在线| 搞中出视频在线观看| 婷婷五月花| 家庭乱伦性爱av| 日本视频在线中文字幕| 91中出在线| 精品国产国产AV| 久久久工口| 国产尹人在线视频免费| 岛国激情视频在线观看| 国产白丝av| 国产精品白丝AV| 成人一区二区三区四区| 久草精品热视| 99热思思| 欧美综合区| 激情网色| 国产精品一区二区亚洲人成毛片| 男同专区一区二区三区在线| 久久妇| 亚洲天堂情色| 国产黄色动态精品| 超碰亚洲97| 狠狠色婷婷7777久| 日韩av不卡在线观看| 国产女人高潮嗷嗷嗷叫小说| 999久久久| 超碰色97| 992视频一区| 日韩精品人妻中文字幕不卡乱码| 欧美性天天影院| 亚州色图欧美| 国产人妻一区二区三区欧美毛片| 国产九九久久久精品| 91狠| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 一级黄色性爱A级片| 欧美偷拍区| 91东京热男人的天堂| 亚洲国产成人精品久久久国产成人一区二区| 欧美亚洲今日在线| 久久久久久加勒比| 97国产精品一区| 美欧色综合| 91九色丨风韵犹存| 综合 亚洲 欧美| 操人妻视频| 黄骗免费网站| 一区二区三区视频| 国产成年女黄特黄| 欧美性爽xyxOOOO| 搡老熟女免费视频| 欧美一级美片在线观看免费| 亚洲成人在线高清| 日本一级婬片试看三分钟| 最好看的中文字幕在线2018| 高清无码 国产精品| 日韩成人性爱AV| 大香蕉黄色一区| 很很干很很操| 99国产在线绯色一区| 佐山爱中文字幕| 老女人老91妇女老热女| 9ⅰ久久久天天| 亚洲精品 欧美97色色| 91bbbbbb| 亚洲熟伦熟妇AV无码春色| 99视频这有这里有精品| 午夜120视频在线观看| 亚州操逼网| 校园春色 男人天堂 | 大二网站亚洲| 亚洲无码免费看| 国产免费永久精品无码| 精品女人999| 嗯嗯,好大,好爽,好骚| 免费草草草草草视频| 日逼97| 国产无码精品久久久久久| 91人妻最真实刺激绿帽| 日本一区二区成人在线| 久久麻豆一区二区| 亚洲精品国产精品乱码不卡| 欧美亚洲高清晰 | 91天天综合网,天天综合网| 成人天天爽| 天天日天天干少妇日| 国产又色又粗又黄又爽| 欧美成人黄网色网站| 日韩美一区| 97伪v| 伊人91| av网页一区二区三区| 亚洲天堂,男人| 天美传媒Av在线| 欧美天天综合网版| 淫荡少妇免费| 欧美极品女人的天堂| 青青草玖玖爱| 伊人天天久久动态图| 日韩激情啪啪| 自拍丝袜美腿人妻| 婷婷丁香人妻 | 毛片视频白嫩| 91黄射| 欧美黄色大片在线观看| 超踫中文字幕| 天天在线91| 精品人妻1区| 欧美有码激情视频一区二区三区| 人妻五十路在线| 亚洲麻豆av一区二区| www.久久久久| 亚洲日韩久久精品一区| 最新亚洲黄色免费电影| 丁香五月天堂| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 日本在线播放不卡一区| 中文在线久久字幕| 亚洲情色综合| 任你艹| 99热线麻豆 | 国产亚洲人妻综合日韩 久久| 4虎在线视频| 色黄污美女啪啪啪免费网站| 鲁鲁色综合网| 密臀在线一区尤物| 大屁股xxxxx| 国产99999久久精品| 91丨豆花丨熟女| 国产农村妇女精品1区二区| 欧美人妻少妇| 九九99精品视频在线观看| 亚洲久久东京热一二三四五区视频| 午夜a成v人电影| 67194无码不卡| V A在线| 精品大久久| a'v在线资源| 久久发布国产伦子伦精品| 天久久久噜噜噜久久国产精品爽爽 | 婷婷激情啪啪| 麻豆成人影音在线| 熟女精品一区二区三区| 综合亚洲欧美| 五月天婷婷综合网| 天堂成人网| 青草视频在线看看看看看看看看看| 欧美最婬乱婬爆婬牲视频| 久久久久成人亚洲国产| 中文字幕免费看| 日本午夜久久电影| 天躁夜夜躁2021| 五月天色综合| 久久国产乱子伦精品免费女,网站| 欧美99| 91美女在线观看| 宅男91视频在线播放| 人人操人人摸avav| 青青草字幕AV| 欧美日韩国产色图在线| 青青草综合在线| 六九九九| 亚洲欧洲日本精品中文a∨| 西西美女视频网| 色哟哟511老熟女| 97ai亚洲| 青青青国产| CCYY草草影院地址入口| 欧美日韩婷婷中文| 性做久久久久久久| 四虎在线视频| 久热久一区二区三区| 亚洲国产ⅴ高清在线观看| 日本黄色天堂| 六月丁香网| 欧美v亚洲v综合v国产v妖精| 91天天爱| 伊人久久婷婷| 丰满人妻被猛烈进入中| 精品美女久久一二三| 99碰碰| CCYY草草影院地址入口| 午夜AV污污污| 亚洲 日本 一 二 三| 免费观看性欧美一级| 欧美综合色综合| 久久发布国产伦子伦精品| 岛国免费黄色网址| 日韩本不卡视频在线观看| 毛片视频白嫩| 在线人人人人人人精品超| 一区二区三区四区理论片| 青青国产在线拍揄自揄拍| 国产女人成人精品视频| 2020久久免费视频| 97超碰免费生活| 青青国产精品在线| 91成人久久 | 少妇与黑人高潮在线| 亚洲欧洲国产综合av| 操碰97| 欧美综合自拍亚洲综合图| 久久熟女人| 99热这里只有精品地址| 精品国模无码| 变态综合色| 天美传媒av一区二区| 97在线国产精品| 综合一区中亚洲国产成人综合精品| 婷婷色综合欧美日韩| 91天天综合在线观看| 怡春苑东京热| 97天天搞在线| 99ri在线视频| 在线综合色| 国产美女自拍AV| 欧美天天弄| 婷婷10月天青娱乐| 欧美日韩人妻婷婷一区| 人妻精品综合中文字幕在线 | 超碰人人妻| 日韩内射视频| 六月丁香啪啪| 五月天婷精品激情| 国产成人自拍视频视频| 九九碰九九爱97超| 在线播放欧洲免费av| 曰韩少妇无码| 60秒免费小视频| 嫩草 人人网精品| 精品国产乱码久久久久久影片| 国产 日韩 另类 视频一区爱| 国产又黄又爽又刺激久久久久久| 九九九九9999| 特污精品女优骚货黄色视频在线免费观看| 青青草无码视频| 亚州色图欧美| 97视频在| 日韩成人午夜精品久久高潮| 啪啪视频mP4| 啊啊啊 在线观看| 国产一区96在线| 日韩欧美视频青青| 婷婷色婷婷| 床上啊啊啊一区二区三区| 九九人人操| 色综合婷婷| av大香蕉| 亚洲 日韩 欧美 国产综合体| 欧美一级色| 天天干天天干天天| 久久国产视频性吧 | 国产精品一区在线播放| 中日韩久久久免费看| 久久久久久九九九九九九| 99热日| 精品视频久久区| 伊人在线大香蕉视频久久| 精品二区三四区五电影 | av绯色| 香蕉人人操tv| 成人在线视频网| 人妻久久久| 婷婷国产精品九区| 伊人久久大香线综合无码| 啊啊啊要高潮了| 91超碰丝袜制服| 天天综合官网|