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

ARTICLE DETAIL

資訊詳情

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

Spring Boot WebSocket客戶端同步回調(diào)實現(xiàn)

Spring Boot WebSocket客戶端同步回調(diào)實現(xiàn) 這標題看著長其實拆開就三層Spring Boot 里起一個 WebSocket 服務端再內(nèi)嵌一個 WebSocket 客戶端然后讓這個客戶端具備“發(fā)一條消息、同步等結(jié)果”的能力。別小看最后這點大部分網(wǎng)上的示例都卡在廣播和聊天室的階段真正拿進業(yè)務系統(tǒng)里用的時候誰都需要“我這端發(fā)出去一條指令對面到底處理成什么樣了”這種確定性的返回。這篇文章就把完整做法拆開講透從依賴配置、端點編寫、會話管理到客戶端封裝、同步回調(diào)協(xié)議、超時清理和重連?;钊拷o出可直接抄的代碼和參數(shù)建議。適合正在做即時通訊、設備指令下發(fā)或者想把長連接能力接進 Spring Boot 業(yè)務代碼的朋友。1. 項目價值拆解為什么“同步回調(diào)”才是真正的業(yè)務剛需1.1 這個項目到底解決了什么問題普通的 HTTP 接口天然就是“請求-響應”模型你調(diào)一次接口拿到返回值事情就結(jié)束了。WebSocket 不一樣它是全雙工長連接消息推出去之后對面的響應什么時候回來、回沒回來都是異步事件。這就帶來一個很現(xiàn)實的矛盾Spring Boot 的業(yè)務代碼大部分是同步風格Service 層調(diào)一個方法、拿到返回值、再往下走大家早就習慣了這種寫法。如果 WebSocket 做成了“發(fā)消息 監(jiān)聽回調(diào)”業(yè)務方就要被拆成兩段一段負責發(fā)一段負責在回調(diào)里繼續(xù)執(zhí)行代碼邏輯四分五裂排查問題也很痛苦。標題里的“客戶端消息同步回調(diào)”解決的就是這個矛盾對外暴露的接口仍然像普通方法一樣調(diào)用方傳參、等待、拿結(jié)果內(nèi)部則通過 WebSocket 長連接異步收發(fā)再靠請求 ID 把響應和請求重新對齊。說白了這是把異步通道“偽裝”回同步語義讓長連接能力和常規(guī)業(yè)務代碼無縫銜接。我見過不少團隊一開始做長連接模塊都是先寫廣播 demo結(jié)果一接到真實業(yè)務里就發(fā)現(xiàn)各種不對勁核心原因就是沒想清楚“請求-響應要對得上號”這件事。這個項目本質(zhì)上解決的不是連接問題而是“確定性”問題。1.2 三個典型業(yè)務場景我舉三個最常見的場景基本覆蓋了標題里這套方案會被用到的位置。第一個是設備指令下發(fā)。管理平臺要控制一臺終端設備比如“開啟攝像頭”“重啟服務”“調(diào)整參數(shù)”這種指令光發(fā)出去不算完你一定想知道設備端是否收到、是否執(zhí)行成功、如果失敗了錯誤信息是什么。只有同步回調(diào)才能讓指令下發(fā)服務保持業(yè)務一致性不然指令狀態(tài)就只能靠輪詢數(shù)據(jù)庫去猜效率低而且實時性差。第二個是在線用戶操作回執(zhí)。IM 系統(tǒng)里不僅有聊天消息還有“拉黑”“撤回”“已讀回執(zhí)”這類帶狀態(tài)的操作。服務端需要向指定的在線連接推送一條指令并等待用戶客戶端應答。這種場景如果做成異步廣播你根本不知道被拉黑的那個用戶到底有沒有收到很多業(yè)務邏輯就沒法收斂。第三個是實時業(yè)務場景比如游戲?qū)纸Y(jié)算、交易確認、協(xié)同編輯的版本同步。這些業(yè)務對結(jié)果返回的實時性要求極高HTTP 輪詢的延遲和開銷都不合適WebSocket 長連接加上同步回調(diào)能把原先“發(fā)了不管”的廣播式通信固化成一個帶結(jié)果的調(diào)用業(yè)務代碼寫起來也自然很多??梢哉f只要你的系統(tǒng)里存在“在線設備或用戶 需要知道處理結(jié)果”的組合這套方案就是繞不開的。1.3 標題里的三層架構(gòu)每一層都缺一不可標題雖然長但核心架構(gòu)其實只有三層。服務端層負責連接管理、會話存儲、消息接收與推送解決的是“誰能連、連上了往哪發(fā)”的問題??蛻舳藢邮乔度?Spring Boot 工程里的一個 Java WebSocket 客戶端組件它對外暴露業(yè)務方法對內(nèi)維護長連接狀態(tài)解決的是“業(yè)務代碼怎么調(diào)用”的問題。同步回調(diào)層則是一套消息協(xié)議和等待機制通過請求 ID 把響應消息和正在等待的請求重新配對解決的是“結(jié)果怎么回到調(diào)用方手里”的問題。三層缺了任何一層都不完整沒有服務端客戶端沒東西可連沒有客戶端業(yè)務代碼就得裸寫一堆 WebSocket 回調(diào)代碼難看還難維護沒有同步回調(diào)前面做的所有連接工作都停留在“能通”的水平業(yè)務根本沒法用起來。所以這篇博文會按這三層逐步拆開寫順序剛好就是標題的閱讀順序。2. 技術(shù)選型與設計思路哪些方案能選、我為什么這樣選2.1 服務端集成 WebSocket 的三種主流姿勢Spring Boot 里做 WebSocket 服務端最常見的有三種路子基于ServerEndpoint注解、基于 Spring 的WebSocketHandler注冊、以及直接集成 Netty。我給它們拉了張對比表只看它們在“快速集成”這個場景下的表現(xiàn)方案上手難度代碼量生命周期處理適合場景ServerEndpoint注解低最少注解自帶 OnOpen/OnMessage/OnClose/OnError大多數(shù)業(yè)務項目快速接入沒問題SpringWebSocketHandler中中等實現(xiàn)接口方法需要和 Spring MVC 深度整合、做攔截握手時集成 Netty高多自己管理通道和線程模型超大規(guī)模連接、TCP 層定制要求很高時標題里明確寫了“快速集成”那我的答案很直接選ServerEndpoint注解方案。原因不復雜一是它完全由 Java 生態(tài)規(guī)范定義和容器兼容性好代碼量最少二是每個生命周期回調(diào)都有明確的注解位置不需要去記 Spring 的接口簽名三是不需要額外引入路由邏輯路徑參數(shù)直接寫在注解里比如/ws/{userId}在 OnOpen 方法里就能拿到用戶 ID非常貼合業(yè)務需求。2.2 客戶端選型與依賴引入Java 生態(tài)里做 WebSocket 客戶端我一般直接用 Java-WebSocket 這個開源庫。它提供了完整的客戶端實現(xiàn)連接、發(fā)送、監(jiān)聽消息、心跳、重連這些能力都覆蓋了而且它是一個輕量庫不需要和 Spring 容器做任何綁定非常適合作為獨立組件封裝進業(yè)務代碼里。相比之下用 Spring 自帶的WebSocketStompClient也不是不行但它強依賴 STOMP 協(xié)議棧如果你的服務端是自己實現(xiàn)的普通 WebSocket 端點沒必要為握手過程引入這么重的依賴。Maven 坐標很簡單服務端只需要引入 Spring Boot 的 websocket starter客戶端則額外引入 Java-WebSocket 庫。注意版本方面選一個穩(wěn)定版本就行這十年下來它的 API 變化不大核心用法比較穩(wěn)定。在后面的代碼里我會把這兩段依賴分開寫清楚避免一些人把服務端和客戶端的依賴混在一起出現(xiàn)莫名奇妙的沖突。2.3 “同步回調(diào)”的本質(zhì)把異步消息拉回到同步時間線要說清楚同步回調(diào)我打個比方。你去銀行柜臺辦事取了一個號碼牌然后坐下來等廣播叫號廣播喊到你的號你再上去拿結(jié)果。這里的號碼牌就是請求 ID廣播就是 WebSocket 的消息通知等待區(qū)就是你正在阻塞的業(yè)務線程。實現(xiàn)上就是用并發(fā)包里的CompletableFuture作為“等待憑證”每次發(fā)送請求前生成一個全局唯一的請求 ID同時創(chuàng)建一個CompletableFuture放進一個ConcurrentHashMap里key 就是請求 ID。消息發(fā)出去之后調(diào)用方執(zhí)行future.get(timeout)阻塞等待。服務端處理完業(yè)務后回包時必須帶上同一個請求 ID客戶端在收到消息時用這個 ID 去 Map 里找到對應的 Future調(diào)用complete()把結(jié)果填進去阻塞中的調(diào)用方立刻被喚醒拿到返回值繼續(xù)往下走。這就是“異步轉(zhuǎn)同步”的核心機制。需要注意這種同步是調(diào)用方線程層面的等待不是整個系統(tǒng)變成串行服務端依然是并發(fā)的只是每個請求在自己的線程里等待自己的結(jié)果彼此之間不干擾。同時future.get()一定要帶超時時間避免服務端一直不回包把業(yè)務線程全部打滿這一點在后面的代碼里也會處理掉。3. 服務端實現(xiàn)從握手建連到一對一消息推送3.1 依賴與基礎(chǔ)配置服務端的第一步是加依賴。Spring Boot 項目里引入spring-boot-starter-websocket就夠了它會把 WebSocket 相關(guān)的容器能力帶進來同時和原有的 Web MVC 共存不會影響普通 HTTP 接口。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency有了依賴之后還需要一個配置類注冊ServerEndpointExporter。這個類非常關(guān)鍵它的作用是掃描所有標注了ServerEndpoint的類把它們注冊到底層 WebSocket 容器里讓路徑真正生效。如果少了這一步你寫的端點類不會報錯但連接時永遠是連接失敗這個坑不少人都踩過。Configuration public class WebSocketConfig { Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }這一步完成后服務端的骨架就搭好了。后面寫的端點類、會話管理工具、消息中心都會被 Spring Boot 的自動配置能力串起來。3.2 會話管理并發(fā)安全是第一個考點WebSocket 服務端的核心資源就是Session每個連接對應一個會話我們得把“某個用戶 ID ? 某個 Session”的對應關(guān)系管理好。因為 WebSocket 連接的建立和斷開是隨時的可能幾十個線程同時在線增刪會話所以這里必須用并發(fā)安全的容器。我用一個獨立的工具類來管理在線會話內(nèi)部使用ConcurrentHashMap以用戶 ID 為 key以Session對象為 value。提供四個最基本的方法加會話、刪會話、查會話、統(tǒng)計在線數(shù)。為什么單獨抽一個類因為端點類和消息中心都會用到這份數(shù)據(jù)如果堆在前端類里代碼會越來越亂還會出現(xiàn)靜態(tài)變量和實例變量混淆的問題。public class SessionManager { private static final MapString, Session ONLINE_SESSIONS new ConcurrentHashMap(); public static void add(String userId, Session session) { ONLINE_SESSIONS.put(userId, session); } public static void remove(String userId) { ONLINE_SESSIONS.remove(userId); } public static Session get(String userId) { return ONLINE_SESSIONS.get(userId); } public static int onlineCount() { return ONLINE_SESSIONS.size(); } }這里要特別提醒一點同一個用戶如果重復連接比如瀏覽器刷新、客戶端斷線重連舊的 Session 沒有正常關(guān)閉Map 里就會殘留失效連接。所以在add的時候建議先判斷一下舊 Session 是否還存在如果存在就先關(guān)掉再放新的進去。否則你后續(xù)推送時可能拿到一個已經(jīng)關(guān)閉的 Session白白增加很多isOpen()判斷。3.3 WebSocket 端點的完整實現(xiàn)端點類直接寫在 Spring Boot 工程里加Component和ServerEndpoint兩個注解。路徑我設計成/ws/{userId}這樣連接時天然帶上了身份信息服務端不用再通過消息內(nèi)容去猜是哪個用戶。Component ServerEndpoint(/ws/{userId}) public class ChatWebSocketEndpoint { OnOpen public void onOpen(Session session, PathParam(userId) String userId) { SessionManager.add(userId, session); System.out.println(連接建立: userId userId , sessionId session.getId()); } OnMessage public void onMessage(String message, Session session) { System.out.println(收到消息: message); // 這里交給業(yè)務邏輯處理注意線程池隔離 MessageRouter.route(session, message); } OnClose public void onClose(Session session, PathParam(userId) String userId) { SessionManager.remove(userId); System.out.println(連接關(guān)閉: userId userId); } OnError public void onError(Session session, Throwable error) { error.printStackTrace(); } }這段代碼看起來簡單但有幾個細節(jié)值得說。第一PathParam必須和路徑占位符里的名字一致不然后臺會一直打參數(shù)解析異常的日志連接成功率看起來沒問題但用戶 ID 永遠是空值。第二onError里最好不要把異常只打日志就算了應該把當前會話刪掉避免一個半死不活的連接還掛在在線列表里占位置。第三onMessage收到的消息體格式建議直接約定為 JSON服務端不要接收裸字符串否則后面做回調(diào)配對時請求 ID 都沒地方放。3.4 消息中心設計對點推送與廣播有了一對一的 Session 映射下一步就是封裝一個消息中心讓業(yè)務代碼不用直接碰Session對象。推送消息的核心方法是sendToUser它負責根據(jù)用戶 ID 找到 Session檢查連接狀態(tài)然后發(fā)送文本消息。public class MessageCenter { public static void sendToUser(String userId, String message) { Session session SessionManager.get(userId); if (session ! null session.isOpen()) { try { session.getBasicRemote().sendText(message); } catch (IOException e) { SessionManager.remove(userId); e.printStackTrace(); } } } public static void broadcast(String message) { for (String userId : SessionManager.allUserIds()) { sendToUser(userId, message); } } }這里我用了getBasicRemote().sendText()它是同步發(fā)送線程會等消息寫完才返回。如果推送的頻率特別高建議改用getAsyncRemote().sendText()異步發(fā)送不用等 IO 完成但這意味著你要自己處理消息順序和發(fā)送失敗的回調(diào)復雜度會上去。另外一個很多人在推送時忽略的點同一個Session不要多個線程同時調(diào)用sendText()會出現(xiàn)消息交錯甚至直接拋異常。并發(fā)量大的時候可以考慮給每個 Session 加一個寫鎖或者用隊列把所有推送任務排隊處理。我在實際排查過的問題里見過好幾次“消息偶爾串線”的詭異現(xiàn)象最后定位就是并發(fā)寫同一個 Session 造成的。3.5 一個容易踩的坑Spring 容器與端點實例的隔離ServerEndpoint的端點類和普通的Component有一個本質(zhì)區(qū)別端點實例是由 WebSocket 容器創(chuàng)建和管理的每次連接通常對應新的實例它不是 Spring 的單例。很多人在這里栽過跟頭在端點類里直接Autowired一個 Service結(jié)果發(fā)現(xiàn)是 null因為 Spring 根本沒有管理那個端點實例。解決辦法是用靜態(tài)字段加 setter 注入的方式把 Spring 容器里的 Service 暴露到端點類里。具體做法是端點類加Component讓 Spring 掃描到然后在類里定義一個靜態(tài)的 Service 字段和 setter 方法setter 上加Autowired。這樣 Spring 在初始化時會把 Service 注入到 setter 里再賦給靜態(tài)字段端點實例后續(xù)就可以直接使用這個靜態(tài)字段了。Component ServerEndpoint(/ws/{userId}) public class ChatWebSocketEndpoint { private static MessageService messageService; Autowired public void setMessageService(MessageService service) { ChatWebSocketEndpoint.messageService service; } OnMessage public void onMessage(String message, Session session) { Object result messageService.handle(message); // 繼續(xù)處理 result ... } }這是很多教程里不會提到的關(guān)鍵細節(jié)。如果你打電話報錯找不到 Service十有八九就是這里沒處理好。3.6 服務端如何配合同步回調(diào)協(xié)議服務端本身不一定知道“同步回調(diào)”這回事它只需要遵守一條協(xié)議回包時必須帶上請求里攜帶的reqId。這個約定是整個同步機制成立的基礎(chǔ)。我建議在項目里提前定好統(tǒng)一的消息外殼格式。請求消息和響應消息都包含三個基礎(chǔ)字段reqId表示請求 IDtype表示消息類型payload放業(yè)務數(shù)據(jù)。這樣無論消息走的是同步請求還是異步事件接收方只要掃一眼type就能分流通過reqId就能配對。OnMessage public void onMessage(String message, Session session) { JSONObject request JSON.parseObject(message); String reqId request.getString(reqId); String payload request.getString(payload); Object result messageService.handle(payload); JSONObject response new JSONObject(); response.put(reqId, reqId); response.put(status, 200); response.put(data, result); MessageCenter.sendToUser(getUserId(session), response.toJSONString()); }服務端回包時只要找回請求里的reqId填進響應體客戶端的同步等待就能被正確喚醒。如果哪天發(fā)現(xiàn)客戶端一直超時第一個排查點就是服務端有沒有把reqId原樣返回。這個看起來不起眼卻是我見過最多的失誤原因之一。4. 客戶端封裝與同步回調(diào)落地4.1 客戶端核心骨架與連接管理這里的客戶端指的是嵌入 Spring Boot 工程里的 Java WebSocket 客戶端組件不是瀏覽器頁面。它會去連接遠端的 WebSocket 服務然后把一個“同步請求方法”暴露給上層業(yè)務調(diào)用。依賴如下我選用 Java-WebSocket 庫來做客戶端dependency groupIdorg.java-websocket/groupId artifactIdJava-WebSocket/artifactId version1.5.4/version /dependency客戶端組件核心就是創(chuàng)建一個WebSocket實例綁定服務端地址并在onMessage回調(diào)里集中處理收到的消息。連接建立之后上層業(yè)務不需要關(guān)心連接對象只需要調(diào)用我們封裝的同步方法。public class WsClient { private WebSocket socket; public void connect(String serverUrl) throws Exception { socket new WebSocket(new URI(serverUrl)) { Override public void onMessage(String message) { handleResponse(message); } Override public void onClose(int code, String reason, boolean remote) { scheduleReconnect(serverUrl); } }; socket.connect(); // 等待連接完成 CountDownLatch latch new CountDownLatch(1); // 這里可做握手完成的標志位簡化示例直接按需等待 } }有一點要注意connect()是非阻塞的真正建立連接需要幾毫秒到幾十毫秒不等。所以如果你的業(yè)務方剛調(diào)用完connect()立刻就去發(fā)消息很可能會拋“連接未打開”的異常。一個穩(wěn)妥的做法是在 onOpen 回調(diào)里放一個門閂等連接建立后再開放發(fā)消息。我實際做的時候是在內(nèi)部維護了一個AtomicBoolean connected標志每次發(fā)送前檢查沒連上就阻塞等待一會兒。4.2 請求-響應對齊的關(guān)鍵結(jié)構(gòu)整個同步回調(diào)機制最關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)有兩塊一個是請求 ID 生成器一個是等待響應的 Future 容器。請求 ID 我用AtomicLong自增序列來生成配合一個簡單的前綴保證在本進程內(nèi)唯一。如果多個實例部署建議用 UUID 或者在前綴里加上實例標識避免把不同實例的請求響應匹配錯。public class WsClient { private static final AtomicLong REQ_SEQ new AtomicLong(0); private final MapString, CompletableFutureString pendingMap new ConcurrentHashMap(); private String generateReqId() { return REQ_ REQ_SEQ.incrementAndGet(); } }pendingMap就是那個“等待區(qū)”。每個請求發(fā)出前往 Map 里放一個CompletableFuture收到對應響應時從這個 Map 里取出 Future把它完成掉。Map 用ConcurrentHashMap是因為可能有多個業(yè)務線程同時發(fā)起請求、多個消息回調(diào)線程同時處理響應必須在并發(fā)場景下保證安全。4.3 封裝同步請求方法核心方法sendSync的邏輯這樣設計生成請求 ID、封裝消息、注冊 Future、發(fā)送消息、阻塞等待、最后無論如何都要從 Map 里清理掉這個 Future。清理這一步絕對不能省否則服務端一直不回包Map 里就會堆積大量的 Future 對象時間一長就是內(nèi)存泄漏。public String sendSync(String payload, long timeout, TimeUnit unit) throws Exception { String reqId generateReqId(); CompletableFutureString future new CompletableFuture(); pendingMap.put(reqId, future); JSONObject request new JSONObject(); request.put(reqId, reqId); request.put(type, BIZ_REQUEST); request.put(payload, payload); socket.send(request.toJSONString()); try { return future.get(timeout, unit); } finally { pendingMap.remove(reqId); } }這個方法的調(diào)用方式非常直白業(yè)務方傳一段 JSON 字符串傳入超時時間然后同步拿到服務端返回的另一個 JSON 字符串。如果服務端那邊處理時間大致可預估建議把超時設置成 3 到 5 秒如果包含復雜的業(yè)務鏈路可以放寬到 10 秒但超過 30 秒我一般不建議因為長時間阻塞業(yè)務線程會讓整個應用的線程池很快耗盡。4.4 心跳?;钆c斷線重連長連接有個天然的敵人網(wǎng)絡中間設備和服務器本身會清理閑置連接。Tomcat 默認會有空閑連接超時Nginx 代理也有讀寫超時如果客戶端長時間不發(fā)送任何數(shù)據(jù)連接就會被對端靜默關(guān)閉??蛻舳俗约焊兄坏降鹊较麓伟l(fā)消息才發(fā)現(xiàn)連接已經(jīng)斷了這時同步請求就直接卡到超時。所以客戶端必須加心跳。我一般用ScheduledExecutorService每隔 10 秒發(fā)送一個心跳消息消息體統(tǒng)一成{type:PING}。服務端收到 PING 時不需要回業(yè)務數(shù)據(jù)但可以回一個 PONG或者只要服務端還在正常讀數(shù)據(jù)客戶端這條心跳就起到了保活作用。private void startHeartbeat() { ScheduledExecutorService executor Executors.newSingleThreadScheduledExecutor(); executor.scheduleAtFixedRate(() - { if (socket ! null socket.isOpen()) { JSONObject ping new JSONObject(); ping.put(type, PING); socket.send(ping.toJSONString()); } }, 10, 10, TimeUnit.SECONDS); }斷線重連方面我會在onClose里觸發(fā)重連邏輯但重連不能做成無腦循環(huán)否則服務端還沒恢復客戶端就會以極高的頻率瘋狂創(chuàng)建連接把服務端打得更慘。建議做退避重試第一次 1 秒、第二次 2 秒、第三次 4 秒指數(shù)遞增最多間隔 60 秒服務端恢復連接后把重連次數(shù)清零。重連期間所有正在等待的sendSync請求會因為超時統(tǒng)一失敗上層業(yè)務要接受這種“短暫不可用”的現(xiàn)實并在失敗后走自己的重試策略。4.5 回調(diào)協(xié)議的最佳實踐與參數(shù)建議這部分我總結(jié)了幾個真正算得上經(jīng)驗的東西。第一消息格式必須是 JSON并且在項目一開始就定好外殼字段不能今天用reqId明天用requestId這種不一致會讓整個調(diào)試過程變成災難。建議統(tǒng)一為reqId、type、payload三個字段同步響應再加一個status表示結(jié)果狀態(tài)碼。第二sendSync返回的響應建議不要直接返回原始字符串最好解析成JSONObject再返回同時把status非 200 的響應當成業(yè)務異常拋出去。這樣上層業(yè)務代碼拿到的是干凈的結(jié)果而不是還要自己判斷一堆狀態(tài)位。第三請求 ID 最好在客戶端生成。如果服務端也可以生成就會出現(xiàn)兩邊 ID 體系不一致的問題調(diào)試時很容易看花眼??蛻舳松珊笤瓨觽鹘o服務端服務端原樣回傳鏈路清晰問題也好定位。第四同步回調(diào)適合“必須有結(jié)果”的操作但不是所有消息都適合同步。像心跳、狀態(tài)上報、位置推送這類頻率高、不關(guān)心響應的消息建議走獨立的異步通道不要通過sendSync發(fā)否則線程池重負載下這些消息也會排隊等待白白增加延遲。5. 實戰(zhàn)避坑與排查實錄5.1 常見問題速查表我把實際開發(fā)中遇到過的問題整理成了一張表按現(xiàn)象排查效率很高現(xiàn)象可能原因解決辦法客戶端始終連接不上服務端缺少ServerEndpointExporter注冊檢查配置類是否注冊了該 Bean連接報 400 握手失敗路徑參數(shù)不對或請求路徑與端點不匹配核對ServerEndpoint路徑和客戶端連接地址請求 100% 超時reqId沒有配對服務端響應里丟了reqId抓包看服務端回包字段確認reqId原樣返回連接頻繁斷開沒有心跳中間設備回收空閑連接客戶端加心跳建議 10 秒一次消息出現(xiàn)錯亂或串線同一 Session 被多個線程并發(fā)寫加 Session 寫鎖或全部改成異步發(fā)送重連后消息發(fā)不出去重連成功后內(nèi)部連接狀態(tài)沒更新在 onOpen 回調(diào)里更新連接標志位長時間運行后內(nèi)存增長明顯pendingMap中超時的 Future 沒清理finally塊里執(zhí)行pendingMap.remove(reqId)5.2 幾個我踩過的深坑第一個深坑就是忘記注冊ServerEndpointExporter。項目啟動完全正常沒有任何報錯但所有 WebSocket 連接都失敗我在瀏覽器控制臺看到的是 404。排查了半天才發(fā)現(xiàn)是配置類里少了一個 Bean這種問題報錯信息不直接非常迷惑人。第二個深坑是瀏覽器里連接 503。如果你前面掛了 Nginx 之類的反向代理必須在代理配置里顯式開啟協(xié)議升級并且設置合理的超時時間。很多人本地直連正常一到測試環(huán)境就失敗基本都是這一層沒配置。生產(chǎn)環(huán)境還要注意負載均衡器的會話保持不然同一個客戶端的多次連接會被轉(zhuǎn)發(fā)到不通的節(jié)點上。第三個深坑是普通方法里調(diào)用sendSync導致線程池打滿。我當時在業(yè)務線程里直接調(diào)同步請求結(jié)果服務端回包變慢幾十個請求全部卡在future.get()上業(yè)務線程全部占滿應用開始出現(xiàn)連環(huán)超時。后來給同步請求單獨隔離了一個線程池并且嚴格限制超時時間這個問題才算解決。第四個深坑是關(guān)于 Resend 或者消息重發(fā)。WebSocket 底層不保證消息不丟有時候服務端確實不會回包客戶端超時后會重試。重試時不能直接把同一個reqId重新發(fā)一遍否則如果服務端前面已經(jīng)處理成功只是回包丟了會引起業(yè)務重復執(zhí)行。建議給每條消息加一個sequence序號重試時用新reqId但在payload里帶上原始業(yè)務冪等號服務端自己決定是否要去重。5.3 分布式多實例下的拓展思路以上所有方案在單機模式下都是沒有問題的因為會話信息都存在本地 JVM 的ConcurrentHashMap里。一旦項目從單實例擴展成多實例部署問題就出來了用戶 A 連接在實例 1用戶 B 連接在實例 2實例 1 想推送消息給 B本地 Session 里根本找不到 B 的連接。常規(guī)解法是把“在線會話表”從本地內(nèi)存挪到外部存儲比如 Redis 哈希結(jié)構(gòu)里記錄 userId 和節(jié)點 ID 的映射。推送時先查路由表找到目標節(jié)點再把消息投遞到對應的實例由該實例的本地會話表完成真正的推送。節(jié)點間通信可以用消息隊列或者 Redis 發(fā)布訂閱來做實例只需消費消息并判斷消息里的目標節(jié)點是不是自己。同步回調(diào)在這種架構(gòu)下也會變得復雜但好在請求 ID 的機制不受影響只要消息能路由到正確的節(jié)點配對邏輯依然成立。我通常建議先把單機版跑通再考慮加分布式路由層不要一上來就把復雜度拉滿。最后再分享一點個人體會整個項目跑通之后我最大的感受是同步回調(diào)這個能力真正難的不是代碼而是協(xié)議先想清楚。你只要把reqId、type、payload、status這套外殼定好后面換服務端框架、換客戶端引擎都不傷筋動骨。我后來遇到類似的需求第一件事永遠是先確認消息格式而不是先寫連接代碼。另外一個很實際的心得是同步語義雖好但不要貪只對業(yè)務上確實需要返回結(jié)果的請求用同步像心跳、狀態(tài)廣播這些應該走純事件否則你的線程池很快就會被占滿。要是后續(xù)打算跨集群擴展可以把請求 ID 和路由信息塞進消息頭再配一個消息網(wǎng)關(guān)這套客戶端組件基本不用改服務端的路由層單獨替換就行。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
青青草原人妻| 欧美日韩中文视频播放| 一区二区偷拍拍视频| 性爱综合一区二区| 夜夜爽夜夜摸夜夜操免费视频| 99re在线观看| 免费视频无码| 久久肏大逼| 国产精品久久久久久久久久梁医生| 色欧洲97| 午夜精品久久久久久久99热影院| 久久久久久9| 日韩av情韩国爱禁区av一区二区| 中字一区| 蜜桃臀一区二区aV| 嗯嗯,好大,好爽,好骚| 日韩无码嘿咻黑热久| 欧亚乱色熟女一区二区| 日本精品网站在线中文| 香蕉欧美| 色色毛片| 国产在线综合福利网站| 亚洲色图欧美一区二区不卡| 人妻少妇精品| 在线A日本| 久久一二三四| 毛片一区二区| 成人小说视频在线精品欧美| 国内精品嫩模A∨私拍小视频| 污电影在线观看| 欧美91精彩| 大乔未久88一区| 99色日| 日本伦理一区二区| 啊啊啊不要啊啊受不了了视频在线| 久久久久久亚洲精品中文字幕人妻| 天天综合日韩网| 超碰79人人乐| 96久久久精品| 91中文字幕制服丝袜免费视频| 日逼97| 久久系列| 成人性爱免费播放| 久久男人精品| 国产福利精品最新在线| 国产亚洲在线| 国产日韩精品一区二区三区| 制服丝袜第二页| 青青伊人加勒比海| 国产精品电影大全| 天天谢天天干| 东京热视频网| 色精品极品| 亚洲精品久久久久毛片A片拉屎 | 无码高清操逼网址| 美腿丝袜偷拍亚洲欧美| 青青青草伊人精品| 国产精品久久泡妞网站| 蜜臀99久久精品久久久久| 亚洲精品一区二区精品| 清纯唯美综合| 亚洲熟女乱色一区二区三区久久久 | 超碰9 7女人| 日本久久99| 国产亚洲中文不卡二区| 美女一区二区国产精品| 曰韩av中文字幕专区| 伊人五月天| 另类一区| 91亚洲黑人| 亚洲天堂中文字幕无码男同| 亚州精人品大香蕉| 亚洲色图20p| 殴洲老熟女| 欧美一区二区三区黄色影视| 免费观看网黄| 国产传媒午夜理伦精品| 久久精品国产亚洲AV无码电影| 青娱乐亚洲自拍| 黄色片一区二区三区四区五区| 蜜乳视频网站| 多乙久久久久久| 九九热最新| 超碰 另类 欧美 | αⅴ天堂| 9/A片 | 久久久久久久久999| 青草精品视频日本久久久久网站在线| 九九九精品成人免费视频小说| 国产成人超碰在线| 国产精品九9| 性九九九九九九| 亚洲天堂欧美| 日日噜噜夜夜久久亚洲一区二区| 亚洲午夜精品久久久中文影院| 蜜臀久久99精品久久久久| 无码精品人妻一区二区三区妖精 | 3p国产色噜噜一区| 天天操美美| 欧洲在线性爱视频| ?亚洲伊人伊成久久人综合网| 天天香香欲综合| 欧美激情精品久久久| 国产午夜福利专区综合| 艾草av| 91色欧美| 大香蕉啪啪网| 亚洲资源一区| 蜜桃传媒一区二区亚洲| 国产精品第一页国产大屁股视频免费区 | www久| 91nbbbbbb| 人妻中文字幕精品无码| 亚洲美女 晚间男人天堂| 国产综合日韩伦理| 九九热五区| 啊啊啊免费视频| 久热伊人99re| 素人一区二区三区日韩| 91综合国产精品| 多毛小伙内射老太婆| 亚洲综合贴图91| 亚洲国产日韩欧美熟妇在线| 欧美激情高清性猛交| 五月婷婷激情网| 欧美亚洲天天| 91丝袜激情在线| 久久性生大片免费观看性| 日韩有码一区三区| 日B操| 97免费视频网| 婷婷五月天成人| 综合影院永久入口国产| 国产欧美日产一区二区三区 - 国产欧美日| 亚洲熟女性高潮久久久| 蜜区区视频79 | 亚洲精品国产熟女久久久| 啊啊啊啊一区| 国产女人操逼视频| 亚洲暴力强奸AV| 欧美性色欧美| 国产二区三区粉嫩在线| 欧美在线播放aaaa| 黄色视频60分钟| 国产三级片在线观看| 大香蕉综合久久| 国产一区二区啪啪视频| 日本一级特级毛片视频| 九九九九九九视频| 美女毛片999| 亚洲福利中文字幕在线| 日日噜噜夜夜狠狠视频无| 91精品国产乱码| 久久久18禁| 亚洲日韩一区电影| 偷拍伦理视频| 日本欧美成人片AAAA| 手机在线视频国内精品| 又大又长又粗又爽又黄| 免费久久一级毛片大黄| 九九精品无码专区免费| 色婷婷婷五月天激情四射| 亚洲的天堂网| 久久大香蕉手机高清视频| 强奸乱伦亚洲第一页| 日韩一级久久毛片| 中文字日本乱码| 亚洲综合另类| 美女啊啊啊啊啊啊啊| 欧美日韩成人在线| 一色网男人的天堂| AV色五月天| 久久精品国产亚洲AV清纯| 插入逼91| 丰满人妻一区二区三区四区| 欧美A√综合网| 国产欧洲精品亚洲午夜拍精品| 综合97久久| 天天干夜夜操一区二区| 欧美激情在线观看视频| 人人看人人爰人人操| 国产色呦呦| 日本久久99| 色99视频| 精品人妻视频一区二区三区蜜桃视频| 日韩熟女视频二区| 日韩一区二区精彩视频| 99久在线精品99re8| 婷婷五月天网| 天天操天天7| 夜夜精品视频| 久久男人精品| 开心五月天激情网| 亚州性色| 91人人操| 久日91在线| 久久亚洲AV成人精品无码| 大香蕉伊人亚洲| 老外又粗又长一晚做五次| 啊好爽快点-国产一区二区三区撒尿在线-成人AV| 欧美综合自拍| 超碰97在线中文| 一区二区三区机械有限公司| 啊啊啊啊啊啊好多水| 人妻在线臀日韩| 国产女人高潮嗷嗷嗷叫小说| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 日日妻色网| 中文字幕一区av| 操逼免费视频无码国产| 韩三级a视频在线观看| 熟人人妻少妇精品久久| 欧美曰韩国产精品| 七久久久| 99自拍视频在线观看| 中文乱码字字幕在线第5页| 欧美熟妇亚洲版| 九一综合精品视品av| 探花激情视频| 黄片免费看黄片免费看| 国产91啪| 黑人综合网| 久久9免费视频| 黄呦呦在线| 东北黄色电影| 午夜操一视频一区| 狠狠干妹子| 高跟丝袜AV专区国产| 97在线视频网站| 91天天综合日韩欧美| 成人免费不卡在线视频| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日本三级R| 99啪啪| 97中文字幕一区| 成人av动漫在线观看| 亚洲 欧美综合| 五月天色五月| 日韩欧美性吧婷婷乱伦大香蕉| 日本一级性爱| 97干97色| 午夜福利在线合集| 五月丁香网站| 狠狠干狠狠色| 亚洲欧美精品一区天堂久久| 国产按摩一区二区三区| 国模91| 亚洲男人天堂手机版| 高清国产精品福利网站| 久久精品店| 久久久9品一区二区三区| 久草男人天堂| 国产97在线 | 亚洲| 视频一区二区免费在线| 91黑丝在线播放| 免费观看的黄色的网站| 成 人 影视 一区 二区 三区 四区 | 精品视频123区小说区| 中文字幕91综合| 欧亚在线视频| 日韩av熟女一区二区三区成人| 久久只有精品一区二区三区| 久久久久国产精品人妻aⅴ天堂| 精品丰满熟妇人妻一区| 成人羞羞视频国产| HEYZO高无码国产精品227| 久久久 国产精品| 欧美熟爽综合| 欧美洲精品一级| 一区二区乱码福利| 日韩精品一区的| 人妻熟女一区二区| 亚洲阿v天堂无码z2018| 亚洲人妻一区二区三区| 国产中午字一暮区| 影音先锋视频在线| 淫骚熟女一区二区三区| 操b在线观看| 日韩操人| 麻豆色99999| 国产福利电影| 国产精品成人蜜臀AV在线| 天天碰操中国年青熟妇| 深夜福利黄片| 久久99久久99久久99人受| 五月天久久婷婷亚洲| 欧亚 另类 久| 国产精品女生av| 欧美日韩人人精品| 精品九九九| 久久精视频美日韩在线视频| 婷婷丁香一区二区三区| 日韩性爱一级片| 久久综合18p| 欧美97网| 成人精品在线| 精产品久久| 网页导航五月天免费一二三区| 口爆欧美91| 自拍偷拍国产欧美日韩韩| 色五月丁香五月| 亚洲脚交| 久热九九| 神马麻豆福利院| 欧美疯狂做爰xxxx| 欧美成人贴图| 欧美在线播放aaaa| 亚洲av资源| 天天日天天爽| 大肥女高潮bbwbbwhd视频| 久久国产99精品72福利 | 最新精品久久蜜桃| 强奸乱伦AV网站| 久久噜| 伊人久久综合影院| 精品国产乱码久久久久久日本公司| 人妻中文字幕精品无码| 91色色综合| 久久鲁干| 人人操人人爽人人操人人| 美女露胸露尿口| 精品欧美老熟女一二区| 大香网伊人久久综合网eew| 美女操逼A A| 日韩一区二区熟女| 福利视频一区二区微拍| 欧洲站一级二级三级h| 黄色香蕉视频网站一区| 五月天精品| 97久精品| 97在线视频观看网站| 亚洲天堂美臀在线| 亚洲欧洲另类| 精品国产乱码| 天天欧美| 天天操人人操骚逼网站| 色婷五月| 成全在线观看免费观看| 久久伊人影院| 国产精品3| 屌逼麻豆| 亚洲欧美日韩免费电影| 自拍啪啪视频| 久久久av爱| av资源在线播放天堂| 亚洲男人天堂av| 亚洲精品骚逼| 超碰碰碰碰| 69XX一中文字幕人妻91| 91免费看中出视频| 五十路人妻在线| 亚洲无码色| 狠狠色噜噜狠狠狠狠2018| 欧美色综合图片| 综合色图区| 国产h片在线观看视频| 97美日韩视频| 啊嗯嗯啊好大好爽| 日本免费不卡二区| 大地资源在线观看中文第二页| 精品午夜福利| 欧美综合中文| 精彩久久中文| 精国久久一区二区三区98| 婷婷亚洲五月***久久| 日韩av电影成人在线| 999热日韩精品| 婷婷香网站| 蜜臀久久99精品久久久久久久久| 日韩人妻播放| 欧美午夜视频免费观看| 亚洲欧洲日本精品中文a∨| 九九操久久国产免费视频| 激情亚洲天堂| 色老大| 欧美日韩精品国产91| 一本久道久久综合狠狠爱| 免费簧片在线观看| 久久久久久电影| 操东北女人| 91亚洲黄色网| 校园春色美腿丝袜 | 午夜啪| 天堂综合网| 97操B| 啊啊啊啊免费视频| 亚洲国产精品久久久久婷婷老年| 97 九色| 玖玖蜜臀资源网| 人妻激情偷乱视频一区二区三区 | 丁香啪啪| 婷婷丁香五月激情啪啪| 亚洲AV无码成人精品久久| 青椒国产97在线熟女| 麻豆天美传媒毛片| 插入逼91| 日韩成人高清一区二区| 牛牛操视频逼| 奇米狠999| 国产精品视频自拍在线| 蜜乳AV免费观看| 无套内射人妻在线播放| 日本123区操B视频| 99热在线观看| 欧美嗯啊……在线观看视频免费| 超碰1997| 超碰天天去日穴| 中国91AV| 亚洲 无码 偷拍| 日韩三级伦理中文字幕| 26uuu偷拍亚洲欧洲综合| 欧美十八禁视频| 亚洲自拍天堂| 在线国产探花| 啊啊啊啊啊操我视频| 伊人一区二区三区| 中文精品少妇天堂| 97日韩欧美| 伊人网青青| 最近的最新的中文字幕视频| 亚洲情色91| 国产精品午夜成人福利| 精品一区二区三区蜜桃臀www| 欧美综合天堂| 丰满美女一级毛片在线播放| 欧美另类精品xxxx| 亚洲老熟妇xxx| 德国一二三不卡| 丁香7月婷婷| 综合第一页| 性爱乱伦视频免费| 日本 欧美 亚中文字幕| 刺激精品视频| 亚洲色图 91| 精品视频一二三中文| 97人人夜夜精品视频| 亚91亚洲网| 加勒比五月天| 欧美性爱综合,免费| 一本一道波多野毛片中文在线| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 特污免视频| 男人把坤坤插入女人的下体| 酒色综合网| 日本熟女中文字幕一区| 九九视品黄色| 熟女少妇视频| 亚洲日韩国产欧美综合v| 午夜天天碰综合视频| 久久久久78| 亚洲高清自拍| 色五月亚洲| 国产精品久久久久999| 97超碰护士| 自拍偷拍2025在线观看| 丰满人妻一区二区三区在线| 91五十路| 九九热精品| 大香蕉日亚洲日本亚大| 欧美日韩不卡a片| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 天天躁日日躁AAAXX| 亚洲永久永久永久永久一级一级一级精品| 神马久久久久久久| 人妻少妇精品一区二区三区| 亚洲双插| 最新日韩黄片| 国产美女91| 色情乱伦AV| 久久999久| 国产在线观看一区二区三区| 无码人妻丰满热妇又大又粗| 中文字幕78| 91丝袜美女视频| 92福利社视频| 超碰九区| 精精夜夜| 中国人高清www色视频免费| 婷婷激情五月| 亚洲欧美999| 五月天色图影视| 狠狠入| 久久久com| 精品视频一二三中文| 色婷婷网| 欧美日韩中文字幕人妻| 国产极品999| 97亚洲综合影院| 99超碰色| 国产亚洲色停停久久99精品91| 大香蕉97久久| 富女玩鸭子一级毛片| 亚州精品一区二区三区香中文字幕在线| 欧美熟妇精品黑人巨大91| 综合久久99亚洲人妻中文在线| 亚洲啪啪视频一区二区| 97超碰中文字幕| 成人午夜视频免费播放| 神马午夜久久| 乱欲性色| 国产超碰| 日本伦乱九九九综合| 人人超碰在线观看黄| 91精品人妻电影| 久久9久久| 麻豆人妻精品一区二区| 亚洲 欧美 日韩 国产一区二区| 粉嫩AV一区夜夜嗨| 看一级黄色视频| 2017亚洲天堂| 久久久久大香青草精品综合| 男女一级A片大黄,一进一出| 韩国三级一线观看久| 最新精品久久蜜桃 | 操逼www.| 91老女人| 亚洲情色一区二区三区| 午夜男人一级A片7777| 91亚洲人| ...日韩成人一区二区三区字幕| 婷婷五月花| 国产精品高清2021在线| 91成人亚洲色图| 日本午夜福利视频| 26uuu国产免费观看| 日日爱99| 欧美女同在线| 成人欧美日超碰| 五月丁香婷婷综合| 三级特黄60分钟播放| 18+91网站| 伊人少妇久久久| 久热69九色熟妇97| 日本在线不卡一二区| 久久国产逼| 欧美色图20P| 国产成自自拍在线观看| 丁香五月av| 你想操日本小逼吗| 黄页av| 成人资源中文字幕在线观看| 亚洲精品骚逼| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 女性91网站| 午夜后入| 色一射色一射| 人妻天堂综合网| 中国女人内射6XXXXX| 日韩成人性日韩成人性爱视频在线免费观看 | 久久久久9久久久久| 天天色播| 爱做久久久久久| 东北丰满熟女国产一区 | 综合五月婷婷| 播播亚洲小说亚洲| 熟女色综合久久| 天堂а√在线最新版在线| 五月天亚洲色图| 亚洲天堂电影网99999| 五月天欧美色图| 欧美 亚洲 另类 综合| 亚洲s在线观看| 欧美性爱五月天| 五月婷婷六月丁香| 久久伊人五月天| 五月婷婷久久综合| 久久久网站| 黄片com.| 91九色网| 日本曲间由美性生活片| 中文字暮97| 91 国产丝袜在线放观看| 久久这里都是精品| 超碰久久性爱| 天天综合网久久ww| 九九九九免费高| 亚洲一二三| 天天操人人操骚逼网站| 97超碰超欧美。| 91亚洲丝袜熟女| 高清无码91| 操熟女91| 久久久性| 日本国产高清色www视频在线| 久久无码电影| 久久久久9| 91久久精品蜜臀| 超碰调教97| 色五月天AV| 亚洲色图自拍| 国产精品第一页国产大屁股视频免费区| 97超碰色色| 青娱乐淫乱1314| 日韩欧美成人性爱在线| 九九aV| 婷婷色一区| 国产又大又粗又长视频在线| 久热久操| 亚洲色图A| 四虎国产精品永久在线囯在线| 国产精品美女久久久久AⅤ国产馆| 国产精品熟女丝袜一区二区| 中亚av| 制服少妇欧美| 日日嗷| 亚洲码在线中文在线观看| av网站在线观看了| 国产超碰人人操| 激情五月天丁香| 久久av色| 午夜啊啊| 国产一级高跟丝袜| 97九色人妻| 人妻无码久久一区二区三区免费| 欧美性高潮在线| 日韩 国产 欧美自拍| 伊人久久婷婷| 欧美日韩婷婷中文| 久久少妇| 91操操| 欧美情色贴图| 一区二区影视| 日韩色| 一区 欧美 日韩 麻豆| 亚洲精品97久久中文字幕| 日本淫乱女一区二区三区视频| 视频分类 国内精品| 91女网站| 78操B| av无码av无码专区| 99久在线精品99re8a| 国产极品馒头逼| 伊人女女资源在线观看| 欧美91精彩| 亚洲精品一二牛牛| 久久香蕉国产传媒一区剧情天美| 欧美九一精品久久久熟妇| 久久黄色视频一区二区三区 | 95精品在线| 玖色av| 永久电影三级在线观看| 蜜臀久久久久久999| 日韩91网| 欧美日韩第一页| 亚洲人妻久久久| 国产AV激情无码久久无码| 欧美狠狠弄| 亚洲日韩在线a不卡99精品| 狠狠狠狠狠狠| 人妻第一页| 操逼日韩无码 | 麻豆AV一区二区天美传媒| 岛国免费黄色网址| 欧美色图在线视频少妇| 99国产精品视频尤物| 国产福利夜| 激情 欧美 亚洲 小说| 精品熟女一区=区三区| 久久人妻熟女一区二区| 欧美精品久久久久久久久88| 超碰在线综合97| 加勒比久久综合网高清| 97超碰精品成| 十八禁啪啦拍视频无遮挡| 午夜精品人妻二区三区| 日韩国产成人自拍视频| 国产又粗又长视频| 国产玖玖| 四虎精品永久在线播放| 狠狠色丁香| 97这里只有精品| 亚洲色婷婷| 欧美日韩大陆黑人少妇99| 69精品久久久久中文字幕| 精品三级在线专区| 放黄片放3级黄片没穿衣服| yazhououmeizongya| 国产一| 目产99999久久999| 欧美精品第四五页中文字幕在线观看| 俺去久久| 久操综合在线| 久久9 9 9精品| 国产精品久久久亚洲一区| 屌逼麻豆| 亚洲天堂自拍| 麻豆一区二区三区在线看 | 女一区二区| 国产专区路线| 天操天操夜操夜月月年年操操| 91精品人| 国产成人自拍视频在线| 国产一区二区视频在线播放| 97天堂| 屌妞视频久久久久久久| 97免费视频在线观看视频| 超碰到97情色| 青娱乐淫乱1314| 在线看片国产精品每日更新| 欧美极品女人的天堂| 天天干天天日天天射黄色片| 99精品综合久久久久五月天| 亚洲美女精品九九视频| 国产一区二区三区视频在线看| 国产精品老师| 久久综合中文国产| 中文字幕一区二区无码成人| 欧美日韩在线视频网站| 激情五月天色色网| 欧美第二页午夜| 日本成人免费一区二区三区| 五月婷婷AV| 欧洲免费一区二| 欧洲亚洲人妻无码高清久久三区四区| 国产精品不卡一区二区三区av| 亚洲AV无码国产成人| 亚洲丝袜天堂| 欧美伊人久久综合网| 99操| 狠狠色五月亚洲91| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 性爱1区| 超碰在线1234区| 亚洲人妻中文在线视频| 天天综合网91入口| 99热| 久久国产精品熟女人妻| 18禁免费视频| 欧美手机在线综合| 欧美老妇综合网| 天天摸天天操视频| 99色在线视频| 亚洲91色| 日韩99神马视频片| 国产免a费看黄片在线| 国产a级精品| 亚洲熟女性高潮久久久| 精品人妻一区二区三区蜜桃视频| 欧亚性爱啪啪| 九月伊人中文字幕| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚州色图狠狠干| 国产精品亚洲无码| 极品出轨视频网站| 大香蕉天天看妹子| 欧美日韩岛国大片在线观看| 超碰97COm中文| 制服少妇欧美| 亚洲AV永久无码一区仙野| 欧美综合网在线| 伊人视频| 偷拍亚洲高清图片| 精品婷婷| 五月丁香社区婷婷日韩欧美精品影院 | 德国一二三不卡| 国产亚洲精品激情| 鸥美中出| 欧美亚洲韩国视频十五区| 久操高青| 嗯啊不要在线观看嗯啊| 亚洲综合激情五月久久| 久久五十路熟女人妻| 国产真实子伦对白| 人妻三级在线中文字幕| 91网站在线播放| 亚洲揄拍网| 日韩精品人妻中文字幕久久久| 精品国产片亚洲一区| 日韩一区二区三区四区五区 | 亚洲码专区| 国产精品蜜乳AV| AV一区观看| 国产在线观看91精品一区| 亚洲无992tv| 日本布卡一区二三区| 91欧美情色| 99久久99久久免费精品蜜臀| 丝袜美腿av女优在线| 2021国产成人精品久久| 被男人吃奶很爽的毛片| 国产强奸乱伦第1页| 日本αv| 日韩不卡av一二三| 亚洲成人久久美女| 97AV爱| 青青草成人视频在线观看二区| 久啪| 欧美精品97| 福利视频一区二区微拍| 91色综| A啊啊在线观看| 欧美精品亚洲精品日韩传电影| 91色人| 思思久热在线精品66| 久久国内| 国产婷婷一区| 偷窥自拍亚洲| 97人人操人人摸人人爱| 欧美日韩丝袜| 久久偷偷色综合蜜桃| 日韩成年人性爱视频| 欧美顶级黄片AAAAA在线免费看| 95精品在线| 中出后入| 国产无码高清操逼视频| 久久久久日本视| 久久久96精品| 日韩亚洲精品一区二区| 综合色久| 久久精品国产97欧美精品亚洲 | 91丨九色丨大屁股| 91伊人久久在线| 午夜AV人气不卡| 夜夜 中文视频rt| 国产精品露脸在线观看| 国产后入精品| 国产9l 大屁股| 五月天婷婷基地| 老鸭窝成人| 五月婷婷AV| JuliaAnn丝袜熟女系列| 99久久综合网| 暴力av在线| 99碰碰| 九九久久玖玖| 美女的肌被草喷水视频| 国产强奸乱伦无码视频| 欧美色图天堂网m| 欧美aaaaaaa| 欧美中字不卡| 大香蕉五月天| 亚洲精品国产精品成人| 超碰久在线天天做| 8050午夜少妇无码| 亚洲男人的天堂网| 日韩性爱高清免费视频| 无码人妻精品酒店| 最新精品久久蜜桃 | 欧洲与亚洲欧美精品中文字幕| 亚洲精品天堂久久A∨51成人漫| 97超碰热线| 欧美日韩国产高清在线一二三区 | 91精品老女人| 后入式999| 97人肏| 日本性爱网址| 成年人网站在线免费观看| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 色牛aV| 蜜臀久久99精品| 色婷婷丁香五月| 久热香蕉精品在线视频| 久久性爱视频99| 97亚洲自在精品在线观看| 丁香五月天堂| 13小男生GAY自慰脱裤子| 麻豆激情综合| 欧美爆操91| 99热官网| 看一级黄色视频| 黄色片一区二区三区四区五区| 精品久久久久综合无码| 久久精品高清无码一区| 中文字幕片| 天天爽天天| 五月色综合| 成人在线日韩| 亚洲日产专区| 九九在线精品| 男人的天堂网免费| 久久久久骚| 嗯嗯嗯,草死我| 亚洲欧美综合色| 青娱乐av在线| 日本女厕偷拍| 99色骚| 大香蕉92| 久久伊人影院| 亚洲国产综合视频| 亚洲高清无毛一区二区| 在线色导航| 91人妻素女| 日本三级韩国三级99| 亚洲综合激情五月久久| 69精品在线| 欧美性爱网97| 欧美—性—交—色| 精品午夜福利| 一级二级三级黑人无码| 波多野结衣先锋影音| 丁香五月天啪啪| 色盈盈影院| 中文字幕欧美日本乱码一线二线| 精品乱码在线观看| 美女诱惑久久| 亚洲午夜福利在线影院| 色五月婷婷五月天| 9久久美女首页| 亚洲欧美洲综合| 久久这里是精品| 久久黄色网址| juliaann欧美丝袜办公室| 亚洲精品无码久久AV| 99碰碰| 久久9999 | 91大学精品激情戏| 免费99精品国产自在在线| 人妻少妇久久中文字幕一区二区 麻豆| 久久肏大逼| 99re99视频在线免费观看| 亚洲九九九九| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 在线观看中文av字幕| 久久久网一区| 亚洲AV无码乱码| 日韩传媒在线| 久久 国产 无码| 青娱乐av在线| 少妇大屁屁| 精品国产www久久| 啊啊啊啊啊啊啊网址在线观看| 老司机深夜18禁污污网站| 久久久久久久久久久久久久久乱码| 97日韩超碰超碰中文字幕| 熟女乱伦二区| 色五月AV| 狠插 制服 自拍| A 天堂在线观看视频| 四虎影视永久在线观看精品免费网站| 岛国在线一区二区三区| 91国精产品| 美女黄频a美女大全免费皮| 欧美少妇高潮| 99999久久久久9国产精品| 色在线亚洲视频www| 龙兴卡官方查询| 亚洲免费人妻在| 国产馆| 少妇69中文| 日韩啪啪网| 亚洲欧洲成人在线电影| 久久精品中文字幕女同| 少妇超碰在线| 黄页网站免费高清在线观看| 日本天天干天天日一区| 精品 码产区一区二-1080P高清在线www-B029AV| 欧美AB在线| 欧美一二级| 少妇极品熟妇人妻无码| 久久精品99| 国产男人又猛又粗又爽| 亚洲一卡二卡在线免费| 亚洲精品九九九九九九| 亚洲色图欧美色图制服丝袜| 久热91| 日韩久久激情精品| 中文字幕精品一区二区精| 人人搞人人插人人操| 日韩熟女精一区二区三区不卡| 美女骚尻视频| 2026国产精品视频| 精品乱子一区二区三区99| 夜夜一区二区| 亚洲天堂,男人| 色综合99| 开心五月激情网| 长长久久88视频| 十八禁视频网站| 激情五月天色色| 97干在线视频| 精品久久久久久亚洲| 欧美丰满熟妇XXXX性ppX人交| 亚洲成人无码影院| 韩国免费播放一级毛片| 国产成人91一区二区三区| 欧美高清无码免费视频高清版| 国产一国产一级毛片古装| 男人的天堂2018| 天堂а√在线最新版在线| 日本国产欧美高清在线| 亚洲av影院在线观看| 1024日韩| 爱干爱射网啊啊啊| 老女人老91妇女老热女| 后入福利视频| 怡春院久久| 精品97久久| 蜜乳视频网站| 97人人操人人干| xxx亚洲午夜天堂| 国产精品在线一区二区| 亚洲成人贴图| 狠狠操夜夜| 无码91| 久久精品一区一起草| A片大香蕉在线| 精品国产一区二区三区av在线资源| 国产精品经典一卡久久久| 久久青娱乐| 日逼逼免费看| 色哟哟的毛片| 国产25页| 欧洲综合色| 色色网91| 97视频网站在线观看| 天天操天天日青青草超碰av| 男人综合网| 国产高清成人传媒影视| 日本久久999| 国产精品嫩草久久久久| 九久久九精品视频| 青青操网| 夜夜操av亚洲一区二区| 日韩99999| 久久久久久久人妻| 青青草在线视频播放器| 天堂8在线新版官网| 死我十八禁| 久久激情网| 夜夜性| 成人网欧美风情| 人人干黄色| 亚洲图片 激情小说| 日本操逼二区| JuliaAnnXXX888| 久久久亚洲精品电影免费看| 欧美第一页| 久9久9精品| 久热9| 91在线精品一区二区三区| 国产成人AV麻豆| 粉嫩av在线一区二区| 亚洲男人天堂2017| 色九月综合| 日本免费亚洲欧美| 亚洲丝袜诱惑| 日韩精品99久久久久久中文字幕 | 麻豆蜜桃视频在线观看| Av手机版天堂网| 97超碰美女| 新精精品久久精品| 97二区四区| 一级黄色牲爱A级片| 亚洲小说视频| 91欧美丨精品丨入口| 亚洲激情在线| 一区黄二区黄| 日本日皮视频逼| 999久久久免费精品国产牛牛| 91久久久老司机| 97久精品| 高清国产av无码| 国产极品一区二区三区三州| 伊人热综合| 精品人成视频在线观看| 欧美性少妇| 91美女高潮| 青青草一区二区三区四| 欧美黑人与女人91~| 天无日色综合| 97人人射| 国产又色又爽又舒服的三级视频| 欧美色乱| 欧美久久久15P| 嫩草影院在线观看精品| 884t在线| 青青草原伊人网| 国产在线76页| 亚洲欧美自拍偷拍| 加勒比海人人操超碰在线| 天天日日日射| 精品四五区| 精品超碰国产| 天堂av2019| 色综合一本| 超碰在线91| 97色97好| 嗯嗯啊啊好疼| 亚洲日韩东京热一区| 国产精品一区二区三区免费视频| 精品国产少妇高潮视频| 国产精品爆乳懂色蜜乳| 国产精品久久久999| 97久久超碰| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 日本熟女不卡视频| 色噜噜人妻丝袜AV资源| 日本日皮视频逼| 亚洲高清视频在线免费观看| 国产传媒一区日韩| 天天射夜夜操| 亚洲。日韩。欧美| 精品人体无圣光凹凸| 日本精品久久久久久久| 精品九九| 久久久久久久9最新免费视频观看| 色九区| 曰韩人妻中文字幕在线| 超碰97色色| 丁香五月天堂| www.91逼逼.com| 日韩欧美加勒比| 9精品久久| 欧美嫩性色| 免費黃色視頻觀看一| 久久透逼视频| 欧美图片校园春色| 久久99草| 熟妇人妻一区二区| 狠狠色综合网| 亚洲av综合色区图片亚洲| 国产传媒日韩欧美| 激情情色五月天| 日韩精品操少妇| 91丨九色丨东北熟女| 郑州宾馆老熟女露脸啪啪| 免费成人在线观看91| 91色婷婷综合久久中文字幕二区| AV色五月天| 色超碰综合| 97 超碰 人人做 人人爱| www.91色综合| 91性高潮久久久久久久久| 日本狂喷奶水在线播放212| 一二三区精品视频| 伊人午夜福利视频| 亚洲熟女综合| 99热免费| 亚洲不卡AV在线| 天天做天天爱天天高潮| 亚洲无码一二三区| 久久亚洲欧美中文字幕国语| 久久精品国产精品一区 | 太久视频| aaa亚无码专区| 91人妻人人澡人人爽人人精品| 超碰在线1234区| 色拍偷亚洲| 香蕉免费一区二区三区不读| 久久久久久久久久久人妻| 99国产精品人妻人伦| 尻女朋友一夜| 久久久久久夜夜夜夜夜| 九九av| 91neishe| 超碰碰碰碰| 亚洲日韩一区电影| 99爱爱| 密桃99999| 大香蕉手机在线视频| 啊好大好舒服| 秋霞视频一区二区| www.婷婷| 青青11操操操操操操操操| 亚洲精品一二三四区| 麻豆区99999| 国产嫩草精品A88AV在线| 欧美日韩人人早| 蜜桃久久精品一区二区三区| 精品久久九|