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

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(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ù)羧齻€窗口患者就診最煩的不是排隊而是為了“辦好一件事”在掛號、繳費、報告窗口之間來回跑。門診服務(wù)聚合系統(tǒng)的思路很直接把掛號、候診隊列、繳費單、報告狀態(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è)計把掛號、繳費、報告做成可聯(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)域不需要知道前端要什么字段。典型例子是患者首頁要同時顯示“待繳費金額”和“報告已出”兩個信息聚合層拿到patient模塊的數(shù)據(jù)后直接組裝不再查一次數(shù)據(jù)庫。如果讓patient模塊直接返回視圖對象下次前端要加一個字段就得改patient模塊并重新測試聚合層形同虛設(shè)。2.2 核心表結(jié)構(gòu)與訂單狀態(tài)串起全流程下面是一套我在類似項目中用的核心建表SQL基于MySQL 8.0。第一張是“就診聚合訂單主表”整個系統(tǒng)的所有流程都圍繞它轉(zhuǎn)。-- 就診聚合訂單主表將掛號、繳費、取藥、報告串聯(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ā)生多筆支付比如先微信付掛號費再在診室補(bǔ)繳檢查費。候診排隊子表單獨存叫號狀態(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ù)最小可運行項目的核心代碼這一章進(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把掛號詳情、候診隊列、繳費單、報告狀態(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把三個獨立查詢并行化這里有一個新手高頻翻車點默認(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ā)聚合請求但好處是每個請求都有獨立線程不會因為等待線程池排隊而超時。想要支持更高并發(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)里真正的難點。4.1 預(yù)約掛號的分布式鎖與重復(fù)下單防護(hù)預(yù)約掛號是門診聚合系統(tǒng)里并發(fā)壓力最大的接口。真實場景是8點放號同一秒內(nèi)幾百人搶一個專家號如果沒有防護(hù)訂單表會出現(xiàn)同一患者同一排班的多條重復(fù)訂單。解決方案分三層數(shù)據(jù)庫唯一索引做兜底、Redis鎖做前置攔截、業(yè)務(wù)層再次校驗。下面這個RedisLock工具類是可運行的版本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再單獨expire否則setnx成功后進(jìn)程突然退出鎖永不釋放整個號源會被鎖死。上面代碼用的帶過期時間的setIfAbsent重載方法就是Redis官方推薦的原子寫法。4.2 聚合支付回調(diào)與對賬java怎么保證數(shù)據(jù)一致性支付是聚合系統(tǒng)最需要摳細(xì)節(jié)的地方?;颊呖赡芟扔梦⑿鸥稈焯栙M再在診室補(bǔ)繳藥費兩筆支付掛在同一個訂單號下。微信和支付寶的回調(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)一個訂單所有支付流水掛號費、檢查費、藥費全部成功才能把訂單狀態(tài)從“待支付”變成“已支付待就診”。這里不能只更新支付流水就改訂單狀態(tà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里使用一個獨立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單獨打印執(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)埋點統(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)邊界和失敗分支理順。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲开心网| 亚洲色图激情小说| 黑人性欧美| 一区二区偷拍拍视频| 久久久久久9| 色综合加勒比四四季| 超碰美国| 狠色婷婷久久一区二区三区_| 成人七区| 肏逼视频日本| 狠狠亚洲| 欧美精品999| 欧美色亚洲| 欧美国产操逼| 日本人妻A片成人免费看片| 亚洲熟妇白浆无码AV| 啊a一区在线| 亚欧视频在线| 国产美女销魂在线观看不卡| 992视频一区| 干B| 91在线美女| 黄色片大香蕉| 夜嗨影院| 人人人人插| 国产在线播放成人免费| 91亚洲网站| 中文字幕十五区| 成人性爱全视频观看| 免费成人自拍视频在线| 亚洲中字慕不卡| 天天日熟妇| 久久久中文版| 中文字幕免费看| 中文字幕片| 五月天成人综合| 啪啪啪精品视频| 黑人精品XXX一区一二区| 思思视频免费看网站| 97超级色碰碰| 狠色婷婷久久一区二区三区_| 18一区二区三区| 精品成人av一区二区三区在线| 欧美色狠| 欧美丝袜制服久久| 五月天玖玖资源站| 福利在线黄片| 黄色av一区二区在线| 黄色电影观看久久9| av网站在线观看了| 亚洲密乳AV| 97精品视频| 精品人妻一区二区三区视频在线| 久久久精品,3| 婷婷在线视频在线观看| 国产精品探花在线| 色爱国产| 亚洲AV免费在线| 人人干人人操人人..com| 国产毛片毛片4p懂色| 久久超碰网| 91亚州| 精品视频在线观看| 欧美亚洲尤物久久| www.色婷婷色综合| 综合久久99| 偷拍 亚洲| 激情综合网亚洲| 久久6热精品99视频| 中国小夫妻勾搭露脸淫荡对白| 青青草原狼av| 亚洲中文字幕乱码无码一区二区| 美女黑人91神马| 色网1| 中精品一区二区三区| 天天综合网亚洲综合网| 岛国A V在线免费看| 伊人久久综合精品欧美| 99热免费| 丰满欧美放荡少妇在线| 国产精品久久| av无码精品久久久久| 亚卅熟女乱色| 欧美青青视频| 美女啊啊啊啊啊| 亚洲āv网址在线观看| 精品国产一区二区三区在线播出| 性爱1区| 韩国一级做A片免费的| 激情婷婷丁香| 嫩草伊人久久精品| 91痴汉| 91骚熟女| 99婷婷| 一区麻豆 高清中文字幕| 久艹99| 不卡视频一区蜜桃视频 | 国产精品播放| 日韩激情啪啪| 91在线限制级| 精品免费视频国产一区| 精品一区二区成人动漫| 亚洲 欧美 日本 国内 首页| 韩日巨乳美女免费视频在线观看| 天天综合,91入口| 欧美黑人91| 99re久久| 精品久久久久久久久久久久| 亚洲日韩97| 亚洲一区二区三区在线激情| 中文字幕在线免费观看视频| 欧美久久婷婷| 翔田千里AⅤHD无码| 色综合久久888| 日韩精品一区二区三区色欲| 97视频在线观看高清资源| 中文字幕在线第二页| 亚洲欧美高清无码| 69人妻精品一区二区绯色| 粉嫩AV一区夜夜嗨| 国产成人精品必看 | 男人的天堂日韩| 日韩有码 一区二区三区| 午夜精品久久久久久久男人的天堂| 欧美亚洲宗合色性图| 最新亚洲黄色免费电影| 亚洲春色激情小说| 美女91网| 99热亚洲天堂| 干超碰碰熟女| 嗯嗯啊操我| 97精品一区| 亚洲人妻在线一区| 日韩少妇无吗| 欧美亚洲色图另类国产| 新精精品久久精品| 免费A V在线播放| 91久久堂| 丰满岳乱妇一区二区三区| 亚洲精品 超碰| 91日韩| 狠狠爱综合网| 亚洲麻豆av一区二区| 五月丁香| 乱伦一二三| 日韩av熟女一区二区三区成人| 亚洲情色视频| 91亚洲不卡一区| 97无码视频在线播放| 殴美,日韩国产伦精品| 国产精品操| 91天天日| 亚洲国产一级黄色视频| 思思热国产高清| 婷婷五月天AV| 久久欲| 在线观看视频91| 成人性爱av| 久久精品91| 人人扣人人操| 国产91亚洲精品一区二区三区| 色综合潮| 亚洲日韩国产欧美综合v| 欧美综合色综合| 天天爽天天干| 老子午夜伦不卡影院| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 国产精品国产| 五月丁香在线| 涩综合导航| 97超碰中文| 91一起操| 久久精品欧美一区二区三区不卡| 日本不卡免费二区| 亚洲天堂东京热| 成人a级高清视频在线观看| 99日免费视频中文字幕| 日韩免费人妻色情网站| AV综合中文字幕干| 日韩啊V| 亚洲日本天堂| 久久夜精品一区二区三区| 国产精品一区二区 尿失禁| 久久久久久久久久久久色网| 色在线69堂| 黑丝少妇| 强奸乱伦av电影| 91色拍| 国产风韵犹存熟妇三区| 亚洲有码 欧美精品| 亚洲制服aⅴ中文字幕| 老熟乱一区二区三区四区| 不卡九肏| 天天综合色| 男人高清无码一区二区| 蜜臀在线视频| 亚洲一区二区av| 99www.bibizy香蕉资源国产一区二区三区高清 | 蜜臀AV午夜精品久| 加勒比伊人影院| 97中文超碰| 国产综合操逼高清| 夜色AV无码手机在线影院 | 日韩人妻精品中文字幕| 91欧美高清| 五月婷婷丁香| 久久精品欧美一区蜜桃| 99热综合| 东京热激情视频一二三区| 日韩AV无码中文一区二区| 一级婬片120分钟试看| 9ⅰ久久久天天| 大香蕉之青青草原| 欧美激情久久久久| 天天综合网~91综合网| 一本久久精品中文字| 超碰在线974| 美女诱惑爱爱| 欧美日韩高潮喷水91| 免费的黄片wwwwww| 国产女性无套 免费观看| 99e久久国产精品| 97在线视频免费看| 国产精品久久| 欧美亚洲自拍另类人妻| 久操凹凸视频| 又粗又长又爽在线观看| 91天堂色男人的天堂| 粉嫩av久久一区二区三区| 日熟女| 色哟哟AⅤ| 精品无码久久久久久国产浪潮| 精品九九九九九| 国产91丝袜在线播放蜜月| 98超碰日本| 久久9精品网站| ...日韩成人一区二区三区字幕| 美国久久一二三四| 美女91网| 淫荡网址| 激情熟女12P| 久综合国内精品自在自线| 成年人黄色小视频网站| 天堂蜜桃无码视频一区二区| 91夜夜蜜桃臀1区2区3区| 九九九久久久久| 91路www| 一二视频神马久久传媒| 日韩BBN| 欧美色图亚洲色| 毛片久久| 欧日a| 在线99热| 国产专区路线| 四虎精品一区| 91 综合网| 女性91网站| 欧美日韩不卡a片| 欧美精品1区2区3区| 黄色视频60分钟| 不卡免费av在线播放 | 操久久久久久| 热思思免费视频| 思思热在线cao| 精品国产精品一区二区| 久久综合乱子伦国产免费| 日韩精品9区| 中文字幕国产在线天堂| 色色婷| 国产AV人人 夜夜人人澡| 中文字幕精品亚洲熟女| 人妻三级在线中文字幕| 久久怡红院| 啊啊啊好舒服视频在线观看| 天天综合官网| 人人透人人操| 一区二区三区四区久久视1| 丝袜视频网国产90| 激情接吻视频久久久久久| 97人妻色| 躁躁躁日日躁2020| 日韩久久激情精品| 日韩一级二级三级免费看完整版国语版 | 92福利社视频| 欧洲精品欧洲精品| 性爱乱伦视频免费| 麻豆久久久久久久久丝袜 | 天天天肏屄欧美| 日本不卡免费二区| 国语精品内射在线观看| 欧美精品久久96人妻无码| 熟妇人妻丰满久久久久久久无码| av天堂精品久久| 91网18| 欧美日韩中文视频播放| 无码日韩网站| 久久精品高清无码一区| 夜夜天天噜狠狠爱2021| 9 7超碰在线免费观看| 搡老女人老91二区| 久久婷婷五月天| 久久久久久久久9| 强奸乱伦动态污图免费 | 很很操在线| 亚洲成人碰碰| 蜜臀久久99精品久久久久| 欧美性生活综合| 婷婷九月丁香| 婷婷激情综合网| 五月天AV资源| 日本韩欧美在线播放a| 青久久| 五月婷婷丁香中文字幕| 九九av| 美女午夜福利免费视频| 伊人久久亚洲色欲综合网站| 免费一级毛片在线视频观看| 情色图区| 99久草| 精品毛片久久久精品毛片| 91精品国产乱码| 色香色欲天天综合网天天来吧| 婷婷五月天无码 | 人人干黄色| 天天天天做夜夜夜夜做| 综合影视国产无码| 日本亚洲嫩草影院啪啪| 欧美制服另类丝袜| 国产又黄又粗的视频| 诱惑人妻欧美一区在线播放| 日韩精品1区2区中文字幕| 久久超碰av在线| 久久国内| 欧美色综合网| 第二页中文字幕| 亚洲色系另类精品国产| 97在线免费公开视频| 国产亚洲日韩在线三区黑人| 日夜尻逼网| 欧美在线播放aaaa| 强奸抽插av| 人妻少妇色综合| 成人性爱全视频观看| 日韩三级av片| 亚洲视频小说| 激情综合97| 欧美十八禁视频| 久久综合久色欧美综合狠狠 | 小视频玖玖| 国产又大又粗又长视频| 麻豆人妻少妇在线免费观看| 久久xxxx| 亚洲中文日韩欧美大香蕉视频| 自拍第一页| 啪啪91| 啪啪AV导航| 九九热精品| 91久久精品国产| 户外裸露刺激视频第一区| 疯操AV| 欧美1727免费观看视频| 亚洲成?V人片在线观看福利| 在线播放成人高清免费视频| 日日夜夜骑| 国产传媒一区日韩| 婷婷色网| 一本一道vs波多野结衣| 999久久久免费精品国产牛牛| 懂色av中文字幕一区二区三区天美| 五月综合激情| 免费精品福利在线观看| 欧美性爱综合,免费| 97ai亚洲| 日韩国产成人自拍视频| 天天澡天天爽日日AV| 97爱啪| 青青久操| 亭亭丁香激情| 熟妇亚洲一区二区三区| 亚洲色图91欧美日韩| 久久久婷| 色五月激情综合网| 色婷婷五月天| 色五月婷婷久久| 99性爱在线观看| 日韩操啪| 青娱乐福利99| 国产高清自拍视频| 亚洲色婷婷久久久综合日本| 美女性91| 唯美清纯 妖精视频| 色综合 加勒比| 日韩资源网| 97久久精品国产| 中文有码第五页| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 清纯唯美综合亚洲| 亚洲 欧美 另类 日韩 人妻一区| 防屏蔽在线视频| 强免费黄色网址| 五月色网| 小草三级久久观看| 97超碰亚洲| 国产精彩女在线观看视频| 国产视频小说| 加勒比色99999| 亚洲久久久| 日韩97P| 亚洲 暴爽 AV人人爽日日碰| 久久久久久久伊人精品| 福利在线黄片| 精品久久久av| 97AV在线免费观看| 久久亚洲一区二区色婷婷| 97日韩超碰超碰中文字幕| 婷婷超| 国产成人一级av88| 97干在线| 综合网欧| 中文字幕1区2区| 国产极品馒头逼| 精品九九国产无码| 婷婷激情五月| 亚洲精品一卡二卡三卡福利视频网站| 91精品国产91久久久久久久久久久久| 国产综合久久久麻桃个| 东京热视频网| 91狠狠综合久久久久久| 日韩啪啪啪视频| 日韩在线观看AV| 97视频在线| xxxx网站亚洲精品| 欧亚乱色熟一区二区三四区| 91欧洲入口| 一区二区三区美女超清| 91人人臊| 夜夜久久| 日本精品五区| 超碰人人超在线观看| 大鸡吧尹人在线| 男人天堂最新手机版在线青青草| 日本一级特级毛片视频| 99爱在线视频| 探花一区在线| 97天天操天天干| 久久99九九九九6666免费观看软件| 无码免费在线观看黄色片| 99综合免费视频| 97频视在线| 日韩啊V| 性爱综合网| 精品乱码在线观看| 18禁精品网站在线看| 九九精品美女高溯喷水| 日韩97在线| 欧美中出1| 97AV在线免费观看| 天天躁日日躁AAAAXXXX国产| 丝袜夫妻自拍| 超碰免费97| 激情五月天丁香| 国产不卡的视频| 黄色AAAAA欧美| 青青操少妇| 麻豆天美传媒毛片| 国精品一区二区三| 一区在线精品中文字幕| 97蜜桃综合| 啊啊啊想要| 日本狠狠干| 欧美亚洲系列| 婷婷五月天成人| 天天影视91看看| 91呆哥人妻| 91亚.色| 亚洲欧综合另类无码一区| 好看的久久不射无码影视影院| 亚洲国产成人精品999| 九久9热| AAAA欧美日韩| 色999偷自拍拍| 人人操人人操人人人操| 97精品在线| 日本天天操| 久久九操在线观看| 亚洲偷91色| 国产三区免费在线观看| 亚洲成人AB| 天天日夜夜爽| 国内精品嫩模A∨私拍小视频| 色狠人在线99| 欧美丝袜制服久久| 久久线上视频免费看| 午夜天堂精品久久久久91| 欧美日韩中文视频播放| 欧美老妇女内射网址| 国产成人主播| 欧美 亚洲 综合 制服| 明星性猛交ⅹxxx乱大交| 91性高| 欧美丝袜中文字幕07在线| yy少妇精品久久| 精品超碰国产| 国产一区二区二区按摩精品啪视频| 91ise欧美| 性饥渴少妇av无码毛片| 激情婷婷丁香| 骚逼高潮久久精品| 精品成人亚洲午夜电影| 欧美熟妇精品黑人巨大91| 精品国产嫩穴视频| 精品国产人成在线| 屁股久久久久久| 人妻在线大香蕉| 自偷自拍的亚洲视频| 99re在线| 91国产丝袜美女| 日韩丝袜人妻AV| 日韩三级天堂在线观看| 青青色在线观看| 老女人老91妇女老热女| 天天干一区二区| 日韩AV一起草| 美国精品国产精品| 1240青青草一区二区三区视频天爱 | 国产九月婷婷| 国语精品内射在线观看| 日韩精品在线视频,日韩精品……| 亚洲图片 激情小说| 国产视频一区二区在线| 午夜男人一级A片7777| 亚洲欧美色图小说| 東南亚性呦成人伦理资源在线视频| 成人热久久精品| 免费视频无码| 色综合久| aaaa少妇高潮大片| 无码精品久久| 97色网| 夜夜欧美 | 99久久99久久免费精品蜜臀| 九九九久| 日韩中文字幕精品一二三事国产精品| 91九九九小逼| 小草精彩毛片| 色性欧美| 日本有码影片下载| 亚洲成人av色网| 静品嫩模一区二区| 久操不卡视频| 婷婷亚洲五月***久久| 天天弄天天操| 一类无码操逼视频| 两女互慰AV高潮喷水在线观看| 91肉片| 亚州综合色| 99re欧美| 五十路熟女人妻一区二区在线观看| 春色综合免费| 亚洲AV永久无码精品成人调教| 久久久国产精品亚洲精品| 女人一区| 亚洲自拍欧美国产首页网曝 | 日韩中文字幕精品一区在线| 国产精品白丝在线播放| 免费少妇一区二区| 国产精品干干干| 强奸乱伦大香蕉| 国内毛片婷婷六月色| 无码逼| 无码自拍SM| 伊人激情| 欧洲乱码一区二区| 国产精品久久久久久久免牛肉蒲团 | 中出在线视频| 亚洲双插| 亚洲欧美人妻| 国产一区免费午夜视频| 美国人人操人人操| 久久精品性| 国语人妻精彩刺激| 国产精品制服丝袜中文字幕日韩一区二区三区 | 日韩美脚一区二区网站| 午夜天堂网| 大香蕉伊然在亚洲91| 午夜经典| 欧美18老人禁| 久久久久亚洲Aⅴ无码| 婷婷99| 亚洲图片欧美制度| 国产精品国产| 国产精品操| 午夜超爽| 嗯啊不要在线| 亚洲男人天堂2016| 91热| 收看日本人日bb| 99久久精品国产高潮| 五月天婷婷欧美三区| 又摸又舔在线观看网站| 青青草五月份天| 欧美性xxxxx狂欢| 人摸人人操人| 在线啊啊啊啊| 中文字幕一二三av| 翔田千里爆乳巨臀无码| 操逼逼无码| 强上我不卡卡| 亚洲午夜精品久久久中文影院| 五月亭亭六月丁香| 在线性黄高清免费视频| 91国产大片| 大香久久| 国产福利小视频高清在线观看| 91爽啪| 青草伊人久久| 免费啪啪av| 亚洲熟妇自偷自拍另欧美| 久草精品视频| 色综合V| 丁香五月AV| 人妻少妇久久| 做爱A级亚欧| 国产视频一区二区在线| 欧美高清16| 伊人女女资源在线观看| 秋霞Av理论一级在线| 亚洲九月丁香| 北条麻妃性愛视频| www熟女乱伦com| 超碰亚洲97| 亚洲少妇视频| 婷婷AV一区二区三区| 天天舔天天日天天射| 国产精品久久aV| 久久久999日本大片| 97在线/亚洲| 操逼操网| 夜夜做夜夜爽精品视频| 亚洲精品影视老司机| m欧洲一级午老| 亚洲密乳AV| 校园春色欧美色图| 日韩av无码网站| 夜夜中出国产| 久久97超碰| 精品久久久无码| 资源新线在线天堂| 日韩三级视频一区二区三区| 九九热精品视频六| 一起草av| 久久女人| 日本一区二区三区欧美日韩中文字幕| 久久久久久久九九九九| 玖玖视频在线资源一区二区三区| 午夜精品久久久久久久久久久久久 | 色色婷婷丁香| 国产精品成人午夜福利| 99热官网| 视频一区二区免费在线| 超碰在线人妻不卡| 在线观看免费视频国产| 综合网97| 一级A啪啪啪啪| 欧美96在线|欧| 人妻少妇一区二区| AAAA级日本片免费视频| 亚洲日韩青青草色月| 亚洲熟女精品| 蜜桃香蕉久草精品在线| AV中文在线可看| 中文字幕人妻资源在线| 国产精品。| 亚洲欧美国产成人综合不卡| 校园春色美腿丝袜 | 欧美色老汉| 久久久久成人蜜桃精品| 成人午夜高潮av猛片| 日韩美女,国产传媒,视频一区| 欧美性爱中文字幕无线码| 尤物AV免费网站| 中韩中文字幕在线观看| 色女女女导航| 久久久亚洲高清不打码| 狠狠入| 亚洲97P| 欧美性爱在线无码| 女性喷水高潮在线观看| 日日嗨AV一区二区夜夜| 亚洲欧洲偷拍一区| 亚洲最新av无码成人精品区| 亚洲久9| 少妇内射www在线观看视频| 二色av| 91av一区二区在线观看| 亚洲综合在线91| 北京美女一区二区| www.夜夜| 人人操人人操草草| 国产97在线 | 亚洲| 91少妇香蕉久久精品| 国产亚洲一黄| 国产AV激情无码久久无码| 97干在线视频| 久久精品电影| 麻豆影音天美视频| 五月丁香色婷婷| 欧亚成人| 国产精品麻豆成人av| 综合网亚洲在线| 欧美色图成人网一区二区| 五月激情啪啪| 18禁免费视频| 亚洲无码精品AV久久久| 欧美综合1性辶| 亚洲天天影视色综合| 大香蕉免| 9/A片| 久久婷婷五月| 成人综合久久精品色婷婷| 日本三级一区二区 在线| 亚洲色图欧美激情| 99999久久精| 天堂精品| 东方亚洲在线操逼天堂| 十八禁黄色成人网站观看| 97香焦色区| 久久99久久99久久99人受| 国产精品一区二区三区,亚洲综合| 国产中出内射一区二区| 黄页av| 最新制服中文第一页| 91久热| 91久久久久| 亚洲欧美91√| 亚洲影视高清第一页| 色悠久久久av| 91国精产品| 亚州欧美总和| 亚洲色图第一页| 国产精品国产| 公司1区2区3区精产精| 色九九综合AV| 性九九九九九九| 久久精品99| 97日韩欧美亚洲| 国产蜜臀精品一区二区尤物| 四虎精品永久在线观看| 91狠狠综合久久| 校园春色第一页| 欧美懂色综合网| 97久久精品| 欧美熟女少妇| 色综合91| 四虎AV无码| 操操操操操操| 男人网站婷婷| 久久久久久九九九九九九| 好爽要喷了| 久久婷婷一区| 97欧美精品| 欧美黄色手机在线观看| 久久欲| 中日韩熟女| 久久东京国产精品视频| 亚洲色吧网| 欧洲射精91| 亚洲精品白丝| 欧美亚洲天天| 久久久久亚洲Av无码专区老牛影视| 日韩在线观看三级电影| 极品欧美一区二区三区| 高清无码 国产精品| 一区在线观看中文字幕| 亚洲欧洲视频小说在线观看| 91日产欧美| 国产自偷| 日本操逼aaaaa| 天天做日日做天天欢。| 一本道综合色图| 亚洲吊色| 中文字幕乱妇免费视频| 极品销魂美女一区二区| 国产精品欧美日韩久久| 婷色五月天| 97色色色综合网站| 深爱伊人影院| 日韩福利综合一区| 亚洲中文字幕三级在线| 亚洲91亚洲| 精品人妻一区二区蜜桃视频| 黄色成人网久久久久久| 欧美日韩中文亚洲v在线综合| 91原创在线观看| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 熟女91网| 日韩熟女操逼| 淫妻综合网| 国产精品久久久久999| 尤物av网站免费在线播放| 日韩成人大片在线观看| 97日视频| 中文字幕国产在线天堂| 97久久视频| 久久超碰av在线| 人人操人人爽人人操人人| 综合久久婷婷| 亚洲诱惑天堂| 另类小说综合网| 亚洲最大黄网| 欧美在线天堂| 玖玖爱伊人玖玖爱| 综合av社区| 亚洲熟女国产综合另类| 欧美日韩中文字幕不卡| 在线无码操| 夜夜爽爽夜夜精品视频| 永久免费av无码网站国产app| 大香蕉九九| 精品少妇一区二区三区| 上海一级黄片| 蜜桃精品视频一区| 日韩欧美操逼xxx| 天堂av2019| 超碰99re| 精品一区二区三区蜜桃臀赵总 | 欧美精品成人一区二区在线观看 | 亚州五月| 久久久国产成人一区二区三区在线 | 97欧美色| 一区三区啪啪| 日韩97精| 亚洲欧美一区二区三区一猛片| 国产熟女二区| 中日亚韩免费视频| 亚洲黄色网址| 日本Xx性爱| 99热国产| 99热国产| 久操免费观看| 五月天丁香欧洲日韩| 97天堂| 97干色天堂| 欧美亚洲国产91在线| 国产传媒日本欧美专区| 人人做,人人操,人人摸| 国产精品久久久777| 久操com| 久久↗↗| 三级三久久线久久99久目本WW| 99少妇| 六月婷激情福利天堂69| 在线午夜成人无码视频| 亚洲av热热色| 国产成人一级av88| 熟女久久| 超碰超碰95| 国产美女口爆吞精视频| 成人欧美日超碰| 3p国产欧美99热| 久久久夜夜夜| 美腿丝袜高跟网免费视频免费视频| 91人妻最真实刺激绿帽| 国产不卡的视频| 91啪啪| AⅤ片水多多| 老女人碰碰在线碰碰视频| 久操不卡视频| 96精品久久久久久久久久| 亚洲精品 超碰| 日本高清有码网址视频| 熟女精品日韩一区二区三区| 色第一页| 国产欧美亚洲精品a第2页| 精品亚洲天堂| 成人久久精品| 99无码视频| 亚洲一区日韩精品| 美女十八禁| 久久熟妇五十路一区| 爱av免费| 中文字幕久久婷婷丁香五月天| 亚洲的天堂网| 加勒比无码一区二区三区| 久久这里只精品免费福利| 好爽要喷了| 日本不卡码黄色| 久精品无码av一区二免费国产在线观看| 欧美性性性| 超碰久久草| 性站| 免费A V在线| 免费?级毛片无码?∨蜜芽试看| 久久久久久久久久久精| 色女综合| 性吧在线视频| 欧美日韩性爱无码| 无码久久亚洲高清,| 久久婷婷苹果| 国产第11页| 精品人妻一区二区三区-国产精品| 欧美性爱视频免费一区一A| 九九九九热| 99精品无码| 欧天美中出| 午夜呻吟欧美| 久久久中文| 久久爽爽精品| 夂久色| 亚洲图片欧美在线视频| 久久久久久日韩| 国产精品久久久吖| 美女啊啊啊啊啊啊| 欧洲站一级二级三级h| 天美精品一区二区三区四区在线观看| 欧美1727免费观看视频| 天天日天天干天天整| 一区二区免费电影久久| 亚洲 欧美综合| 91影视亚洲| 精品国产国产AV| 亚洲AV资源| 欧美激情总合网| 蜜桃臀av在线观看| 屁屁影院一区二区三区国产| 香蕉热人人精品| 香伊人在线| 人妻另类 专区 欧美 制服| 视频在线中文字幕| 人妻 欧美 中文| 欧美婷婷久久| 日欧美色| 成人精品视频一区二区| 色色亚洲| 黑丝少妇在线观看| 大香交伊人网| 亚洲情色电影网| 老色69| 91大学精品激情戏| 97久久精品亚洲| 啊好大好舒服| 99re3这里只有精品| 欧美老熟另类| 好淫网一二三视区| 精品99999久久久久久| 青娱乐av在线| 97这里都是精品| 日韩AV中文字幕电影| 久久久久久久久久久久久久久乱码| 一道本东京热加勒比一区二区三区| 天美av在线观看| 蜜区区视频79| 日本一区99| 欧美夜夜骑视频| 久久综合久色欧美综合狠狠| 超碰人妻中文在线| 欧美综合 站| 欧美日韩美女精品久草一区二区三区 | 日本狠狠干| 怡红院视频在线| 欧美在线伊人色| 蜜臀色乳| 加勒比久久av| 久草综合网| 免费操逼91| 亚洲三区视频| 亚洲国产欧美中日韩成人综合视频| 中文字幕 码精品视频网站| 色婷婷香蕉| 18一区二区三区| 亚洲黄色网址| 91N综合网| 无码不卡亚洲成?人片| 欧美日韩电影成人在线| 国产 v乱码一区二| 91是天天| 亚洲高清在线se| 日韩人妻丝袜中文字幕| 国产精品国产亚洲区艳妇糸列| 国产探花精品在线| 九九在线精品| 欧美色图成人网一区二区 | 人妻精品一区一区三区蜜桃91| 天天干人人乐| 欧美aa一级片| www网站黄| 麻豆国产原创AV色哟哟| 乱伦图一区| 婷婷亚洲综合| 国产农村妇女精品1区二区| 黄色一区三区| 96久久久| 狠狠激情综合狠狠操中文字幕| 啊啊啊啊啊在线观看网址| 色爽——AV| 日日嗷| 国产粉嫩蜜臀av一区二区三区| 新婚人妻扶着粗大强行坐下| 亚洲熟女国产综合另类| 少妇熟女视频一区二区三区| 在线视频 亚洲精品| 色综合av男人天堂| 精品无码一区二区| 蜜臀va69| 国产日韩欧美亚洲精品95| 欧亚洲精品有视频| 亚洲熟妇综合久久久久久| 无码一区免费在线不卡| 婷婷五月天丁香花| 操淫穴亚洲五月丁香| 精品人妻免费观看| 综合色啪| 大香蕉色欲AV| 精品成人无码| 天天看片天天爽| 欧美性爱超碰97| 美中日韩无码| 第四色色综合91| 60秒不遮不挡| 亚洲欧洲综合视频在线| 日韩 欧美 国产 麻豆| 在线岛国新天堂8| 天天综合精品| www.人人摸在线视频| 日韩欧美综合激情| 亚洲少妇激情视频| 亚洲国产一级黄色视频| 最新加勒比丝袜在线| 国语少妇精| 日韩成人大片在线观看| 五月天亚洲网| 黄色大香焦1级‘′‘| 色综合20p| 亚洲最新中文字幕免费| 超碰人人妻| 躁躁躁日日躁2020| 婷婷五月天社区| 99re久久| 一区二区你上我| 男人的天堂va在线| 蜜桃久久一区二区三区| 无马一区二区| 天天综合色| 九久精品| 亚洲精品久| 日产欧美电影一区二区三区| 女优视频第10页| 中国熟妇| 综合激情五月丁香| 欧美丝袜91| 欧美日韩第一页| 综合大香蕉美。| av日韩在线观看电影| 激情久久日韩精品中文字幕麻豆| 333kkkk·亚洲com久久| 日日嗷| www.天天干| 日韩性爱长视频免费| 久久天天性久久伊人| 91国产操逼视频| 久久久久久久久久久999| 色在线亚洲视频www| 中文无线日韩一区| 狠狠爱综合网| 欧美宗合色| 中文字幕视频2区| 人人看人人爰人人操| 国产日产欧产美韩系列麻豆免费| 久久这里只精品99re66图| 久久岛国| 97玖玖超碰| 精品视频免费在线一区| 无码人妻毛片丰满熟妇精品区| 久草五月| 人妻偷拍一区二区三区| 4虎在线视频| 国产av尤物| 国产成久久综合片| 91老熟女91老女人| 69精品在线| 污污汅18禁网站在线永久免费观看 | 九九热精品视频六| 一区中文字幕二区日韩| 午夜寂寞欧美| 亚洲中文字幕一区二区| 精品人妻一区二区免费蜜桃| 日本性爱少妇| 日本乱人伦片中文三区| 粉嫩av一区二区三区四季| 国产久久一区二区午夜| 精品高清av中文字幕| 久久大香蕉97| 超硑97精品| 狠狠综合网| 亚洲小电影免费涩涩成人在线高清| 嫩草 我啊~嗯~在线| 激情五月丁香五月| 韩国一级婬片A片无码天美| 欧美性爱超碰97| 2017大香蕉国产精品久久| 免费夜夜爱黄色视频毛片| 园内精品自拍视频在线播放| 欧亚 另类 久| 青娱乐手机日韩在线视频| 日本熟妇一区二区三区| 欧美成人一级免费电影| 免费人成毛片乱码| 日日干日日摸| 亚洲熟妇熟在线电影视频| 国内毛片免费h片在线| 秋霞成人一级在线观看| 亚洲风情在线观看| AV久日| 欧美色图下一页| 亚洲另类久操网| 大香蕉乱伦视频网| 东京热男人的天堂精品| 日韩成人性日韩成人性爱视频在线免费观看 | 91丝袜| 丝袜美腿操av| 99re热| 老司机免费视频在线91| 超碰97在线 欧美 国产| 亚洲国男人的天堂| 国产高潮AA片免费看| 日韩精品中文字幕一| 久艾草在线精品视频在线观看| 久操精品| 久久这里只| 男女啊啊啊啊啊| 亚洲图片视频小说| 亚洲中文字幕一区| 日本好吊色视频| 美女诱惑在线一区| 五十路熟女工口 | 欧美v亚洲v综合v国产v妖精| 91综合网站| 97av在线观看| 国产精品乱码久久| 久久久久久九九九九九| 黄久久| 亚洲狠狠入| 日韩97超碰| 香蕉精品二区二区| 亚洲极品| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 岛国小电影| 欧美精品在线观看| 日韩一区二区熟女| 久久超碰免费的| 99啪| 丝袜综合| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 国产人伦a片信息免费片| 翔田千里AⅤHD无码| 久久91视频| 久久久久成人亚洲国产| 丁香婷婷九月| 亚洲国产精品久久久久久久久久| 日韩三四五区|