免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

Spring Boot實戰(zhàn):從零搭建AI對話服務,SSE流式響應與上下文管理全解析

Spring Boot實戰(zhàn):從零搭建AI對話服務,SSE流式響應與上下文管理全解析 坦白說我最早做AI對話服務的時候一度以為核心難點在怎么把請求發(fā)出去上。后來真正把代碼跑起來、把服務丟給真實用戶用了幾個月才意識到發(fā)請求只是最簡單的一步。真正的坑全在流式響應處理、上下文存儲、超時控制、成本管理這些周邊工程上。這篇文章就把我從零搭建一個基于Spring Boot的AI對話服務的完整過程寫出來包括每一步為什么這么選型、哪個環(huán)節(jié)最容易出bug、以及我實際踩過的坑。需要先說明一點這篇文章不是給你貼一堆代碼就完事的教程。我會把核心鏈路拆開從HTTP客戶端選型講到SSE流式解析從上下文管理講到異常處理和成本控制。讀完你可以照著重現(xiàn)一個能用的AI對話服務也能理解背后每一個設計決策的理由。1. 這篇文章要解決什么問題1.1 現(xiàn)在的AI集成教程普遍存在什么問題市面上講Spring Boot接入OpenAI API的文章我看了很多大致分兩類。一類是Hello World型用官方SDK配一個RestTemplate請求把返回的JSON打個日志就結(jié)束了。這種代碼離能用的服務差了十萬八千里——沒有流式輸出、沒有上下文管理、沒有超時兜底、沒有成本控制前端用戶只能看到轉(zhuǎn)圈圈等兩三秒后一次性彈出一大段文字。另一類是痛苦封裝型一上來就給你搞一個抽象工廠、策略模式、多級緩存、消息隊列看得人頭皮發(fā)麻。這些代碼確實很工程化但你要真照著抄大概率會被一堆無關復雜性淹沒根本搞不清核心鏈路是哪條。你會發(fā)現(xiàn)真正缺的是那種從HTTP協(xié)議層面講清楚、不堆砌抽象、也不停留在玩具層面的中間態(tài)教程。我這篇文章想補的就是這個空檔。1.2 讀完這篇文章你能得到什么我會帶你完成一個完整的AI對話服務具體包括一個能獨立運行的Spring Boot 3.x工程對外暴露POST /chat接口基于OkHttp的流式調(diào)用OpenAI Chat Completions接口的能力支持SSE增量輸出一套基于Redis的對話上下文存儲方案包含歷史裁剪和token成本控制完善的超時、錯誤分類、重試和前端斷連處理策略前后端聯(lián)調(diào)時SSE數(shù)據(jù)的正確解析方式以及Nginx緩沖、中文亂碼這些真實環(huán)境問題。文章會以實戰(zhàn)代碼為主線所有代碼都是我實際跑通、能用、可上生產(chǎn)的版本。為了不讓文章變成純代碼搬運我會在每個關鍵節(jié)點解釋為什么這么做以及如果不這么做會怎樣。1.3 我的技術背景與選型立場先交代一下我的技術背景免得大家對接下來的選型有疑問。我日常主力是Java開發(fā)Spring Boot從 2.x 用到 3.x服務端接口開發(fā)、中間件封裝這些做過不少。OpenAI接口這邊從最早的純文本補全text-davinci-003時代到現(xiàn)在的gpt-3.5-turbo、gpt-4o系列都在用也經(jīng)歷過官方SDK、第三方封裝、裸HTTP請求這三種方式來回切換的折騰。先說結(jié)論如果你要做的只是一個輕量級的AI對話服務直接用Spring Boot加一個OkHttp客戶端調(diào)HTTP流式接口是性價比最高、維護成本最低的方案。官方SDK雖然封裝好了DTO和流式解析但它在Spring生態(tài)下的線程模型、響應式流處理上并沒有給你省太多事反而引入了一層黑盒。即便你說我用Spring的WebClient做流式請求我也建議你先搞清楚最原生的HTTP流式解析是怎么回事再去用高級封裝。理解了底層上層封裝都是紙老虎。整個項目下來核心就四件事一個足夠穩(wěn)定的HTTP客戶端選型對比我會聊一個能正確處理SSE流式數(shù)據(jù)的解析器這是最容易出bug的地方一套管理對話上下文的機制怎么控制token成本、怎么防止上下文無限膨脹一個合理的錯誤處理與超時策略網(wǎng)絡請求永遠要假設會失敗。下面開始動手。2. 項目初始化與依賴選型為什么我不用官方SDK2.1 最小工程結(jié)構(gòu)我建的是個標準的Spring Boot 3.x工程Java 17Maven構(gòu)建。項目結(jié)構(gòu)非常簡單ai-chat-service ├── pom.xml ├── src/main/java/com/example/aichat │ ├── AichatApplication.java // 啟動類 │ ├── controller │ │ └── ChatController.java // 對外HTTP接口 │ ├── service │ │ └── OpenAiChatService.java // 核心對話邏輯 │ ├── config │ │ └── OpenAiConfig.java // 讀取配置組裝HTTP客戶端 │ └── dto │ ├── ChatRequest.java │ └── ChatResponse.java └── src/main/resources └── application.yml // 密鑰、模型、超時等配置這里我把配置、控制層、服務層全部分離不是為了炫技而是因為后續(xù)加鑒權、加會話管理、加日志時分層會省很多事。你如果只寫個Demo自然可以全塞一個類里但既然標題說了從零搭建一個AI對話服務我默認你是奔著能上生產(chǎn)的目標去的所以結(jié)構(gòu)上提前打好底子。2.2 Maven依賴清單及理由pom.xml里我加的核心依賴就三個其他全是Spring Boot自帶的parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.4/version relativePath/ /parent dependencies !-- Web模塊提供Controller和Tomcat -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- OkHttpHTTP客戶端主力 -- dependency groupIdcom.squareup.okhttp3/groupId artifactIdokhttp/artifactId version4.12.0/version /dependency !-- Lombok簡化DTO樣板代碼 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies解釋一下為什么這么選為什么是OkHttp而不是Spring自帶的RestTemplate/WebClient先說RestTemplate。它同步阻塞對普通JSON接口夠用但對SSE流式響應支持很差ResponseEntity會把整個響應體全部讀進內(nèi)存流式解析基本做不了。WebClient雖然支持流式但它基于Reactor響應式模型會讓你的代碼從第一行開始就背上響應式的復雜度——如果你整個項目不是全響應式的為了一個接口引入WebClient非常不劃算。OkHttp的好處在于同步阻塞模型不搞花活、底層連接池成熟、支持超時精細控制、讀流式響應時能給你一個干凈的BufferedSource。我們寫AI對話服務核心訴求是把流式響應一段段實時讀出來再轉(zhuǎn)發(fā)給前端OkHttp的ResponseBody.byteStream()配合BufferedReader非常好使。為什么不用官方 openai-java SDK官方SDK包括OpenAI自己出的和社區(qū)維護的openai-java解決的問題是讓Java開發(fā)者快速調(diào)用OpenAI接口而不需要關心HTTP細節(jié)。但用下來有三個問題版本迭代快接口變動頻繁跟Spring的依賴管理經(jīng)常打架它內(nèi)部用了自己的JSON序列化和HTTP框架出了問題不好排查如果你想調(diào)底層參數(shù)比如自定義HTTP代理、更細粒度的超時、攔截器反而要繞很多彎。在我實踐過的方案里裸HTTP調(diào)用 自己解析是透明度和可控性最好的。OpenAI的接口本身非常干凈POST一個JSON拿到一個JSON或SSE流沒有任何必須依賴SDK才能用的高級特性。2.3 配置文件密鑰和參數(shù)都放這里application.yml里我放了以下配置server: port: 8080 openai: api-key: ${OPENAI_API_KEY:sk-your-key-here} # 強烈建議用環(huán)境變量別硬編碼 model: gpt-4o-mini base-url: https://api.openai.com/v1 temperature: 0.7 max-tokens: 1024 timeout-seconds: 60 connect-timeout-seconds: 10為什么把超時單獨拆出來因為這是集成OpenAI接口時最容易被忽視的坑之一。OpenAI接口的響應時間波動很大普通JSON接口一般1-2秒返回但流式接口在輸出長文時可能要幾十秒如果你用默認的5秒超時基本必掛。connect-timeout和read-timeout要分開設置前者負責建立連接后者負責等待每個數(shù)據(jù)塊。3. 核心HTTP調(diào)用層把SSE流式響應的骨髓都啃明白3.1 從一次普通Chat Completion請求說起先明確一下OpenAI Chat Completions接口的基本協(xié)議。它有兩種response形式非流式一次性返回完整JSON里面包含choices[0].message.content這是最終結(jié)果。流式請求體里加stream: true服務端就會通過SSEServer-Sent Events一幀一幀地推送數(shù)據(jù)每幀是一段增量內(nèi)容格式長這樣data: {id:chatcmpl-xxx,object:chat.completion.chunk,choices:[{delta:{content:你},index:0}]} data: {id:chatcmpl-xxx,object:chat.completion.chunk,choices:[{delta:{content:好},index:0}]} data: [DONE]這個格式理解起來很簡單每一塊數(shù)據(jù)以data:開頭后面跟著JSON用兩個換行分隔每條數(shù)據(jù)最后用一個data: [DONE]標記流結(jié)束。SSE的好處是用戶不需要等全部內(nèi)容生成完才能看到回復而是邊生成邊顯示體驗上像打字機一樣。這也是ChatGPT網(wǎng)頁版的核心交互模式。我們把對話服務接入到自己的產(chǎn)品里時這個特性基本是必須的——讓用戶盯著空白頁面轉(zhuǎn)圈3秒和讓用戶看到文字一個個蹦出來體驗完全兩個檔次。理解了協(xié)議實現(xiàn)起來就清晰了。我先把請求體構(gòu)造出來public MapString, Object buildRequestBody(String userMessage, ListMapString, String history) { MapString, Object body new HashMap(); ListMapString, String messages new ArrayList(); // 歷史上下文比如系統(tǒng)角色設定 之前的對話 messages.add(Map.of(role, system, content, 你是一個樂于助人的AI助手。)); if (history ! null) { messages.addAll(history); } // 當前用戶消息 messages.add(Map.of(role, user, content, userMessage)); body.put(model, openAiConfig.getModel()); body.put(messages, messages); body.put(stream, true); body.put(temperature, openAiConfig.getTemperature()); body.put(max_tokens, openAiConfig.getMaxTokens()); return body; }這里有個容易搞錯的點OpenAI接口要求messages必須有序順序就是對話的發(fā)生順序。如果你想做多輪對話服務端是無狀態(tài)的它不幫你記上下文你需要每次請求都把完整的歷史對話傳過去。這個設計讓很多人一開始很不習慣但只要理解了就明白后續(xù)我們用Redis存上下文時也會遵循每次請求拼全量歷史的原則。3.2 OkHttp發(fā)起請求并讀取流OkHttp發(fā)請求本身不復雜但要注意把連接超時和讀取超時都調(diào)大。我封裝了一個方法public Response callChatStream(MapString, Object requestBody, Request.Builder requestBuilder) throws IOException { Request request requestBuilder .url(baseUrl /chat/completions) .post(RequestBody.create(JSON, new JSONObject(requestBody).toString())) .header(Authorization, Bearer apiKey) .header(Content-Type, application/json) .build(); return httpClient.newCall(request).execute(); }注意execute()是同步調(diào)用會阻塞當前線程直到響應頭到達但不會阻塞到整個響應體讀完。拿到Response后OpenAI會立刻返回200同時連接進入流式傳輸狀態(tài)。這個時候我們才能開始逐行讀取響應體。try (Response response callChatStream(...)) { if (!response.isSuccessful()) { log.error(OpenAI API error: {} - {}, response.code(), response.body().string()); throw new RuntimeException(OpenAI API request failed with code response.code()); } BufferedReader reader new BufferedReader( new InputStreamReader(response.body().byteStream(), StandardCharsets.UTF_8) ); String line; while ((line reader.readLine()) ! null) { if (line.startsWith(data:)) { String data line.substring(5).trim(); if ([DONE].equals(data)) { break; } // 解析delta內(nèi)容 JSONObject json new JSONObject(data); String delta extractDeltaContent(json); if (delta ! null !delta.isEmpty()) { // 把增量內(nèi)容通過回調(diào)傳給上層 callback.onDelta(delta); } } } }這段代碼就是這個服務的心臟。有幾個細節(jié)值得展開說第一try (Response response ...)的作用。OkHttp的Response實現(xiàn)了Closeable及時關閉能復用連接防止連接泄漏。你用try-with-resources包裝讀完流或拋異常都會自動釋放。第二為什么用readLine()而不是read()。SSE協(xié)議規(guī)定每條數(shù)據(jù)以換行符結(jié)束用readLine()天然切分。注意千萬不要用readLine()處理那種最后一條data: [DONE]沒有換行符的極端情況——有些網(wǎng)關會吞掉末尾的換行你用readLine()可能讀到的是data: [DONE]帶上之前內(nèi)容拼在一起的無換行文本。更穩(wěn)妥的做法是判斷如果這一行以data:開頭就處理否則跳過并且處理流結(jié)束時服務端沒發(fā)送[DONE]的情況后面異常處理章節(jié)會講。第三delta解析。choices[0].delta.content這個字段在不同模型下行為略有不同有的模型在第一次封包里會帶role: assistant后續(xù)封包才帶內(nèi)容content有的模型甚至在delta里直接沒有content字段。所以解析時要寫一個健壯的方法private String extractDeltaContent(JSONObject chunk) { if (!chunk.has(choices) || chunk.getJSONArray(choices).isEmpty()) { return ; } JSONObject choice chunk.getJSONArray(choices).getJSONObject(0); if (choice.isNull(delta)) { return ; } JSONObject delta choice.getJSONObject(delta); if (delta.has(content) !delta.isNull(content)) { return delta.getString(content); } return ; }這里我用了基本的JSONObject判斷而不是直接getString(content)就是因為空值和字段缺失太容易踩坑了。我見過不少人在這一步直接NPE或者拿到空字符串導致斷流。3.3 流式響應轉(zhuǎn)發(fā)給前端ChunkedResponseBody后端拿到流式增量后下一步就是通過HTTP接口把增量轉(zhuǎn)發(fā)給前端。Spring MVC天然支持text/event-stream格式我們可以直接返回SseEmitter或者用response.getOutputStream()手動寫。我推薦后者原因在于SseEmitter雖然封裝好了但它在處理客戶端斷開、超時上不夠細。我自己用的方案是直接在Controller里拿到HttpServletResponse設置好響應頭然后從服務層的回調(diào)里逐段寫出PostMapping(/chat) public void chat(RequestBody ChatRequest request, HttpServletResponse response) throws IOException { // 設置SSE響應頭 response.setContentType(text/event-stream); response.setCharacterEncoding(UTF-8); response.setHeader(Cache-Control, no-cache); response.setHeader(X-Accel-Buffering, no); // 禁止Nginx緩沖保證實時性 PrintWriter writer response.getWriter(); openAiChatService.streamChat( request.getSessionId(), request.getMessage(), delta - { // 將增量封裝成SSE格式寫給前端 writer.write(data: delta \n\n); writer.flush(); } ); }X-Accel-Buffering這個頭默認大家都不太注意但只要你把服務部署在Nginx后面就必須加。Nginx默認會緩沖后端響應如果后端是流式輸出沒有這個頭Nginx會把所有增量攢到一定量才轉(zhuǎn)發(fā)前端看到的依然是卡頓一次性出全。服務端的streamChat方法內(nèi)部就是我在3.2節(jié)那段讀流邏輯的殼子區(qū)別是把回調(diào)ConsumerString穿進去讓Controller層去決定每段內(nèi)容怎么處理。這里有一個重要注意點流式對話的整個HTTP請求鏈路會持續(xù)幾十秒中間任何一環(huán)斷開都會導致整個流中斷。我們在寫回調(diào)時一定要處理寫入失敗的情況。比如前端用戶刷新頁面斷開了連接你還在往writer里寫數(shù)據(jù)這時會拋IOException。最穩(wěn)的寫法是給寫操作包一層try-catch捕獲IOException之后主動終止讀取OpenAI流的循環(huán)不然會白白消耗token還拿不到結(jié)果。3.4 非流式接口簡單但同樣有坑流式當然是最優(yōu)體驗但有些場景只用非流式就夠。比如內(nèi)部系統(tǒng)做一個批量評論分析功能不在乎實時性直接一次請求拿完整結(jié)果。非流式實現(xiàn)起來更簡單唯一要注意的是響應體大小。有些模型輸出超長內(nèi)容時一次性返回的JSON可能很大如果你用ResponseBody.string()方法把整個響應讀到內(nèi)存再交給JSON解析器內(nèi)存峰值會非常可觀。穩(wěn)妥做法是設置合理的max_tokens并為這種接口單獨調(diào)小超時因為非流式意味著你必須等全文生成完才拿到數(shù)據(jù)等待時間可能等于流式時間的總和。非流式接口的核心代碼public String chatSync(String userMessage) { MapString, Object body buildRequestBody(userMessage, null); body.put(stream, false); // 關閉流式 Request request buildRequest(body); try (Response response httpClient.newCall(request).execute()) { if (!response.isSuccessful()) { throw new RuntimeException(API error: response.code()); } String respBody response.body().string(); JSONObject json new JSONObject(respBody); return json.getJSONArray(choices) .getJSONObject(0) .getJSONObject(message) .getString(content); } }這個接口給不給前端都是次要的更多是給后端內(nèi)部邏輯調(diào)用的。我后來給運營同事做周報自動生成工具就是走這個非流式接口簡單穩(wěn)定掛在定時任務里每天跑一次。4. 對話上下文管理為什么說AI對話服務最容易爛在這一層4.1 OpenAI接口本身不記上下文這是幾乎每個初次集成的人都會搞混的概念。你調(diào)用/chat/completions傳一段用戶消息OpenAI不會在服務器端保存任何這個人之前說過什么。它每次都是無狀態(tài)地根據(jù)你傳的messages數(shù)組決定回答什么。這意味著你想實現(xiàn)多輪對話就必須自己在服務端保存對話歷史每輪請求你都得把完整的對話歷史拼進請求體對話歷史越長消耗的token越多費用越高超出模型上下文窗口長度比如gpt-4o-mini是128k但實際請求體過大也會報錯請求會直接失敗。很多半路出家的項目第一版能聊怎么做的把用戶每次說的話拼進一個ArrayList永遠不清理。聊到第50輪每次請求都帶300多輪歷史消息成本爆炸響應速度也肉眼可見地變慢。這就是能跑和能用的分水嶺。4.2 會話存儲Redis還是內(nèi)存我們的設計里每個會話sessionId對應一段獨立的歷史。存儲介質(zhì)的選擇取決于你的部署形態(tài)單機部署Demo演示用ConcurrentHashMapString, ListMapString, String夠了最簡單但服務重啟就丟上下文也不支持水平擴展。多實例部署要扛真實流量直接把歷史丟Redis里用List結(jié)構(gòu)存消息序列。每次對話后把最新的用戶消息和助手回復推入列表請求前把整個列表讀出來。我建議你即使在Demo階段也盡量用Redis因為后面遷移的成本很低而且能順便學會怎么在Spring Boot里操作Redis存取JSON列表。這里把用Redis存上下文的方案貼出來public ListMapString, String getHistory(String sessionId) { // 從Redis讀取列表每個元素是一條消息 ListString rawList redisTemplate.opsForList().range(chat:history: sessionId, 0, -1); if (rawList null || rawList.isEmpty()) { return new ArrayList(); } ListMapString, String messages new ArrayList(); for (String raw : rawList) { messages.add(JSON.parseObject(raw, new TypeReferenceMapString, String() {})); } return messages; } public void appendMessage(String sessionId, String role, String content) { MapString, String msg Map.of(role, role, content, content); redisTemplate.opsForList().rightPush(chat:history: sessionId, JSON.toJSONString(msg)); }這里有幾個要注意的設計點設置過期時間。會話列表一定要設置TTL比如30分鐘沒人聊就自動清理。不設TTL的Redis key會永久膨脹我見過生產(chǎn)環(huán)境一個月沒清理單個key里塞了幾萬條消息。別把系統(tǒng)提示詞存進會話歷史。系統(tǒng)提示詞system role是每次都固定要傳的你應該在構(gòu)建請求時單獨往最前面插入而不是跟著歷史一起存。否則歷史列表里會有很多條system消息的重復浪費token??刂茪v史長度。當對話輪次很多時得有一個裁剪策略。常規(guī)做法是只保留最近N條對話我一般設20條也就是最近10輪。裁剪時先從頭部丟掉舊消息保證messages的開頭是system角色。4.3 Token成本控制與上下文截斷策略聊到上下文就不得不提t(yī)oken成本。OpenAI按token計費gpt-4o-mini的輸入和輸出價格不一樣長聊天的token消耗幾乎是線性增長的。這里分享我常用的一個省錢技巧按字符估算token數(shù)。英文場景約1個token對應4個字符中文場景1個漢字約等于1-2個token。粗算時直接記總字符數(shù)除以3或除以4即可。有了估算值就能在請求前做一次ensureTokenLimit檢查private static final int MAX_CONTEXT_TOKENS 8000; // 根據(jù)模型上下文窗口和預算設定 public void appendMessageWithTrimming(String sessionId, String role, String content) { appendMessage(sessionId, role, content); // 裁剪歷史 trimHistory(sessionId); } private void trimHistory(String sessionId) { ListMapString, String history getHistory(sessionId); int totalChars 0; int fromIndex 0; // 從最新消息往前數(shù)保留最近MAX_CONTEXT_TOKENS內(nèi)的消息 for (int i history.size() - 1; i 0; i--) { totalChars history.get(i).get(content).length(); if (totalChars MAX_CONTEXT_TOKENS * 4) { fromIndex i 1; break; } } if (fromIndex 0) { // 刪除fromIndex之前的消息 redisTemplate.opsForList().trim(chat:history: sessionId, fromIndex, -1); } }這里的邏輯是從最新的消息往前累加字符數(shù)一旦超過閾值就把更早的消息從Redis里trim掉。注意opsForList().trim(start, end)是保留區(qū)間內(nèi)的元素我們要保留的是[fromIndex, -1]到最后所以start傳fromIndexend傳-1。這個策略雖然粗糙但已經(jīng)能解決80%的問題文件存儲有上限就不會無限膨脹請求體不會過大成本可控。如果要更精細可以每次請求前調(diào)用OpenAI的tokenizer接口做精確計數(shù)但說實話在量上來之前那點精度不值得引入額外依賴和網(wǎng)絡請求。4.4 多輪對話鏈路打通一次完整請求的時序把前面所有零件拼起來一次完整的多輪對話請求時序是這樣的前端發(fā)送POST /chat請求體包含sessionId和messageController解析請求調(diào)用streamChat(sessionId, message, callback)Service從Redis讀取該會話的歷史消息列表在歷史列表最前面插入system角色消息再追加當前用戶消息構(gòu)造HTTP請求體以stream: true方式調(diào)用OpenAI Chat Completions接口同步等待響應后逐行解析SSE流每拿到一段增量就調(diào)用回調(diào)Controller的回調(diào)把增量寫入SSE響應流并flush給前端流結(jié)束[DONE]后Service把本次用戶消息和助手完整回復保存回Redis并執(zhí)行上下文裁剪。第8步有個細節(jié)值得強調(diào)保存回復時存的是完整回復不是流式增量拼接的中間結(jié)果。你需要在Service內(nèi)部維護一個StringBuilder把每次onDelta拿到的內(nèi)容追加進去流結(jié)束得到完整文本再寫入Redis。如果你圖省事在回調(diào)里直接存增量以后做上下文拼接時Redis里存的會是碎成渣的片段。5. 異常處理、超時與重試網(wǎng)絡請求永遠要假設會失敗5.1 OpenAI接口會返回的幾種錯誤我實際遇到過的OpenAI API錯誤大致分四類每類的處理方式完全不同錯誤類型典型場景HTTP狀態(tài)碼處理策略鑒權失敗API Key錯誤、過期401直接報錯提示檢查密鑰不要重試余額或配額不足賬戶余額為0、觸發(fā)速率限制429如果是收費限制可稍后重試如果是余額不足則停止調(diào)用并告警請求參數(shù)錯誤模型不存在、messages格式不對、context過長400記錄請求體日志人工排查服務端異常OpenAI內(nèi)部故障500/503指數(shù)退避重試2-3次注意429里的一個細節(jié)OpenAI返回的Retry-After頭會告訴你要等多久一定要尊重它。我見過有人寫死固定間隔3秒重試結(jié)果因為對方建議等待60秒3秒重試毫無意義。5.2 超時參數(shù)調(diào)優(yōu)從5秒到60秒的踩坑記錄超時是流式接口最坑的環(huán)節(jié)。Spring Boot默認的RestTemplate超時是無限等待OkHttp默認沒有讀取超時。聽起來無限等待很安全不一旦OpenAI端連接建立后不傳數(shù)據(jù)這種情況在高峰期出現(xiàn)過你的線程就永久掛住連接池被占滿整個服務雪崩。我踩過一次很深的坑上線一周后某天下午大量用戶反饋轉(zhuǎn)圈很久沒反應一查線程池幾十個線程全阻塞在readLine()上。原因就是OpenAI端某次升級時個別請求30秒不吐數(shù)據(jù)。后來我把讀取超時設置為60秒同時新增了看門狗機制——如果連續(xù)15秒沒有收到任何數(shù)據(jù)塊主動中斷這次請求并返回友好提示。實現(xiàn)看門狗的方法不復雜在流讀取循環(huán)里記錄lastDataTimelong lastDataTime System.currentTimeMillis(); while ((line reader.readLine()) ! null) { if (line.startsWith(data:)) { lastDataTime System.currentTimeMillis(); // 有數(shù)據(jù)就刷新 // ... 處理數(shù)據(jù) } // 每次循環(huán)檢查空閑時間 if (System.currentTimeMillis() - lastDataTime IDLE_TIMEOUT_MS) { log.warn(SSE stream idle timeout, aborting...); break; } }這個15秒空閑超時比整體60秒讀取超時更早觸發(fā)能更快暴露上游問題也不用等滿60秒。線程不會傻等用戶體驗也更好。5.3 重試策略冪等與非冪等的區(qū)別對OpenAI接口做重試時必須區(qū)分兩次重試的場景請求發(fā)出后沒收到響應連接級失敗這時候OpenAI可能已經(jīng)處理了請求并在返回結(jié)果只是你這邊連接斷了。如果盲目重試用戶可能收到兩次回答如果你是有狀態(tài)寫入的話或者被重復計費。這種場景下重試要保守甚至不重試直接告訴用戶網(wǎng)絡波動請重試。請求發(fā)出前失敗鑒權、參數(shù)錯誤這類不涉及計費重試是安全的。我在代碼里的做法是只對建立連接失敗和5xx服務端錯誤做最多一次重試對429要看Retry-After如果它要求等待的時間小于5秒就等完重試一次超過5秒就直接放棄。核心思路是寧可少做一次接口調(diào)用也不要讓用戶重復交費。5.4 中斷與斷流前端斷開后如何止損流式場景里前端主動斷開是常態(tài)。用戶問了一個問題又不想等了直接關掉頁面或者瀏覽器網(wǎng)絡抖動SSE連接斷開。服務端如果沒感知到這個斷開會繼續(xù)從OpenAI拉流直到整段內(nèi)容全部生成完畢。這在token費用上是實打?qū)嵉睦速M。Spring的HttpServletResponse在客戶端斷開后再寫數(shù)據(jù)會拋IOException。所以正確的止損姿勢是在回調(diào)里捕獲IOException然后觸發(fā)一個取消令牌機制來終止后續(xù)的拉流。我的實現(xiàn)是在streamChat方法里傳入一個AtomicBoolean cancelled作為協(xié)作信號void streamChat(String sessionId, String message, ConsumerString callback) { AtomicBoolean cancelled new AtomicBoolean(false); // 包裝回調(diào)寫失敗就取消 ConsumerString wrappedCallback delta - { try { callback.accept(delta); } catch (IOException e) { log.warn(Client disconnected, cancelling stream); cancelled.set(true); } }; // 拉流循環(huán)里檢查cancelled while ((line reader.readLine()) ! null !cancelled.get()) { // ... } }這個模式很實用回調(diào)只負責寫數(shù)據(jù)通過異常信號傳遞客戶端已斷的狀態(tài)拉流循環(huán)看到狀態(tài)就主動break終止向OpenAI拉取后續(xù)數(shù)據(jù)。這樣既能止損又能保證線程不繼續(xù)空轉(zhuǎn)。6. 前后端聯(lián)調(diào)與真實體驗一個能用的AI對話服務長什么樣6.1 前端SSE接入EventSource和POST的局限前端接入SSE最省事的API是EventSource。但有個天然限制EventSource只支持GET請求不支持自定義Headers。而我們的接口是POST /chat攜帶消息體還得在Authorization頭里加自定義信息如果有的話所以直接用EventSource不行。我實際用的方案是前端用fetch發(fā)起POST拿到ReadableStream響應體再逐段解析流async function sendChat(message, sessionId) { const response await fetch(/chat, { method: POST, headers: {Content-Type: application/json}, body: JSON.stringify({sessionId, message}) }); const reader response.body.getReader(); const decoder new TextDecoder(utf-8); let buffer ; while (true) { const {value, done} await reader.read(); if (done) break; buffer decoder.decode(value, {stream: true}); // 按空行切分SSE數(shù)據(jù) const lines buffer.split(\n\n); buffer lines.pop(); // 最后一段可能不完整留到下次 for (const line of lines) { if (line.startsWith(data: )) { const data line.substring(6); if (data [DONE]) return; // 渲染到界面上 appendText(data); } } } }這段代碼在前端有一個很重要的點SSE數(shù)據(jù)是按\n\n分隔的但網(wǎng)絡包可能會把一個完整數(shù)據(jù)塊拆成兩半所以你必須維護一個buffer變量合并跨包的數(shù)據(jù)。我見過很多前端同學直接reader.read()一次就解析結(jié)果內(nèi)容經(jīng)常出現(xiàn)殘缺或亂碼原因就在這里。6.2 聯(lián)調(diào)中常見的三類問題把服務部署好、前端接好以后聯(lián)調(diào)階段會出現(xiàn)一些看起來很奇怪的問題我列三個最典型的第一Nginx緩沖導致假卡頓。前端明明看到后端日志里delta嘩嘩地出但頁面上就是不顯示過個十幾秒突然全出來了。前面提過加上X-Accel-Buffering: no響應頭就能解決。如果你用的不是Nginx而是Apache或者云負載均衡也要查對應平臺的緩沖設置。第二中文亂碼。這是一個非常常見但相對低級的問題。Spring Boot默認的Content-Type在響應SSE時可能不帶charsetUTF-8然后前端按UTF-8解析沒問題但某些代理服務器會自作聰明地轉(zhuǎn)成ISO-8859-1。我在代碼里強制設置了response.setCharacterEncoding(UTF-8)并且在拼SSE數(shù)據(jù)時注意不要用write(String)而是直接用write(String)其實在設置了字符編碼后這個是OK的。最關鍵的是POST請求體解析時RequestBody默認的JSON解析器不會亂碼但如果你的服務用表單方式接收消息務必在Controller上加produces text/event-stream;charsetUTF-8。第三冪等重試導致重復內(nèi)容。這個聯(lián)調(diào)時很難發(fā)現(xiàn)但真實用戶一多就會暴露。比如用戶網(wǎng)絡抖動瀏覽器自動重發(fā)POST后端收到兩個相同的消息于是AI回答了兩遍。解決辦法是前端在發(fā)起請求時加一個requestId后端用Redis的SETNX做冪等去重——同一個requestId的請求只處理一次。這個機制我在生產(chǎn)環(huán)境里是必須的。6.3 成品展示與性能觀察功能調(diào)通之后我在本地壓了一輪。用JMeter模擬20個并發(fā)用戶同時聊天每個請求都會持續(xù)5-10秒的流式輸出觀察了幾個關鍵指標Tomcat線程池占用配置了server.tomcat.threads.max20020并發(fā)下線程池很穩(wěn)但如果是100并發(fā)你需要考慮用虛擬線程JDK21 Spring Boot 3.2支持的spring.threads.virtual.enabledtrue來提升吞吐因為每個流式請求會占一個線程很長時間。連接池健康OkHttp默認的連接池最大空閑連接是5個長連接復用做得不錯。但注意到如果超時設置過大連接池里通到OpenAI的空閑連接會堆積建議加一個空閑連接清理的ConnectionPool配置。內(nèi)存增長因為每個流式請求都維護一個StringBuilder如果并發(fā)高且回復長瞬時內(nèi)存會漲得比較快。我后來把StringBuilder改成有上限的——當累計超過設定的maxTokens * 2字符數(shù)時就不再向OpenAI拉流強制截斷當前回復并返回內(nèi)容過長已截斷。這輪壓測正好印證了一開始的判斷流式對話服務瓶頸不在OpenAI的接口能力而在你自己的線程模型和連接管理。7. 進階優(yōu)化緩存、限流、敏感詞過濾與可觀測性7.1 請求級緩存同樣的問法第二條路更快AI回答不是每次都要問OpenAI的。實際業(yè)務里有很多高頻相似問題——比如產(chǎn)品官網(wǎng)的FAQ用戶翻來覆去問那幾個問題。這些完全可以用緩存打掉。我的緩存設計是以用戶消息的哈希值模型名作為key結(jié)果緩存到Redis里TTL設24小時。但AI問答和普通接口不太一樣很多問題雖然字面上不同語義卻相似所以單純哈希緩存命中率有限。更實用的一層是對話結(jié)果緩存——同一sessionId下如果用戶連續(xù)問相同或幾乎相同的問題編輯距離小于閾值直接返回上一次的緩存結(jié)果不重復請求API。當然做了緩存就要小心一個副作用緩存會讓AI看起來死板用戶換了措辭但本質(zhì)相同的時候會得到上一輪答案。這個在客服場景其實是優(yōu)點但在創(chuàng)作類場景就是災難了。所以緩存開關做成配置項按場景決定開不開。7.2 限流防止一個用戶把預算打光一個AI對話服務的成本大頭是token費用而用戶是無底洞。不做限流的話某個用戶連續(xù)瘋狂提問一分鐘調(diào)用幾十次你的賬單會以肉眼可見的速度上漲。我做的限流策略有三個維度單會話維度一個sessionId每分鐘最多10次請求超過就返回操作太頻繁請稍后再試。實現(xiàn)上用Redis INCR EXPIRE計數(shù)非常簡單可靠。單用戶維度如果是登錄系統(tǒng)按userId限流比如每小時最多60次。服務整體維度控制同一時刻發(fā)往OpenAI的并發(fā)請求數(shù)。注意剛才說的流式請求每個都占線程幾十秒所以單純的接口并發(fā)限流不夠還要限制連接數(shù)。我用了一個Semaphore許可數(shù)為連接池maxIdle / 2拿不到許可就排隊等待。限流觸發(fā)后的返回體驗也很重要。限流不等于直接報錯前端應該看到AI有點忙請稍后再試這類友好提示。我在Controller里捕獲RateLimitException統(tǒng)一返回429狀態(tài)碼和JSON錯誤體前端對這個狀態(tài)碼做了單獨處理。7.3 敏感詞過濾AI服務上線前的必經(jīng)之路AI對話服務接上真實用戶之后敏感詞過濾不是可選項是必選項。OpenAI自己的moderation接口可以檢測文本內(nèi)容但它是異步的、返回結(jié)果也有一定延遲不適合在流式輸出中逐段檢測。我采用了兩層方案輸入側(cè)用戶發(fā)送消息后在調(diào)用OpenAI之前先用本地維護的敏感詞庫做一次匹配過濾。命中就直接拒絕不浪費token。詞庫要支持增量更新我用的是一個SetString從數(shù)據(jù)庫加載服務器每天刷新一次。輸出側(cè)流式輸出的每一段增量都會經(jīng)過一個SensitiveWordFilter.filter(delta)方法。命中敏感詞的增量會被打碼替換成***或直接丟棄。這個方法要足夠快因為它在每次delta回調(diào)里都會執(zhí)行不能在熱點路徑上做正則、做慢循環(huán)。說實話純靠本地詞庫過濾肯定有漏網(wǎng)之魚但作為一道前置防線配合OpenAI的moderation接口做異步復核已經(jīng)能滿足大多數(shù)國內(nèi)中小團隊的業(yè)務要求。7.4 可觀測性流式服務的日志怎么打才有用流式服務有個特性響應是邊生成邊輸出的所以傳統(tǒng)的開始時間結(jié)束時間日志記錄模式在這一場景里價值不大。想看問題出在哪必須打鏈路日志。我建議至少打這幾類日志請求入口日志sessionId、消息前50個字符、請求耗時。這里注意前端拿到的總耗時應該從請求進入Controller到最后一個delta寫出為止。OpenAI服務耗時分解日志DNS解析連接建立耗時、首字節(jié)耗時TTFB、每1000字符的平均生成耗時。這些能幫你定位慢到底慢在網(wǎng)絡還是慢在模型生成。異常鏈路日志流中斷時記錄中斷前最后輸出的上下文比如中斷發(fā)生在第幾個字符、模型回答到哪里了。這對排查OpenAI側(cè)問題非常有幫助。打完日志的下一步是接入監(jiān)控告警。我用過Spring Boot Actuator加Prometheus的組合暴露幾個自定義指標openai_requests_total請求總數(shù)區(qū)分結(jié)果標簽success/erroropenai_stream_duration_seconds流式響應耗時分布openai_tokens_estimate_total估算token消耗總量用于成本監(jiān)控這幾個指標一上賬單和性能就能對上號。我后來給團隊做的成本看板就是直接拉這個openai_tokens_estimate_total指標再乘上單價每天自動算一個預估費用比月底看賬單再心疼強多了。8. 寫在最后的實戰(zhàn)建議8.1 代碼庫演進從單體Demo到可擴展的服務這篇文章寫的雖然是個單體項目但結(jié)構(gòu)上已經(jīng)為演進留了接口。如果你后面要支持多個模型供應商比如接入國產(chǎn)模型、開源本地部署模型不要改動OpenAiChatService的核心邏輯而是把調(diào)用哪個API、如何解析返回抽象成一個ChatProvider接口。每個供應商實現(xiàn)一個ChatProvider通過Spring的Qualifier或策略模式切換。我實際在公司就是這么設計的目前維護了OpenAI、Anthropic、以及一個私有化部署模型三個Provider核心對話鏈路完全沒動過。8.2 成本核算一個AI對話服務的月度賬單長什么樣寫到最后分享一個實際運營數(shù)據(jù)。我之前做過一個客服智能助手日均調(diào)用約5000次平均每次消耗約1200個token輸入輸出合計。以gpt-4o-mini的定價估算輸入0.15美元/百萬token輸出0.6美元/百萬token假設輸入輸出各半一個月token總量約1.8億費用大概在70美元上下。如果換用gpt-4o這個數(shù)字直接翻好幾倍。我的建議是上線初期別迷信最強模型用mini級別的模型把流程跑通、把產(chǎn)品驗證完再根據(jù)用戶反饋逐步升級模型。省下來的錢比你在代碼里調(diào)優(yōu)省的那點token多幾個數(shù)量級。8.3 我踩過最后悔的一個坑聊到最后分享一個我記憶最深刻的教訓。有一陣子我為了追求極致實時體驗把整個對話鏈路全部改成了流式包括內(nèi)部系統(tǒng)之間的調(diào)用也用了流式。結(jié)果某次上游服務因為代碼bugSSE流一直不發(fā)送[DONE]結(jié)束標記我的下游服務readLine()一直阻塞在等待狀態(tài)連接池被打滿整個應用OOM。那次事故教育我流式協(xié)議雖然體驗好但它把請求何時結(jié)束的控制權交給了上游如果上游不按規(guī)范結(jié)束流你沒有兜底機制就會掛掉。所以后來我在所有流式讀取循環(huán)里都強制加了最大持續(xù)時間限制比如最晚90秒必須斷開管你上游有沒有發(fā)[DONE]到點就斷。這跟TCP連接也有Keep-Alive超時是一個道理——不要無限等待任何東西。集成OpenAI API這件事說穿了并不難難的是把網(wǎng)絡波動、上下文膨脹、成本失控這些真實的工程問題一一處理掉。希望這篇文章能幫你少走幾個彎路。接下來你唯一要做的就是打開IDE建一個項目把第一個流式對話跑通然后你會發(fā)現(xiàn)后面的一切都順理成章。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
九月丁香婷婷| 五月婷网| 色婷视频| 丁香婷婷五月六月久久| 六月丁香深深爱| 成人精品视频99在线观看免费| 五月天激情网开心网| 伊人激情啪啪| 91九色精品| 免费无码毛片一区二区A片| 天天弄天天操| 久久久久久人妻久久久久久久久久人妻久久久 | 91精品久久久久久久久| 涩丁香91| 610018岁成人视频| 天天爽天天爽| 婷婷丁香五月亚洲17cao| 人妻 性久久久久久| 91互操| 狠狠精品干练久久久无码中文字幕| 99国产这里只有精品| 天天做天天爱天天爽夜夜揉| 精品久久9| 天堂久久久久天堂网| 超碰免费人妻| 国产精品成人AV在线| 五月天激情AV| 欧美丁香五月| 97婷婷五月| 久久黄色网扯| 综合在线网| 丁香九月综合激情| 色色色综合色| 色丁香久久| 99视频在线看| 久草五月婷| 亚洲精品白浆高清久久久久久| 五月天婷婷基地综合网| 色激情五月| 婷婷激情五月天在线| 亚洲热手机在线观看| 99精品高潮| 69热91天堂| 蜜桃人妻无码AV天堂三区| 亚洲婷婷91丁香| 婷婷狠狠色| 婷婷五月天视频小说| 激情五月天色网站| 五月婷婷开心亚洲无| 九色自拍| 婷婷丁香社区网| 免费婷婷| 精品五月视频婷婷在线观看| 日本女va| 天天操天天谢| 亚洲亚洲永久无码777777| 色婷婷丁香AV综合| 亚洲综合干| 日日日,com| 婷婷六月色开| 99热成人精品| 噜噜噜精品欧美成人在线观看| 精品人妻久久久| 婷婷天天舔| 久久精品色| 色五月首页| www色五月| 97香蕉人人在线观看| A片天天| 婷婷五月天久草在线| 丁香婷婷狠狠97| 狠狠色综合五月人人| 久久AAAA片一区二区| 色情综合网| 亚洲激情综合| 熟妇国产| 成人一级片| 日韩性视频| www.91操| 新激情五月天色播| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 99色精品| 丁香亚洲色综合| 在线免费观看激情视频| 香蕉久久国产AV一区二区| 日本人妻A片成人免费看片| 亚洲色色色色色色色色色| 五月天激情站| 天天操天天操天天操| 久久久人妻门| 色五月丁香五月| 这里只有精品1| 亚洲成人免费电影| 毛v一区二区视频| 夜夜资源站| 激情色色| 五月天婷婷丁香六月| 国产精品久久久海的味道| 丁香五月最新地址| 丁香六月婷婷缴情欧美| 九九色99| 新精品99| 日日夜夜天天| 丁香婷婷色情| 99久久成人| 无码网站视频| 久久久久久欧美精品se一二三四| a性生活久久无| 狠狠婷婷色| 71在线精品视频一区| 一区色色色色网| 婷婷丁香五月天小说| 手机免费福利视频| 99性视频| 五月天操逼网| 五月婷婷影| 超碰人人在线| 人人草碰| 26UUU在线观看| 国内外色色色色色成人视频| 超碰成人黄色网| 九色地址91视频| 五月丁香久人妻中文| 激情五月综合网最新| 亚洲综合色婷婷| 99国产在线精品视频| 99亚洲精美视频在线观看| 五月花综合网| 久操福利| 色爱综合五月| 色色 9| 色停停香蕉视频| 亚洲色就是色色色| 99色区| 五月天婷婷无码| 成AV人片一区二区三区久久| 九九性视频| 婷婷五月天另类网站| 五月精品| 五月婷久久综合| 五月激情五月丁香| 99在线观看| 丁香六月亚洲| 中国激情网| 五月天成人综合| 亚洲不卡123| WWW·天天操·视频?| 日屌日日操日日色| 99草在线免费观看视频| 伊人色欲五月天| 久久丁香五月| 26uuu青青| 色五月丁香五月| 图片区 小说区 区 亚洲五月| 99精品视频偷拍| 激情婷婷五月天日本系列| 色噜噜狠狠色综合日日| 五月婷婷色播视频| 久久精彩免费视频| 人人澡天天色天天做| 日日日日日| 99免费视频精品| 97啪啪| www.99久久久久99| 五月婷婷婷| 操人妻AV| 五月丁香六月婷综合成人综合| 婷婷六月色| 五月丁香亭亭操逼| 操碰99| 欧美激情久| 欧美日韩AAA| 色婷婷性爱网| 狠狠插日日干撸| 日本美女97在线视频| 婷婷激情鹿城五月天| 国产67194| 狠狠色婷婷7777久| 99热免费| 深爱网深爱综合网| 刘玥av在线| 袁子仪视频观看| 九九热这里只有精品6| 色女人久久| 婷婷色操| 、激情六月天| 欧美叉叉叉BBB网站| 欧美色色色色色色色色色色影视| 欧美成人猛片AAAAAAA| 97日韩无套内| 99re这里只有精品在线观看| YW无码| 五月丁香六月婷综合成人综合| a久久| 天天搞夜夜叫| 久婷婷视平| 色5月婷婷| 色九月综合| 婷婷夜夜操| 久草九九| 色五月亚洲| 少妇日麻屄| 亚洲精品久久久无码| 中文字幕簧片| 色涩影院六月丁香| 天天骑天天操| 五月天色视频| 激情婷婷丁香五月天| 99免费在线| 日韩欧美一区二区三区四区| 丁香五月亚洲综合| 大香蕉久久久久| 国产一级片| 开心五月婷婷| 五月丁香六月婷| 久久久久久9| 日韩aaa| 激情伊人五月婷婷久久| 97狠狠色| www.夜夜騎夜夜狠| 91久久久久久久久| 久久看九九90| 99这里只有精品视频| 亚洲激情高潮| 欧美色色色色色色| 少妇做爰免费视看片| 天天色官网| AV成人在线播放| 婷婷五月影院| 色婷婷久久综合中文久久一本 | 人妻精品久久久久久久| 久久色天堂| 五月色综合| 婷婷激情社区| jiujiu无码五区| 欧美碰碰碰| 亚洲无码成人| 成人va在线观看视频| 超碰色碰碰| 亚洲激情电影五月天色婷婷丁香一起草| 久久婷婷丁香花综合网| 激情久久久| 五月婷婷六月奇米网丁香| 91一道本| AⅤ网站在线看| nvrentiantang av| 日韩AV色色色| 婷婷五月成人色综合| 天天色凹凸| 久久曰曰| 无月播播激情在线观看视频| 任你躁XXXXX麻豆精品| 色香欲综合| 99re思思热在线视频| 欧洲电影在线观看免费版英语版 | 9九九久久精品无码专区| 欧美成人精品A片免费一区99| 久久久久综合激动五月天| 香蕉97碰碰碰超视精品| 国产毛片操B| 婷婷丁香熟妇综合网| www.色擼擼.com| 这里只有精品视频视频在线观看| WWW,五月| 人人妻人人澡人人爽| 丁香婷婷综合激情五月色| 色婷婷六月| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 久久机热思思热| 91无码视频| 狠狠色婷| 影音先锋日本三级资源| 九九久久精品| 五月综合久久| 日韩欧美成人片| 九九热在线观看视频网站| 九九热精品视频在线观看| 成人丁香五月| www夜夜操| 思思热再线视频| 色色热99| 18av天堂| 俺来也综合网精品一区| 久久久久久欧美精品se一二三四| 一起草Av| 91碰| 色碰碰视频| 精品久久婷婷| 狼人狠狠操| 最新久久99视频网站| 国产精品美女久久久久AV超清 | 亚洲午夜av| 99久在线观看| 激情性爱五月天| 色色色综合网| 激情图片婷婷| 婷婷综合网| 性色婷婷| 4399成人黄A片| 午夜爱爱网站| 超碰在线成人| 性色五月天| 久热这里只有精品99re| 天天操天天干天天日| 激情综合久久| 久热99| 久久五月婷婷电影| 五月婷婷与六月丁香图片激情| 91狠狠色| 亚洲综合激| 婷婷五六月丁香| 国产xxxxx在线观看| 、激情六月天| 内射丰满人妻| 激情婷婷色五月| rr天天操| 日韩无码成人电影| 日日操天天操| av操B网站| 国产亚洲成AV人片在线观黄桃| 激情婷婷| 亚洲综合视频八| 92久操视频| 91超级碰在线| 丁香婷婷激情综合五月激情| 伊人丁香五月| 玖玖热视频| 婷婷久久精品| 色五月婷婷五月天| 婷婷干六月综合旧址| 婷婷第一页| 操逼视频一区| 五月丁香综合久久| 五月丁香中文| 一级黄色影片| 丁香五月婷婷欧美成人色图| 欧洲亚洲免费视频9| 极品少妇高潮啪啪AV无码| 成人国产欧美大片一区| 五月情涩综合婷婷| 久久er视频6| 人色五月天婷婷| 战争与艾拉电影免费观看| 国产五月天欧美色| 国产激情久久久| 鲁鲁色五月| 91日综合欧美| 立川无码av| 五月丁香黄色| 色五月人妻| 久爱综合| 激情五月综合网| 丁香六月天色婷婷| 91久久久久久久久| 色五月婷婷在线观看第一页舔| 国产99久9在线| 五月天激情综合在线| 日韩激情人伦人| 99热综合网| 婷婷色中文字幕| 国产av网| 亚洲中文无码成人| 99视频九九热| 综合久久婷婷99| 影音先锋四区| 常久最新免费的色吊丝| 色色色网站| 日韩黄色中文字幕| 91久久久久久| 国产精品久久..4399| 五月天播播综合| 五月天综合在线观看视频| 五月激情六月宗合| 久久99看免费| 色人妻五月| 九月激情网| 91色性感五月婷婷丁香| 人人爽在线视频综合网| 五月婷婷六月丁香| 超碰成人影视| 六月丁香婷婷网| 8区视频在线| 教师性爱毛片| 五月天婷婷自拍图片在线观看| 日韩aaaaa| 夜夜嗨一区二区三区直播内容 | 丁香婷婷人妻综合网| 蜜臀99精品| 在线观看国产高清视频免费网站 | 舔色婷婷| 99精品成人无码A片观看金桔| 91在线看免费 九九九九| 婷婷久久五月天亚洲欧美国产日韩在线观看| 欧美xx激情视频在线观看| 99综合网| 日韩色色色色色| 色99在线视频| 91人人看| 五月六月激情| 丁香六月色婷婷| 九九热在线精品视频| 怡红院91a√| 亚洲 小说 欧美 激情 另类| 九九亚洲视频| 色婷婷五月天亚洲| 天天玩夜夜操| 色九月婷婷| 午夜九九九九九九九九九九九九九| 狠狠色色色| VA国产在线综合网站| 成人片在线播放| www.九九婷婷| 狠狠高潮精品亚洲1| 操操操B| 99激| www.9操| 色五月丁香总合网| 无码色| 天天搞夜夜爽夜夜爽| 97人人搞| 97色久| 婷婷深爱五月| 综合玖玖偷拍| 天天综合网91| 久久99综合| 天天看A片| 美女激情综合| 丁香成人五月天| 色婷婷五月开心六月综合| 无码人妻激情| 激情五月天婷婷图| 大香蕉啪啪网| 亚洲VA在线| 色五月婷婷777| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 99久久婷婷国产综合亚洲| 99热在线爱| 在线综合网| 色综合色| 久久久久久久久久久久久9| 人操91在线| www,26uuu,c0m,色情| 丁香五月婷婷香| 啪啪小说五月天| 丁香婷婷浪潮AV久久综合| 啪啪亚洲综合| 色综合中文| www99热| 婷婷第六色| 激情五月婷婷综合| 色色色色色色色色综合网| 岛国资源站| 天天做天天爱| 91人操人人人操人| 99热在线观看| 激情五月天伊人av| 色色爽爽天天| AA片在线观看视频在线播放| 色五月激情| 久久久精品AV| 国产精品天天狠天天看| 婷婷五月天堂| 香蕉狠狠爱视频| 五月天婷婷小说| 噜噜噜精品欧美成人在线观看| 丁香花五月天婷婷成人社区| 超碰免费大香蕉| 婷婷五月天成人五月天| 91狼友视频在线观看| 99热成人精品网站| 久热伊人| 成人国产网| 在线观看av网站| 狠狠操之狠狠操| 婷婷五月天成人视频| 天堂综合久| 久久丁香婷婷五月天| 射婷婷中文字幕| 丁香五月成人婷婷| 激情综合网,五月| 丁香激情五月天| 在线99热| 亚洲色情网站| 久久婷婷激情五月天一区二区| 狠狠爱成人综合网| 九九这里都是精品| 五月天婷婷在线观看| 99综合| 大香蕉丁香婷婷| 99热精品在线播放| 五月婷婷丁香婷婷| 六月丁香婷婷天堂| 操操人人| 婷婷丁香五月基地| 777影视理论片大全在线观看 | 六月合五月婷| 色色影院aaaav| 九九精品热播| 五月婷婷综合在线视频| 色五月大香蕉| 婷婷99狠狠躁天天| 久久怡红院| 日日操日日干| 偷偷狠狠久久婷婷五月天| 五月婷婷精品视频| 91紱請| 亚洲色五月| 丁香婷婷成人网| 99热久久这里只有精品| 丁香五月色| 亚洲成Av人片乱码色第1集| 天天爽天天操| 色综合色色| 人人干av| 婷婷开心久久| 亚洲精品性色| 色婷婷最爱五月| 久久婷婷色| 久99精品视频| 热久久婷婷| 日日夜夜天天| 狠狠狠狠狠狠狠狠| 综合激情在线| 丁香五月天亚洲视频| 亚洲一区二区无码蜜乳av| wuyuedingxiang99| 色色无码日韩| 7月婷婷六月丁香| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 精品少妇人妻AV无码专区偷人 | 久久婷婷五月| 99热最新网址| 天天日天天爽| 99热这里只有精品8| 婷婷五月天奸女| 狠狠爱五月婷婷| 亚洲色婷婷视频| 激情亚洲婷婷六月| 国产一区男女| 天天综合网亚洲综合网| 婷婷激情欧美| 亚洲无码九九| 亚洲亚洲亚洲AAAAAA| 激情婷婷狠狠干| 婷婷激情六月综合| 伊人国产婷婷五月天| 婷婷五月天国产手机在线视频观看| 性天堂久久| 丁香婷婷综合影院| 99视频日韩| 成人AV播放| 欧美日本不卡黄色片| 婷婷99视频全集高清| 国产一二区爆乳_1国产日韩一区二区三-成人AV | 综合激情网五月激情| 蜜臀A∨在线水帘洞| 激情综合青草| 伊人五月人妻精品| 丁香五月综合图片在线观看| 思思热再线视频| 色五月丁香在线| 天天肏天天插| 天天日,天天射,天天舔| 伍月婷丁香花全集| AV性爱网| 久久婷婷精品| 极品人妻VIDEOSSS人妻| 亚洲五月六月婷婷| 国产免费一区二区三州老师F1F1……| www.婷婷,com| 色婷婷色99国产综合精品| 久久99这里只有精品| 久久亚洲网| 日本在线噜噜| 丰满人妻一区二区三区| 99热这里只有精品66| 免费做A爰片77777| 精品热青草| 影音先锋91资源站| 激情综合啪啪啪| 婷婷九月激情网| 五月激情婷婷女| 婷婷色在线播放| 亚洲五月天婷婷| 狠狠99| 久久久精品人妻| 久99999热视频在线观看免费| 中文字幕丰满乱孑伦无码专区| 五月婷婷综合性爱噜噜| 亚洲一个色| 五月婷婷婷婷婷婷艺术| 天天情色综合网| 丁香五月婷婷偷拍| 狠狠操狠狠爱| 国产肏屄大片| 激情婷婷五月天伊人在线观看| 亭亭五月天黑人2014| 婷婷五月,偷窥偷拍网| 夜夜撸日日操| 五月天丁香啪啪啪啪| 久久婷婷激情| 久久久久久久久久人妻| 思思热视频在线观看| 中文字幕 中文字幕明步| 九九九午夜视频| 五月激情五月丁香| 色五月婷婷五月天| 欧美大片免费观看| 婷婷丁香五月激情密臀av| 思思久久网| 99在线精品视频免费观看20| 色情五月综合婷婷| 99视频在线啪| 狠狠人妻久久久久久综合丁香| 五月婷色丁香| 99久久99九九99九九九| 色情成人五月天| 99久久99视频只有精品| 天天色天天操天天射| 丁香五月性| 二级黄色毛片| 色色综合视频| 精品人妻伦九区久久AAA片| 天天操五月天| 天天射夜夜骑| www.色婷婷| 久久综合伊人77777蜜臀| 亚洲AAA| 成人网站在线观看视频| 99热www| 深爱开心激情网| 丁香婷婷大香蕉| 色婷婷狠狠久久综合五月| 亚洲综合视频天天精品| 91婷婷五月天嫩女| yjzz亚洲国产| 五月婷婷久久综合| 天天干电影| 久久久久激情网| 99r这里| www.夜夜操| 色婷婷777狠狠| 婷婷色基地| 色综啪啪网| 亚州精品色情在线观看| 人人干人人看| 91黄址| 久99久99精品免| 天堂在线婷婷| 国产玖玖资源| 丝雨一区二区| 国精产品久久| 91大屁股在线| 99热这里只有的精品视 | 国产精品美女久久久久AV超清 | 日本三级大片| 五月丁香黄色视频| 色婷婷综合久久久久| 婷婷五月天AV在线| av无码电影| 99亚洲视频| 99re免费视频| 亚洲日日日| 丁香五月久久社区| 色五月色五天免费视频| 一起草aV| 99精品无码| 9久久AV| 99久久这里只有精品| 成人一区在线观看| 婷婷五月婷婷| 猫咪伊人久久| 久操无码| 综合色播| wwW天天干| 五月激情小说| 69午夜成人影片| 欧美色综合天天久久综合精品| 婷五月丁香| 国产精品久久久久久喷浆| 婷婷性爱无码视频| 99ri网站在线观看| 婷婷五月天色播| 69久久久| 超碰三级片| 亚洲啪啪啪啪| 99热综合| www.狠狠干com| 91日婷婷在线| 手机旧版看人妻1025| 色99日韩| 性做久久久久久久免费看| 九九视频精品在线免费| 超级碰碰一区| 久久久久亚洲AV无码网影音先锋| 97香蕉碰碰人妻国产欧美| 久久丁香五月天| 婷婷瑟五月天久久综合| 五月丁香亚州综合网| 精品人妻伦一二三区久| 五月婷婷无码| 五月开心深爱激情网| 色婷在线视频| 中文av网站| 九九综合久久丁香婷婷,开心激情综合网| 少妇人妻人伦A片| 婷婷色成人| 久久免费丁香| 激情色色色| 色高清无码视频| 丁香五月天天| 91碰碰碰| 婷婷激情视频欧美视频自拍视频欧美剧| 五月丁香六月婷婷久久肏| www夜夜| 色宗合久久五月婷婷| 玖玖五月丁香| www.婷婷| 丁香五月欧美午夜视频| Se.婷婷五月天| 婷婷六月成人| 亚洲综合色色色| www,婷婷五月天,com| 久久性刺激| 中文字幕按摩做爰| 天天干一干| 99re久热只有精品6在线直播| 婷婷九九色| 79精品视频在线观看,| 亚洲综合婷婷六月丁香五月| 99久久99九九99九九九| 北条麻妃伊人| 婷婷欧美| 久草热在线视频| 欧美激情Va| 日本九九视频| 五月综合婷婷五月| 五月天色婷婷激情综合| 伊人碰碰婷婷| 伊人网色婷婷五月天| 99热国产精品| 婷婷婷婷婷婷婷五月丁香| 久久ww| 婷婷欠久少妇| 久久久久久久人妻| 殴美日韩成人| 亚洲丁香五月| 26uuu色噜噜精品一区| 婷婷五月天大香蕉| 五月丁香婷婷五月色| 久久99综合| 五月天激情四射网站| 性色婷婷| 舔色婷婷| 五月丁香欧美综合免费视频| AV色五月婷婷| 九九色色色| 婷婷五月丁香青青草在线| 五月婷婷在线视频| 99超级碰碰| 夜夜操,天天撸| 丁香婷婷免费| 九九热视频精品2| 五月婷激情影院| 婷婷伊人綜合中文| 99ER热精品视频| 亚洲激情av| 天天操狠狠操| 2020夜夜操天天爽| 国内婷婷丁香社区在线播放| 日韩黄黄| 久久多色| 激情婷婷久久| 狠狠综合色网| 任你干线上免费视频有3吗| 国产AV一区二区三区最新精品| 天天干 夜夜爽| 任你日视频| 丁香 亚洲 久久| 色色色综合色| 欧美α√| 热99这就是精品视频| 色欲资源网| 亚洲另类婷婷五月综合| 激情五月综亚网| 再綫Av免费視品| 欧美性二区| 五月丁香婷婷色色| 午夜大香蕉| 一逼色综合| 婷婷午夜精品久久久| 99re久热只有精品6在线直播.com| 色色色五月| 婷婷色一二三区波多野结衣| 人妻六月天| 久操大屁股女人av| 丁香五月婷婷少妇| 丁香五月性爱爱五月| 丁香五月最新网址| 色在线99| 91丨九色丨高潮丰满日本| 丁香五月婷婷99| 丁香玖玖| 99A级片| 在线视频另类| 久久久久久久综合狠狠综合| 热久久思思热思思| 内射激情在线| 五月六月激情| 99精品热| 综合色色网| 婷婷六月激情| 最近中文字幕大全免费版在线| 极品少妇XXXX精品少妇偷拍| 久久五月天婷婷| 久久久国产精品黄毛片| Aaa久久| 日韩有码一区| 日本三级网址| 99re66热这里只有精品| 嫩草综合网| 丁香色综合| 天堂网啪啪| 激情五月天在线视频| 欧洲色区| 丁香婷婷老司机久操| 免费97碰碰| 日本a片网址| 亚洲综合婷婷| 九九热精品视频| 91久久婷婷| 北京熟妇搡BBBB搡BBBB | 国产精品色婷婷99久久精品| 久碰视频| 伊人久久五月天| 久狠狠| 99爱视频在线| 久久婷婷五月丁香蜜桃网| 色婷婷五月成人网| WWW,色五月| 俺去啦综合网| 五月婷婷丁香综合| 国产精品久久久久9999小说| 午夜日日| 天天搽天天射| 色99网| 精品久久久人妻| 丁香六月天婷婷色| 五月丁香婷婷色色色| 婷婷五月天 偷拍| 少妇激情五月天| 人人摸人人搞| 超碰在线资源| 99热大全在线观看| 丁香五月激情综合网激情五月| 伊人午夜综合色啪| www.99热在线观看| 一级片操逼视频| 久9免费视频| 亚州视频九九99| 激情99| 综合欧美五月婷婷| 综合大香蕉| 97色伦另类图片小说视频| 五月丁香在线| 99ER热精品视频| 香蕉狠狠爱视频| 人妻VideOssS人妻| 人人操五月天| 久久婷婷激情四射五月天| 激情播丁香| 噜噜色噜噜网| 少妇高潮A片无套内谢麻豆传| 色综合香蕉| 九九热99精品在线| 九九九热精品| 狠狠狠狠狠狠草| 五月丁香婷婷无码中文| 婷婷亚洲综合| 97人碰人操| 99久久免费性爱视频`| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 五月婷婷六月丁香在线视频免费在线观看| 一起草AV| 婷婷丁香综合| 婷婷激情丁五月| www.99热| 色情久久久| 亭亭五月色男人| 亚洲熟妇AV乱码在线观看| 9l视频自拍9l九色成人| 26uuu国产| 99网| 色情五月天视频网| 久草视频一,二三四| 欧美色偷偷大香| 久久久99精品| 婷婷激情五月| 99re66热这里只有精品| 亚洲精品激情| 婷婷色五月综合| 久久国产性爱A V| 97色欧美| 97碰碰电影| 九九久热| 五月 婷 久| 丁香欧美| http://www.com久久久精品一区| 99久久a线观| 五月婷婷综合视频| 二色av| 中文字幕在线不卡| 好大好粗嗯啊-一级黄色大片免费观看-成人AV | 99九九在线视频| 日韩无码系列| 激情www| 五月激情久久| www、色色色| 狠狠色综合图片| 成人色色视频| 俺去也五月| 天天狠狠插| 噼里啪啦完整版中文在线观看| 婷婷五月天最新综合你懂的| 67194成I人在线观看线路1| 另类激情四射| 一级精品999WWW| 日本操碰碰| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 99色视| 天天干一干| 色五月丁香总合网| 色情综合网| 中文人妻主播久久| 曰韩少妇内射免费播放| 丁香五月天信号| 亚洲婷婷五月天| 狠狠狠人妻| 激情九月婷婷九月| 色婷婷五月天不卡| 69久热| 综合狠狠干| 日韩成人综合网| 99热激情| 六月婷五月丁香| 天天射网站| 久久久人妻系列| 人操人| 五月综合激情| 99久热这里只有精品视频删减版| 色婷婷视频| 丁香五月天黄色片| 婷婷色五月激情| 色情播放| 99热99思午夜精品| 区美毛片子| 丁香五月婷婷深五月| 免费观看18视频网站| 亚州激情在线视频| 久久五月丁香| AⅤ色区| 日韩三级视频一区二区| 91九色欧美| 婷婷八月激情| 激情五月黄色| 色婷婷五月天视频网站| 成人短视频在线| 国产69久久久欧美黑人A片| 好吊丝aV| 九九九九九九综合| 亚洲日日日| 亚洲婷婷丁香五月视频| 久久日韩婷婷五月| 性爱视频99| 国产成人va在线| 哇嘎成人久久| 久久99精品视频| 2025年最新亚洲在线欧美| 九九色大香蕉| 国产精品18久久久| 综合色色色| 色婷婷五月影视| 亚洲精品亚洲人成人网| 深爱1激情网| 9999综合99综合人| 人人干人人看| 婷婷激情丁五月| 超碰在线9| 久久久亚洲精品一区二区三区浴池| 99er热精品视频| 婷婷色色五月天| 亚洲日本三级片| 久久伊人大香蕉| 欧美性爱5月天天天看| 五月丁香黄色| 日韩欧美不卡| 日本美女上人| www色中色综合| 六月婷婷综合| 超碰97在线操| 91丨九色丨高潮丰满日本| 日批在线看| 日本熟妇精品99| 丁香五月婷婷啪啪视频| 久色网| av性爱网站| 色综合久久伊伊婷婷五月| 色婷婷操逼| 婷婷伊人五月丁香天堂网| 婷婷丁香社区| 特级西西4444www无码| 人人草人人舔| 99热无码| 亚洲爱爱无码婷婷色五月| 亚洲精品99| 久久九九精彩| 超碰永久在线| 日韩乱轮AV| 狠狠狠狠狠干| 五月丁香婷婷综合| 激情综合婷婷| 色欧美日| 亚洲偷| 久99| 九九99免费视频| 综合网天天| 五月花成人网| 好好干Av| 色哟哟精品| 波多婷婷久久| 99国产精品久久久久久久久久久| 另类视频综合| 天天摸天天舔| 天天天摸夜夜夜玩| 五月熟妇婷婷久久| 五月色情婷婷| 中美月韩免费A片| 六月婷婷最新网址| 97伦乱| 色婷五月天| 色综合婷婷| 久re热视频| 亚洲色激情| 久久综合天天综合| 青青草蜜臀| 思思久ren热| 久久99免费视屏| 久久多色| 91丁香五月| 丁香久月婷| 婷婷丁香先锋资源网站| 婷婷五月激情小说| 九九99精品视品| 天天肏在线| 国产伦亲子伦亲子视频观看| 色婷婷六月| AV性爱网| 丁香六月婷婷综合| 色婷婷亚洲精品天天综| 四色永久成人网站| 激情久久久久| 色色综合网站| 另类视频一区| 婷婷久久综合久| 亚洲综合激情五月久久| 五月丁香综合| 五月激情站| 六月婷婷综合| 丁香五月性爱| 内射爽无广熟女亚洲| 九九色色| 激情内射人妻1区2区3区| 开心激情综合| 大香蕉精品视频| 91综合色| 色九九综合| 色色色网站| 婷婷五月色| 99热这里只有精品在线观看| 狠狠干五月天| 被男人添B超爽视频| www.婷婷| 国产精品天天狠天天看| 操91| 五月天婷婷色| 五月综合激情啪啪啪啪啪| 91综合在线观看| 九九热啪啪| 婷婷五月激情六月丁香 | 丁香五月激情在线| 最新久久网址| www.天天干| 级人人91| 中文字幕日韩成人| 亚洲人人96@| 婷婷五月天偷拍| 99热国内精品| 人妻AV在线| 久久男人网婷婷| 久久婷婷五月天蜜桃| 亚洲五月天综合色| 日日夜夜小色哥| 99久久99久久| 99国产精品久久久久久久久久久 | 天天综合网91| 极品人妻VIDEOSSS人妻| 亚洲欧美日韩另类| 97香蕉碰碰人妻国产欧美| 呦呦v线| 五月精品| 北京熟妇搡BBBB搡BBBB| 色99视| 日日操夜夜爽白洁| 中文在线视频久1| 五月丁香六月婷婷久久| 亚洲欧美成人在线观看| www.久久久.com| 激情五月丁香激情综合网| 丁香五月综合激情性爱| 免费观看18视频网站| 欧美啪啪网| 99在线免费视| 丁香五月天婷婷中文字幕| 丁香六月婷婷久久综合| 婷婷久久图片| 亚洲色五月天是什么| 日本99色| 思思久久99热只有频精品66| 久9无码视频| 日逼免费视频| 色色色免费视频| BlACKEDRAW视频一区二区| 思思色播| 91精品久久久久、久五月天| 国产精产国品一二三在观看| 99亚洲精品视频| 天天色天天噜| 色色色色色色网站| 婷婷五月六月丁香| 五月婷庭丁香在线| 超碰人人操在线| 亚洲国产网址| 色插综合网| 99热婷婷| 丁香五月天婷婷91| 五月天婷婷丁香视频| 九九五月天| 黄色99热| 欧美性丁香色色五月天| 天天色色天天| 五月天久久网站| 久播影院免费观看电视剧大全最新网| 色播播五月天| 96精品久久久久久久久| 性日本精品| 成人午夜天| 六月丁香激情综合网| 182TV大香蕉| 九九热99久久99| 狠狠色狠狠色综合日日91| 色婷五月天| 亚洲99综合| 久久性爱视频| 91刘玥视频在线观看| 色久免费| 夜精品无码A片一区二区蜜桃| 五月婷婷综合激情| 亚洲 视频 导航 一区| 操操熟女| 日日爱699| 五月婷A V在线| 婷婷五月激情片| 天天插天天插| 丁香五月天啪啪| www.99在线| 淫视馆AV在线| 我去色色网五雨天| www.久久婷婷| 丁香六月五月天| 超碰啪啪网| 丁香五月亚洲| 色色色宗合网| 六月丁香婷婷在线波多| 97很鲁在线视频| 五月丁香 久久久| 五月丁香| 思思热99er在线视频| 婷婷五月天色色| 激情五月天综合网站网站网站| 伊人五月天在线| 天天爽爽日日做做| 人人播| 五月丁香日本在线视频观看| 天天色综网| 九九热精品| 久久99网| 久久色五月| www.夜夜| 在线综合婷婷| 在线看九一V图片| 色五月激情| 五月丁花六月丁香综合| 色色色色色色色色色色色色色色,网站| 人妻操操色| 欧美97超碰| 丁香五月天在线| 五月天丁香啪啪啪啪| 五月天综合色| 午夜九九九九九九九九九九九九九| 色婷婷a| 久久免费9| 天堂爱爱| 成人国产欧美大片一区| 久久婷婷五月天激情| 久久久精品婷婷五月天| www,99热| 在线99色| 91干| 亚洲精品操一操、噜一噜、摸一摸、爽 | 香蕉97碰碰碰欧美| 五月丁香六月婷婷手机无线| 亲子乱AV-区二区三区| 五月丁香色六月激情干大屄| 99久re热| 亚洲色网络| 五月天婷婷网站| 久久久噜噜噜操操操| 激情亭亭五月| 婷婷五月成人| 亚洲A片成人无码久久精品青桔| 我要看激情五月天| 欧美久人人| 丁香五月婷婷基地| 久久人妻乱子伦| www,setingting| 99免费视频| 综合激情五月四射婷婷| 日本黄色三级片内射| 人人干人人操人人摸| WWW.婷婷五月天.COM| www激情| 女力报到正好爱上你| 色婷婷偷拍| www.狠狠操| 亚洲va欧洲va国产va不卡| 日本99在线| 午夜天堂一区人妻| 亚洲天天| 玖热精品综合视频| 久久九九激情五月天| 色色热| 亚洲色色爱| 色婷婷综合在线| 91狠狠色丁香婷婷综合久久| 五月天自拍视频| 国产无人区大片| 色色色999| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 婷婷五月色丁香在线看| 九月av| 少妇大叫太大太粗太爽了A片| www激情com| 99久久免费性爱视频`| 五月丁香婷婷老司机| 狠狠操狠狠| 激情综合激情五月一起草|