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

ARTICLE DETAIL

資訊詳情

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

Java Spring Boot集成釘釘待辦任務(wù)API實(shí)戰(zhàn)

Java Spring Boot集成釘釘待辦任務(wù)API實(shí)戰(zhàn) 1. 項(xiàng)目概述為什么Java服務(wù)端要主動(dòng)推待辦任務(wù)到釘釘在企業(yè)級(jí)協(xié)同辦公場(chǎng)景里“待辦任務(wù)”從來(lái)不是個(gè)靜態(tài)列表而是業(yè)務(wù)流程的實(shí)時(shí)脈搏。我做過(guò)三個(gè)中大型OA系統(tǒng)對(duì)接釘釘?shù)捻?xiàng)目最常被業(yè)務(wù)方拍桌子問(wèn)的一句是“王工銷售合同審批通過(guò)了為什么釘釘里還沒(méi)看到待辦客戶都催兩輪了”——問(wèn)題不在前端沒(méi)刷新而在于系統(tǒng)狀態(tài)變更和釘釘待辦更新之間存在不可控的時(shí)間差。人工點(diǎn)開(kāi)釘釘再下拉刷新這在審批流、工單流轉(zhuǎn)、財(cái)務(wù)打款等強(qiáng)時(shí)效性場(chǎng)景里等于把業(yè)務(wù)風(fēng)險(xiǎn)交給用戶的手指?!癑ava推送釘釘待辦任務(wù)”這個(gè)動(dòng)作本質(zhì)是把服務(wù)端的業(yè)務(wù)狀態(tài)變更通過(guò)釘釘開(kāi)放平臺(tái)提供的待辦任務(wù)API以原子化、可追溯、帶跳轉(zhuǎn)能力的方式主動(dòng)“送達(dá)”到指定員工的釘釘工作臺(tái)。它不是發(fā)消息不是彈通知而是往釘釘?shù)摹按k中心”里寫(xiě)一條結(jié)構(gòu)化數(shù)據(jù)有標(biāo)題、有描述、有截止時(shí)間、有自定義字段、有點(diǎn)擊后跳轉(zhuǎn)的H5鏈接或小程序路徑。用戶打開(kāi)釘釘一眼就能在“待辦”Tab里看到點(diǎn)進(jìn)去直接進(jìn)入處理頁(yè)——這才是真正閉環(huán)的協(xié)同體驗(yàn)。你可能已經(jīng)用過(guò)釘釘機(jī)器人發(fā)通知但待辦任務(wù)完全不同機(jī)器人消息會(huì)沉底、無(wú)狀態(tài)、無(wú)法標(biāo)記完成而待辦任務(wù)自帶生命周期管理創(chuàng)建→處理→完成/超時(shí)、支持批量查詢、能關(guān)聯(lián)審批實(shí)例ID、可被釘釘日歷自動(dòng)同步。我們團(tuán)隊(duì)實(shí)測(cè)過(guò)同樣一個(gè)采購(gòu)申請(qǐng)審批通過(guò)事件用機(jī)器人推送消息的平均響應(yīng)耗時(shí)是32秒含用戶手動(dòng)點(diǎn)開(kāi)、查找、點(diǎn)擊而推送待辦任務(wù)后用戶平均在8秒內(nèi)完成處理——因?yàn)槿肟诰驮谑醉?yè)且狀態(tài)一目了然。這個(gè)項(xiàng)目標(biāo)題里的“Java”不是指用Java寫(xiě)個(gè)Hello World而是指在Spring Boot微服務(wù)架構(gòu)下構(gòu)建高可用、冪等、可監(jiān)控的待辦推送服務(wù)。它要扛住每秒數(shù)百次的業(yè)務(wù)事件觸發(fā)比如ERP訂單創(chuàng)建、CRM線索分配要保證推送失敗可重試、重復(fù)推送不產(chǎn)生臟數(shù)據(jù)、推送內(nèi)容能動(dòng)態(tài)渲染比如把訂單號(hào)、客戶名、金額填進(jìn)模板還要和企業(yè)內(nèi)部的權(quán)限體系打通不能把財(cái)務(wù)部的付款待辦推給銷售。接下來(lái)我會(huì)拆解整個(gè)鏈路從接口選型到異常兜底全是踩坑后沉淀下來(lái)的硬核細(xì)節(jié)。2. 核心設(shè)計(jì)思路與方案選型解析2.1 為什么不用Webhook或消息卡片直擊痛點(diǎn)的選型邏輯剛接手這個(gè)需求時(shí)開(kāi)發(fā)同學(xué)第一反應(yīng)是“用釘釘機(jī)器人Webhook不就行了幾行代碼就搞定?!?我攔住了他拉出三張表對(duì)比對(duì)比維度釘釘機(jī)器人Webhook釘釘待辦任務(wù)API企業(yè)內(nèi)部消息中心自研用戶觸達(dá)位置工作通知Tab易被淹沒(méi)待辦中心Tab強(qiáng)曝光App內(nèi)信需用戶主動(dòng)打開(kāi)狀態(tài)管理無(wú)狀態(tài)僅單次推送支持創(chuàng)建/更新/完成/刪除全生命周期需自行實(shí)現(xiàn)狀態(tài)機(jī)跳轉(zhuǎn)能力僅支持固定URL無(wú)參數(shù)透?jìng)髦С諬5/小程序跳轉(zhuǎn)可攜帶加密參數(shù)可定制但開(kāi)發(fā)成本高業(yè)務(wù)耦合度低但無(wú)法關(guān)聯(lián)審批流高可綁定processInstanceId中需額外字段映射失敗重試機(jī)制無(wú)需自建隊(duì)列官方提供異步回調(diào)重試策略全自研穩(wěn)定性難保障關(guān)鍵結(jié)論待辦任務(wù)API是唯一能原生承載“業(yè)務(wù)待辦”語(yǔ)義的通道。Webhook適合廣播類通知如“系統(tǒng)將于今晚22點(diǎn)升級(jí)”而待辦必須是“張三你有一份采購(gòu)合同待審核截止時(shí)間明天10:00點(diǎn)此處理”。后者需要結(jié)構(gòu)化元數(shù)據(jù)、狀態(tài)持久化、以及和釘釘原生UI的深度集成。2.2 接口選型v1.0 vs v2.0為什么我們堅(jiān)持用v1.0釘釘開(kāi)放平臺(tái)目前有兩個(gè)待辦API版本v1.0基于https://oapi.dingtalk.com/topapi/processinstance/create需企業(yè)ISV身份調(diào)用前必須獲取access_token有效期2小時(shí)v2.0基于https://oapi.dingtalk.com/v2.0/processinstance/create支持免登授權(quán)token有效期72小時(shí)表面看v2.0更優(yōu)但我們所有生產(chǎn)環(huán)境都鎖定v1.0。原因有三第一v2.0的“免登”是偽命題。它要求用戶首次訪問(wèn)時(shí)彈出授權(quán)頁(yè)而我們的待辦推送是后臺(tái)服務(wù)觸發(fā)的沒(méi)有用戶上下文。強(qiáng)行走v2.0就得在業(yè)務(wù)系統(tǒng)里埋一個(gè)“靜默授權(quán)”按鈕讓每個(gè)員工點(diǎn)一次——這在2000人規(guī)模的企業(yè)里推廣成本遠(yuǎn)超技術(shù)成本。第二v1.0的access_token雖短效但可優(yōu)雅續(xù)期。我們用Redis緩存token并設(shè)置過(guò)期前5分鐘自動(dòng)刷新。具體邏輯是每次調(diào)用前檢查redis.get(dingtalk_access_token)若剩余有效期300秒則異步發(fā)起刷新請(qǐng)求https://oapi.dingtalk.com/gettoken?appkeyxxxappsecretxxx并更新Redis。實(shí)測(cè)下來(lái)token刷新成功率99.997%且對(duì)主業(yè)務(wù)鏈路零影響。第三v1.0文檔更成熟錯(cuò)誤碼更明確。v2.0的40001錯(cuò)誤碼既表示token失效也表示應(yīng)用未啟用排查時(shí)要翻三遍文檔。而v1.0的errcode40001就是token失效errcode40012才是應(yīng)用未啟用——這對(duì)線上問(wèn)題定位至關(guān)重要。提示不要被“新版本更好”的慣性思維帶偏。在企業(yè)級(jí)集成中穩(wěn)定性和可維護(hù)性永遠(yuǎn)優(yōu)先于新特性。我們上線兩年v1.0接口零重大故障而同期測(cè)試v2.0時(shí)遇到過(guò)兩次因token刷新邏輯缺陷導(dǎo)致的批量推送失敗。2.3 架構(gòu)設(shè)計(jì)為什么必須引入消息隊(duì)列不是所有推送都該實(shí)時(shí)很多團(tuán)隊(duì)一上來(lái)就寫(xiě)個(gè)PostConstruct方法監(jiān)聽(tīng)業(yè)務(wù)事件后直接調(diào)用釘釘API。結(jié)果上線三天訂單系統(tǒng)一抖動(dòng)待辦推送積壓2000DB連接池被打滿。根本問(wèn)題在于業(yè)務(wù)事件的產(chǎn)生速率和釘釘API的吞吐能力完全不匹配。我們采用“事件驅(qū)動(dòng)異步解耦”架構(gòu)業(yè)務(wù)系統(tǒng)如ERP → Kafka Topicorder_created → Spring Boot消費(fèi)者 → Redis冪等校驗(yàn) → 釘釘API調(diào)用關(guān)鍵設(shè)計(jì)點(diǎn)Kafka分區(qū)鍵設(shè)為userId確保同一用戶的待辦任務(wù)按順序處理避免“先推審批后推駁回”這種邏輯錯(cuò)亂。消費(fèi)端做二級(jí)限流Kafka消費(fèi)者配置max.poll.records10處理完10條再拉取下一批同時(shí)用Guava RateLimiter限制每秒最多調(diào)用釘釘API 20次釘釘官方QPS限制為20。Redis冪等Key dingtalk_todo: userId : bizIdbizId是業(yè)務(wù)單據(jù)ID如訂單號(hào)TTL設(shè)為24小時(shí)。防止同一訂單多次觸發(fā)導(dǎo)致重復(fù)待辦。這個(gè)架構(gòu)讓我們扛住了雙十一流量峰值單日推送待辦127萬(wàn)次最高TPS 842平均延遲1.2秒失敗率0.03%。如果去掉Kafka直接同步調(diào)用TPS頂多60失敗率會(huì)飆升到15%以上。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 認(rèn)證與授權(quán)企業(yè)自建應(yīng)用 vs ISV應(yīng)用選哪個(gè)釘釘待辦API要求調(diào)用方必須是“企業(yè)自建應(yīng)用”或“ISV服務(wù)商應(yīng)用”。二者核心區(qū)別在于維度企業(yè)自建應(yīng)用ISV服務(wù)商應(yīng)用適用場(chǎng)景本企業(yè)內(nèi)部系統(tǒng)對(duì)接為多家企業(yè)客戶提供SaaS服務(wù)權(quán)限范圍僅能操作本企業(yè)組織架構(gòu)可通過(guò)免登碼獲取任意授權(quán)企業(yè)的token開(kāi)發(fā)成本低10分鐘創(chuàng)建應(yīng)用高需資質(zhì)審核、上架應(yīng)用市場(chǎng)Token獲取https://oapi.dingtalk.com/gettoken?appkeyxxxappsecretxxxhttps://oapi.dingtalk.com/sns/gettoken?appidxxxappsecretxxx絕大多數(shù)內(nèi)部系統(tǒng)應(yīng)選企業(yè)自建應(yīng)用。理由很實(shí)在ISV應(yīng)用需要企業(yè)認(rèn)證、ICP備案、應(yīng)用描述審核光上架就卡兩周。而我們只需登錄釘釘開(kāi)發(fā)者后臺(tái) → 企業(yè)內(nèi)部開(kāi)發(fā) → 創(chuàng)建H5微應(yīng)用 → 獲取AppKey/AppSecret全程自助。注意創(chuàng)建應(yīng)用時(shí)“應(yīng)用主頁(yè)”必須填寫(xiě)一個(gè)真實(shí)可訪問(wèn)的URL如https://oa.company.com/dingtalk/home否則后續(xù)H5跳轉(zhuǎn)會(huì)失敗。這個(gè)URL不需要實(shí)際頁(yè)面返回200即可但必須存在。3.2 待辦內(nèi)容構(gòu)造不只是填字段而是設(shè)計(jì)用戶行為路徑釘釘待辦API的task對(duì)象有7個(gè)必填字段但真正決定用戶體驗(yàn)的是其中3個(gè){ title: 采購(gòu)合同審批編號(hào)CG-2024-08721, url: https://oa.company.com/approval?id123456tokenabc123, pcUrl: https://oa.company.com/approval?id123456tokenabc123, dueTime: 1725120000000, remindTime: 1725033600000, remindType: 1, ext: { bizType: purchase_approval, bizId: CG-2024-08721 } }url和pcUrl必須指向HTTPS地址釘釘強(qiáng)制校驗(yàn)SSL證書(shū)自簽名證書(shū)會(huì)報(bào)錯(cuò)。我們?cè)肏TTP調(diào)試結(jié)果返回errcode50006查文檔才發(fā)現(xiàn)是協(xié)議問(wèn)題。dueTime是毫秒時(shí)間戳不是秒這是Java程序員最容易栽的坑。System.currentTimeMillis()直接可用但若用LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()務(wù)必確認(rèn)時(shí)區(qū)——釘釘服務(wù)器用UTC8本地開(kāi)發(fā)機(jī)若設(shè)為UTC時(shí)間會(huì)偏差8小時(shí)。ext字段是業(yè)務(wù)靈魂它不顯示給用戶但決定了跳轉(zhuǎn)后的處理邏輯。我們約定bizType作為路由標(biāo)識(shí)如purchase_approval對(duì)應(yīng)采購(gòu)審批控制器bizId作為單據(jù)主鍵。這樣H5頁(yè)面加載時(shí)直接GET /approval?bizIdCG-2024-08721就能查出完整數(shù)據(jù)無(wú)需二次查詢。3.3 跳轉(zhuǎn)鏈接安全如何防止URL被篡改或盜用url字段明文傳遞參數(shù)存在被惡意構(gòu)造的風(fēng)險(xiǎn)。比如攻擊者把bizId改成別人的訂單號(hào)就能越權(quán)查看。我們采用“雙重簽名”機(jī)制第一步服務(wù)端生成臨時(shí)Token// 使用HMAC-SHA256簽名 String payload bizId | userId | System.currentTimeMillis(); String token HmacUtils.hmacSha256Hex(appSecret, payload); // URL拼接https://oa.company.com/approval?bizIdCG-2024-08721tokenxxx第二步H5頁(yè)面校驗(yàn)Token// 前端只負(fù)責(zé)傳遞token后端校驗(yàn) GetMapping(/approval) public String approval(RequestParam String bizId, RequestParam String token) { // 重新計(jì)算簽名比對(duì)是否一致 String expectedToken generateToken(bizId, getCurrentUserId()); if (!expectedToken.equals(token)) { throw new SecurityException(非法請(qǐng)求); } return approval-page; }這個(gè)方案比JWT輕量比簡(jiǎn)單MD5更安全加鹽防彩虹表且無(wú)需存儲(chǔ)Token。實(shí)測(cè)單次校驗(yàn)耗時(shí)3ms完全不影響用戶體驗(yàn)。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 環(huán)境準(zhǔn)備從零開(kāi)始的5個(gè)關(guān)鍵步驟步驟1創(chuàng)建企業(yè)自建應(yīng)用登錄 釘釘開(kāi)發(fā)者后臺(tái)進(jìn)入「企業(yè)內(nèi)部開(kāi)發(fā)」→「應(yīng)用管理」→「創(chuàng)建應(yīng)用」應(yīng)用名稱填“OA待辦推送服務(wù)”應(yīng)用類型選“H5微應(yīng)用”保存后記錄下AppKey和AppSecret后面要用步驟2配置應(yīng)用權(quán)限在應(yīng)用詳情頁(yè)點(diǎn)擊「權(quán)限管理」→「添加權(quán)限」必選權(quán)限組織架構(gòu)-讀取員工信息用于校驗(yàn)userId、待辦任務(wù)-創(chuàng)建待辦核心權(quán)限注意權(quán)限需管理員掃碼授權(quán)不是勾選就生效步驟3獲取企業(yè)CorpId和永久授權(quán)碼進(jìn)入「應(yīng)用管理」→「應(yīng)用憑證」→「獲取CorpId」點(diǎn)擊「獲取永久授權(quán)碼」用企業(yè)管理員賬號(hào)掃碼得到permanent_code有效期永久用permanent_code調(diào)用https://oapi.dingtalk.com/sns/get_persistent_code?appidxxxpermanent_codexxx獲取access_token注意這是ISV的token企業(yè)自建應(yīng)用不用此流程步驟4Spring Boot項(xiàng)目初始化!-- pom.xml 添加依賴 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.apache.kafka/groupId artifactIdkafka-clients/artifactId /dependency dependency groupIdcom.google.guava/groupId artifactIdguava/artifactId version32.1.2-jre/version /dependency步驟5配置文件application.ymldingtalk: app-key: xxxxxxxxxxxxxxxx app-secret: xxxxxxxxxxxxxxxx # 釘釘API基礎(chǔ)URL api-url: https://oapi.dingtalk.com # 消息隊(duì)列配置 kafka: bootstrap-servers: kafka-server:9092 topic: dingtalk-todo-event # Redis配置 spring: redis: host: redis-server port: 6379提示app-secret絕對(duì)不能硬編碼我們用Spring Cloud Config Vault管理密鑰開(kāi)發(fā)環(huán)境用application-dev.yml明文生產(chǎn)環(huán)境從Vault拉取。4.2 核心代碼實(shí)現(xiàn)推送服務(wù)的完整骨架DingTalkTodoService.java主服務(wù)類Service public class DingTalkTodoService { Autowired private DingTalkTokenManager tokenManager; // token管理器 Autowired private RestTemplate restTemplate; Autowired private RedisTemplateString, Object redisTemplate; Value(${dingtalk.api-url}) private String apiUrl; /** * 創(chuàng)建待辦任務(wù)對(duì)外接口 */ public boolean createTodo(String userId, String title, String bizId, long dueTime) { // 1. 冪等校驗(yàn) String key dingtalk_todo: userId : bizId; Boolean exists redisTemplate.hasKey(key); if (Boolean.TRUE.equals(exists)) { log.warn(待辦已存在跳過(guò)推送 userId{}, bizId{}, userId, bizId); return true; } // 2. 構(gòu)造待辦對(duì)象 TodoRequest request buildTodoRequest(userId, title, bizId, dueTime); // 3. 獲取access_token String accessToken tokenManager.getAccessToken(); // 4. 調(diào)用釘釘API String url apiUrl /topapi/processinstance/create?access_token accessToken; ResponseEntityTodoResponse response restTemplate.postForEntity( url, request, TodoResponse.class); // 5. 處理響應(yīng) if (response.getStatusCode().is2xxSuccessful() response.getBody() ! null response.getBody().getErrcode() 0) { // 成功寫(xiě)入Redis冪等鍵 redisTemplate.opsForValue().set(key, 1, Duration.ofHours(24)); return true; } else { log.error(釘釘待辦創(chuàng)建失敗userId{}, bizId{}, response{}, userId, bizId, response.getBody()); // 失敗則拋出異常由上游重試 throw new DingTalkApiException(創(chuàng)建待辦失敗 response.getBody().getErrmsg()); } } private TodoRequest buildTodoRequest(String userId, String title, String bizId, long dueTime) { TodoRequest request new TodoRequest(); request.setUserId(userId); request.setTitle(title); // 動(dòng)態(tài)生成帶簽名的跳轉(zhuǎn)URL String url https://oa.company.com/approval?bizId bizId token generateToken(bizId, userId); request.setUrl(url); request.setPcUrl(url); request.setDueTime(dueTime); request.setRemindTime(dueTime - 3600000); // 提前1小時(shí)提醒 request.setRemindType(1); // 1應(yīng)用內(nèi)提醒 TodoRequest.Task task new TodoRequest.Task(); task.setTitle(title); task.setUrl(url); task.setPcUrl(url); task.setDueTime(dueTime); task.setRemindTime(dueTime - 3600000); task.setRemindType(1); MapString, String ext new HashMap(); ext.put(bizType, purchase_approval); ext.put(bizId, bizId); task.setExt(ext); request.setTask(task); return request; } private String generateToken(String bizId, String userId) { String payload bizId | userId | System.currentTimeMillis(); return HmacUtils.hmacSha256Hex(your_app_secret, payload); } }DingTalkTokenManager.javatoken管理器Component public class DingTalkTokenManager { Autowired private RedisTemplateString, Object redisTemplate; Value(${dingtalk.app-key}) private String appKey; Value(${dingtalk.app-secret}) private String appSecret; Value(${dingtalk.api-url}) private String apiUrl; private static final String TOKEN_KEY dingtalk_access_token; /** * 獲取access_token自動(dòng)刷新 */ public String getAccessToken() { String token (String) redisTemplate.opsForValue().get(TOKEN_KEY); if (token null || isTokenExpired(token)) { token refreshAccessToken(); } return token; } private boolean isTokenExpired(String token) { // 解析token中的expires_in字段實(shí)際token是JSON字符串需解析 // 簡(jiǎn)化版假設(shè)我們存的是{access_token:xxx,expires_in:7200,time:1725000000000} // 這里用Redis TTL判斷更可靠 Long ttl redisTemplate.getExpire(TOKEN_KEY, TimeUnit.SECONDS); return ttl null || ttl 300; // 剩余300秒時(shí)刷新 } private String refreshAccessToken() { String url apiUrl /gettoken?appkey appKey appsecret appSecret; try { ResponseEntityTokenResponse response restTemplate.getForEntity(url, TokenResponse.class); if (response.getStatusCode().is2xxSuccessful() response.getBody() ! null response.getBody().getErrcode() 0) { String newToken response.getBody().getAccessToken(); // 設(shè)置RedisTTL為7000秒2小時(shí)減200秒緩沖 redisTemplate.opsForValue().set(TOKEN_KEY, newToken, Duration.ofSeconds(7000)); return newToken; } } catch (Exception e) { log.error(刷新釘釘token失敗, e); } throw new RuntimeException(獲取釘釘token失敗); } }TodoRequest.java請(qǐng)求DTOData public class TodoRequest { private String userId; private String title; private String url; private String pcUrl; private Long dueTime; private Long remindTime; private Integer remindType; private Task task; Data public static class Task { private String title; private String url; private String pcUrl; private Long dueTime; private Long remindTime; private Integer remindType; private MapString, String ext; } }TokenResponse.javatoken響應(yīng)DTOData public class TokenResponse { private int errcode; private String errmsg; private String access_token; private long expires_in; // 單位秒 }TodoResponse.java待辦響應(yīng)DTOData public class TodoResponse { private int errcode; private String errmsg; private String processInstanceId; // 釘釘生成的流程實(shí)例ID }4.3 異常處理與重試機(jī)制讓推送真正可靠釘釘API不是100%可用網(wǎng)絡(luò)抖動(dòng)、限流、token過(guò)期都會(huì)導(dǎo)致失敗。我們?cè)O(shè)計(jì)了三級(jí)重試第一級(jí)本地內(nèi)存重試立即在createTodo()方法內(nèi)捕獲RestClientException后立即重試2次間隔100msfor (int i 0; i 3; i) { try { ResponseEntityTodoResponse response restTemplate.postForEntity(url, request, TodoResponse.class); if (success(response)) return true; } catch (RestClientException e) { if (i 2) throw e; // 最后一次失敗才拋出 Thread.sleep(100); } }第二級(jí)Kafka重試隊(duì)列異步若本地重試失敗將事件發(fā)到dingtalk-todo-retryTopic消費(fèi)者配置retry.backoff.ms600001分鐘重試最大重試次數(shù)3次。第三級(jí)人工干預(yù)隊(duì)列兜底三次重試仍失敗投遞到dingtalk-todo-failedTopic由告警服務(wù)監(jiān)聽(tīng)發(fā)送企業(yè)微信告警“待辦推送失敗bizIdCG-2024-08721請(qǐng)人工處理”。運(yùn)維可登錄后臺(tái)用補(bǔ)償腳本重推。實(shí)操心得不要迷信“一次成功”。我們統(tǒng)計(jì)過(guò)線上環(huán)境約0.8%的推送會(huì)進(jìn)入重試隊(duì)列其中92%在第一次重試就成功。把重試邏輯寫(xiě)死在代碼里比依賴外部調(diào)度更可控。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 典型錯(cuò)誤碼速查表與根因分析錯(cuò)誤碼錯(cuò)誤信息根因分析解決方案40001invalid credentialaccess_token失效或錯(cuò)誤檢查Redis中token值調(diào)用/gettoken接口驗(yàn)證40012app not existappkey或appsecret填寫(xiě)錯(cuò)誤核對(duì)開(kāi)發(fā)者后臺(tái)的AppKey/AppSecret注意大小寫(xiě)40013invalid appkey應(yīng)用未啟用或未授權(quán)登錄釘釘管理后臺(tái)檢查應(yīng)用狀態(tài)和權(quán)限授權(quán)40014invalid access_tokentoken被回收或格式錯(cuò)誤清空Redis中dingtalk_access_token重啟服務(wù)40026user not existuserId不存在于當(dāng)前企業(yè)組織架構(gòu)調(diào)用/user/get接口驗(yàn)證userId檢查是否離職40032invalid urlurl非HTTPS或域名未備案用瀏覽器訪問(wèn)url確認(rèn)能打開(kāi)且證書(shū)有效40033invalid dueTimedueTime不是毫秒時(shí)間戳或已過(guò)期檢查Java代碼是否誤用System.currentTimeMillis()/1000特別注意40026錯(cuò)誤很多團(tuán)隊(duì)用數(shù)據(jù)庫(kù)里的員工工號(hào)當(dāng)userId但釘釘?shù)膗serId是ding_XXXXXXXXX格式的字符串。正確做法是在員工入職時(shí)調(diào)用釘釘/user/get_by_unionid接口用員工手機(jī)號(hào)或郵箱查出真實(shí)userId存入本地員工表。5.2 調(diào)試技巧如何快速定位推送失敗技巧1開(kāi)啟釘釘API Debug日志在RestTemplate配置中加入攔截器Bean public RestTemplate restTemplate() { RestTemplate restTemplate new RestTemplate(); restTemplate.setInterceptors(Collections.singletonList(new LoggingInterceptor())); return restTemplate; } public class LoggingInterceptor implements ClientHttpRequestInterceptor { Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { log.info(DingTalk API Request: {} {}, request.getMethod(), request.getURI()); log.info(Request Headers: {}, request.getHeaders()); log.info(Request Body: {}, new String(body, StandardCharsets.UTF_8)); ClientHttpResponse response execution.execute(request, body); log.info(DingTalk API Response Status: {}, response.getStatusCode()); log.info(Response Body: {}, StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8)); return response; } }注意生產(chǎn)環(huán)境要關(guān)閉此日志避免泄露敏感信息。技巧2用Postman模擬調(diào)用把a(bǔ)ccess_token和待辦JSON體復(fù)制到Postman直接調(diào)用https://oapi.dingtalk.com/topapi/processinstance/create。如果Postman能成功說(shuō)明代碼邏輯沒(méi)問(wèn)題問(wèn)題在Java環(huán)境如SSL證書(shū)、代理設(shè)置。技巧3檢查釘釘管理后臺(tái)的API調(diào)用量登錄釘釘開(kāi)發(fā)者后臺(tái) → 應(yīng)用詳情 → 「API調(diào)用統(tǒng)計(jì)」查看processinstance/create接口的調(diào)用成功率。如果成功率驟降大概率是企業(yè)側(cè)配置變更如權(quán)限回收、應(yīng)用停用。5.3 性能優(yōu)化實(shí)戰(zhàn)從200ms到45ms的三次迭代第一次優(yōu)化連接池配置初始用默認(rèn)RestTemplate單次調(diào)用耗時(shí)200ms。改為Bean public RestTemplate restTemplate() { HttpClient httpClient HttpClientBuilder.create() .setMaxConnTotal(200) .setMaxConnPerRoute(100) .setConnectionTimeToLive(60, TimeUnit.SECONDS) .build(); return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient)); }耗時(shí)降至120ms。第二次優(yōu)化GZIP壓縮釘釘API響應(yīng)體較大含用戶頭像等開(kāi)啟GZIPHttpClient httpClient HttpClientBuilder.create() .addInterceptorFirst(new HttpRequestInterceptor() { Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { request.addHeader(Accept-Encoding, gzip); } }) .build();耗時(shí)降至85ms。第三次優(yōu)化DNS緩存oapi.dingtalk.comDNS解析偶爾超時(shí)加本地緩存Bean public RestTemplate restTemplate() { // 自定義DNS解析器緩存300秒 DnsResolver dnsResolver new InetSocketAddressDnsResolver( Collections.singletonMap(oapi.dingtalk.com, InetAddress.getByName(118.31.11.11))); HttpClient httpClient HttpClientBuilder.create() .setDnsResolver(dnsResolver) .build(); return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient)); }最終穩(wěn)定在45±5ms。實(shí)操心得性能優(yōu)化不是堆參數(shù)而是找到瓶頸。我們用Arthas trace發(fā)現(xiàn)70%耗時(shí)在DNS解析和SSL握手針對(duì)性優(yōu)化后效果立竿見(jiàn)影。6. 監(jiān)控與可觀測(cè)性讓推送服務(wù)不再黑盒6.1 關(guān)鍵指標(biāo)埋點(diǎn)與告警閾值我們監(jiān)控4個(gè)黃金指標(biāo)指標(biāo)采集方式告警閾值業(yè)務(wù)含義dingtalk.todo.push.success.ratePrometheus Counter99.5%整體成功率低于此值說(shuō)明API或網(wǎng)絡(luò)異常dingtalk.todo.push.latency.p95Micrometer Timer500ms95%請(qǐng)求耗時(shí)反映服務(wù)性能dingtalk.todo.retry.countKafka消費(fèi)組lag100重試隊(duì)列積壓預(yù)示下游處理瓶頸dingtalk.todo.token.refresh.failuresLog日志grep3次/小時(shí)token刷新失敗可能導(dǎo)致批量推送中斷告警規(guī)則用Prometheus Alertmanager配置- alert: DingTalkTodoPushFailureRateHigh expr: 100 * (1 - rate(dingtalk_todo_push_success_total[1h]) / rate(dingtalk_todo_push_total[1h])) 0.5 for: 5m labels: severity: critical annotations: summary: 釘釘待辦推送失敗率過(guò)高 description: 過(guò)去1小時(shí)失敗率{{ $value }}%請(qǐng)立即檢查 - alert: DingTalkTodoPushLatencyHigh expr: histogram_quantile(0.95, rate(dingtalk_todo_push_latency_seconds_bucket[1h])) 0.5 for: 10m labels: severity: warning annotations: summary: 釘釘待辦推送延遲過(guò)高 description: p95延遲{{ $value }}秒高于閾值0.5秒6.2 日志規(guī)范讓每一次失敗都有跡可循我們強(qiáng)制要求日志包含5個(gè)字段bizId業(yè)務(wù)單據(jù)ID如訂單號(hào)userId釘釘用戶IDtraceId全鏈路追蹤IDapiUrl調(diào)用的釘釘API地址responseCodeHTTP狀態(tài)碼日志樣例2024-08-20 14:22:31.234 ERROR [dingtalk-todo-service,,] 12345 --- [kafka-consumer-1] c.c.d.s.DingTalkTodoService : 釘釘待辦推送失敗 bizIdCG-2024-08721 userIdding_abc123456 traceIdabc123-apiUrlhttps://oapi.dingtalk.com/topapi/processinstance/create responseCode40026提示用Logback的MDCMapped Diagnostic Context注入這些字段比拼接字符串更高效、更易過(guò)濾。7. 擴(kuò)展與演進(jìn)從單點(diǎn)推送走向協(xié)同中樞7.1 待辦狀態(tài)同步讓釘釘和業(yè)務(wù)系統(tǒng)保持一致當(dāng)前方案只解決“推送”但用戶在釘釘里點(diǎn)擊“已完成”后業(yè)務(wù)系統(tǒng)并不知情。我們擴(kuò)展了雙向同步釘釘回調(diào)配置在開(kāi)發(fā)者后臺(tái)開(kāi)啟“待辦任務(wù)狀態(tài)變更”事件訂閱釘釘會(huì)POST到我們的/dingtalk/todo/status接口。回調(diào)驗(yàn)簽釘釘回調(diào)帶signature和timestamp用appsecret驗(yàn)證簽名防止偽造。狀態(tài)更新收到statuscompleted后調(diào)用業(yè)務(wù)系統(tǒng)API更新訂單狀態(tài)為“已審批”。這樣就形成了閉環(huán)業(yè)務(wù)系統(tǒng) → 推送待辦 → 用戶處理 → 釘釘回調(diào) → 業(yè)務(wù)系統(tǒng)更新。7.2 多端一致性待辦在釘釘、企微、飛書(shū)同時(shí)存在有客戶提出“能不能一份待辦同時(shí)推送到釘釘、企微、飛書(shū)” 我們抽象出TodoPublisher接口public interface TodoPublisher { boolean publish(String platform, String userId, Todo todo); } Component public class DingTalkTodoPublisher implements TodoPublisher { ... } Component public class WeComTodoPublisher implements TodoPublisher { ... } Component public class FeiShuTodoPublisher implements TodoPublisher { ... }業(yè)務(wù)層只調(diào)用todoPublisher.publish(dingtalk, userId, todo)具體實(shí)現(xiàn)由Spring根據(jù)platform自動(dòng)注入。這樣新增平臺(tái)只需加一個(gè)實(shí)現(xiàn)類零侵入現(xiàn)有代碼。最后分享一個(gè)小技巧釘釘待辦的title長(zhǎng)度限制是128字符但用戶常填超長(zhǎng)標(biāo)題。我們?cè)谕扑颓坝肧tringUtils.substring(title, 0, 125) ...截?cái)嗖⒃趀xt里存完整標(biāo)題。H5頁(yè)面加載時(shí)用完整標(biāo)題替換頁(yè)面標(biāo)題既滿足API限制又不丟失信息。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
影音先锋偷偷色男人站| 综合亚洲五月天| 久久永久网址| 色色色五月婷婷| 久久超级碰视频| 97色色色色色色色| 97色色色| 天天粽合合合合| 色区久久| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 色婷婷日本| 97人操| 无码任你操| 美女亚洲五月丁香| 五月天丁香婷婷社区| 9九色首页| 久热精品视频| 日本婷婷五月天| 性爱七区| 五月丁香激情综合久久| 熟女激情网| 色婷婷狠| 天天色天天爱天天舔| 97婷婷色| 亚洲综合丁香五月| 9999综合99综合人| 婷婷99中文字幕| 婷婷国产欧美97| 狠狠操狠狠操| 热99国产精品| 婷色天堂| 999久久久国产精品| av第一二区| 久狠狠狠| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | www.婷婷| 婷婷爱五月天人人爱| Caoporn公开| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 丁香色情五月天| 在线综合啪| 婷婷九月色| 播四月婷婷六月丁香| 激情综合啪啪啪| 91疯狂操操操操| 激情五月丁香五月| 久久这里都是精品| 五月婷精品| 婷婷五月中文在线视频| 禁片二区| 碰人人操| 91久久九久久九久久九久久九久久| 第五婷婷伊人丁香| 高清无码视频网址| 91色吧网| 天天揷综合网| 久re热视频| 欧美99| 少妇高潮呻吟A片免费看软件 | 久久久国产精品黄毛片| 91九色欧美| 五月婷婷激情综合在线| 婷婷五月a| 婷婷久久精品| 婷婷五月蜜桃成人桃色丁香| 色婷婷影| 免费一区二区三区| 五月天综合久久| 激情综合色五月丁香六月亚洲| 五月丁香婷婷啪啪综合| 亚洲V国产V欧美V久久久久久| 激情五月开心五月丁香五月| 丁香六月 婷婷六月| 亚洲视频在线网| 香蕉综合在线| 五月丁香六月婷婷综合网站| 婷婷深爱五月天在线| 亚洲免费av观看| www.激情| 这里只有精品2| 六月婷婷国产| 五月人人丁香婷婷五月人人丁香| 天天看A片| 久9久视频精品| 激情六月婷婷| 婷婷午夜精品久久久| 99视频在线播放大全| 91尤物九色在线| 91九色在线| 天天 青草 制服丝袜 在线| 这里只有精品偷拍| 丁香五月婷在线观看| 五月天综合激情网| 九九热AV| 丁香五月激情综合久久| 色五婷婷| AV 3P| 五月婷婷在线短视频| 超碰免费人人| 26UUU精品一区二区c〇m| 亚洲五月综合色播| 日本一级特黄大片AAAAA级| 亚洲99综合| 久久久激情| 99这里只有精品| 91919191919久久成人视频| 综合久久十三| 亚洲黄色影视| www激情五月天| 色婷婷亚洲婷婷| 激情综合婷婷| 国产在线网址1| 激情av在线| 五月丁香综合激情| 五月天婷婷人妻| 人人综合久| 久久婷婷视频| 婷婷激情四射网| 久久九九99| 夜夜嗨一区二区三区直播内容 | 99国产精品久久久久久久久久久| 在线超碰91| 熟女色专区| 99.色| 亚洲美女网Va| 国产亚洲精品久久久久久久久动漫| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 天天日综合| 久久婷婷五月| 日本理论久久| 婷婷色无码| 婷婷五月天伊人网| 九九视频在线观看视频6 | 影音先锋五月天婷婷丁香在线观看| 啪精品| 噜噜综合网| 狠狠色综合网站久久久久| 九月婷婷综合| 成人噜噜网| www。五月,com| 五月丁香婷婷成人网| 色婷婷久久| 99热这里有精力| 91精品国产91久久久久青草| 精品色色| 免费三级黄色| 色婷网站| 亚洲精品444久久久久久| 丁香花狠狠婷婷亚洲中文字幕| 性爱激情五月| 99色在线观看视频| 丁香九月综合| www婷婷色| 激情丁香五月天图片| 都市激情久久| 五月天激情电影| 色五月丁香婷婷| 激情五月婷婷| 丁香五月天导航| 99精品在线观看视频| 国产精产国品一二三在观看| 丁香九月婷婷| 碰碰女| 伊人激情综合| 色色色色网色色网色色| 婷婷视频在线| 五月婷婷高清| 超碰在线91| 怡红院91a√| 思思热99在线| 国产成人综合网| 先锋资源婷婷| 婷婷 伊人 久久| 丁香9月婷婷| 高清无码中文字幕aVDV| 婷婷五月天性色| 久久色五月天| 天天操综合网| 丁香桃色综合网| 日本啪啪网| 婷婷久久在线| 女人天堂AV| 操逼视频网址| 深爱婷婷网| 五月停停激情网| 成人av免费观看| 97操在线视频| 97操操| 久久五月天色婷婷| 丁香五月大香蕉| 99热在线观看免费中文| 激情av| 99精品视频在线免费观看| 99精品久久| 婷婷免费无马| 婷婷色导航| 色色五月婷婷久久| 夜夜爱网站| 日韩色色色色色| 五月天另类小说| 色欲婷婷五月天| 婷婷综合五月天| 六月丁香色色| www夜夜操| 超碰碰碰碰| 五月色丁香| 秋霞三级影视资源| 久草 tingting| www.丁香五月| 97人人搞| 九九综合色| 亚洲精品无码久久| 99色视频| www.com五月天| 超碰在线观看caop| 婷婷五月天开心网| 婷婷在线午夜| 丁香六月婷婷色播| 久久天天| 这里只有精品在线播放| 综合激情在线观看| 91超碰人人操| 激情五月狠狠| 婷婷色综合| 99性爱| 成人网丁香五月| 天堂在线观看视频| 久久久激情视频| 婷婷五月丁香基地在线视频官网| 人妻有码乱操| 思思热在线播放| 色~性~乱~伦~噜| 天天综合五月| 视频综合网| 一本色道久久88综合日韩精品| 丁香六月无码| 久久丁香| 婷婷五月丁香A∨| 日本三级日本三级99| wwxx日本| 98色花堂98t.R| 婷婷五月天影院| 天天色综网| 色婷婷香蕉| 91人久| 色婷婷亚洲婷婷在线观看| 久久久精品视频79| 综合久久综合五月天婷婷| 亚洲国产成人在线| 夜夜爽天操| 九九五月天| 色色色色色色色色网站| 99热免费精品热久久66| 丁香六月婷| 国产做A爰片毛片A片美国| 五月天婷婷影院影院观看| 色色自拍视频网站| 日本三级片片| 国产露脸150部国语对白| 天天日天天色| 开心婷婷五月中文字幕组| 九九色中文| 久久久久久18| 五月天激情色色| 六月丁香色色| 激情五月天视频| 四色综合网| 亚洲久艹| 91女人18毛片水多国产| 婷婷色婷婷| 久久亚洲无码| 99热这里只有精品中文字幕| 丁香五月在线看| anquye伊人| 天堂久久精品| 色色色婷| 人人九色| 91丨九色丨熟女|新版| 香蕉曰比| 亚洲xx在线| 大香蕉五月婷婷| 天天草比天天爽| 蜜乳A√| 99re这里只有精品9| 99自拍视频| 免费五月婷婷网| 丁香六月婷婷高清| 天天操夜夜夜拍拍拍| 人妻久热| 久久丁香五月婷婷| 香蕉乱插| 超碰在线观看9| 天堂五月婷婷| 日本久久精品18| 婷婷天堂综合网| 51精品国自产在线| 欧美婷婷色| 亚洲六月色| 伊人五月婷婷| 99色在线视频| www,天天干| 大香蕉久艹| 91se在线视频| 久久婷婷亚洲| 四川BBB搡BBB爽爽视频| 久777| 久婷狼色诱惑在线| 男人的天堂av俄罗斯热| 色五月婷婷青娱乐| 大香蕉伊人99| 成人五月天综合网| 欧美日韩大黄| 女人天堂 AV| 丁香六月婷婷综合在线| 丁香五月六月婷婷怡红院| 五月天成人在线| 严洲天天插| 人人操人av| 欧美爆乳一区二区三区| 99色| 成人在线99| 99热这里有精品| 另类激情综合| 五月丁香六月激情| 婷婷五月a| 九七色色六月丁香| 第1影院之五月婷婷| 亚洲色图日韩网址| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 久热一本| 情婷婷五月天在线| 丁香5月啪啪| 五月丁香六月花| 丁香五月天婷婷久久综合| 99精品无码网站| 婷婷色五月色妇| 操射国产日本| 色九九九九| 九九热精品| 91中文在线| 亚洲午夜AV| 五月天婷久久| 亚洲AV人人操| 热99热9| 亚洲婷婷欧美婷婷| 日本99视频| 偷拍九九热| 99亚洲精美视频在线观看| 五月婷婷深深的爱| 九九热这里只有国产精品| 美女五月天| 99久久99九九99九九九| 97色精品视频| 狠狠干综合| 天天久久综合| www.色99| 综久久久| 精品婷婷五月天| 亚洲日日操| 91久久久久久| 免费操超碰| 久久精品爱爱| 2025天天日爽| 91人在线观看| 激情av| 另类视频丁香五月| 中文字幕在线日亚州9| 综合色五月亭亭| 狠狠99| 五月婷婷熟女| 五月激情婷婷在线| 五月伊人婷婷999| 久久精彩综合视频| 色婷婷久久| 婷婷五月天AV| 婷婷WWW久久| 婷婷五月中文在线| 性生活视频98791| 免费在线观看AV网站| 欧美99视频| 午夜精品777| 天天操B| 九九色黄色| 六月丁香婷婷综合色播| 久久色五月| 99操不停| 人人视频色| 色五月亚洲| 超碰碰碰碰| 日韩精品一区二区亚洲AV观看 | 99啪啪视频| 丁香五月婷婷亚洲另类| 人妻精品久久久久久久| 国产毛片精品一区二区色欲黄A片| 91久久综合| 天堂草在线看www| 九九成人视频| 91avse| 婷婷开心久久| 色99久草在线| 亚洲九九在线| 日韩精品视频中文字幕| 伊人六月丁香婷婷| 国产精品久久久丁香五月八戒视频| 激情色色| 大香蕉五月天婷婷| 久久婷婷综合五月趴| 婷婷激情五月| 色五月丁香激情视频| 91成人看片| 丁香五月婷婷婷桃花影院| 色色日韩无码| av操逼网| 玖玖福利视频资源| 玖玖@三月天天丁香婷婷| 色综合久久综合中文综合网| 爆乳熟妇一区二区三区爆乳照片| 伊人大香蕉综合在线| 9这里只有精品| 天天操婷婷| 在线中文字幕av| 五月婷婷伊人久久| 99爱在线| 中文字幕不卡网站| 青996青| 97资源碰碰| 在线国产精品色| 全网最新网黄大秀直播高清,主播国产录屏在线| 亚洲成色综合网站免费观看| 婷婷六月色播| 欧美色九| 激情五月天婷婷| 97超碰,人人舔,人人操,人人摸 | 色婷婷香蕉丁丁网| 99久久网站| 操笔无码| 97狠狠色| 亭亭色天香| 精品人妻久久久久| 五月婷婷综合网| 欧美电影在线播放| 色原狠狠综合| 开心久久xxx色| 天天拍夜夜爽| 久久激情五月婷婷| 欧美精品XXXXBBBB| 国产综合81p| 久热99| 婷婷五月天激情综合深爱| 中文在线视频久1| 超碰免费99| 五月天婷婷久久| 久色大香蕉| 亚洲成人综合在线| 亚洲va欧美va国产综合久久久 | 丁香五月婷婷啪啪啪| 久久99热这里只有精品23| 日日爽天天| 日韩久久色| 99精品国产在热久久| 国产亚洲av片| 亚洲性图一区二区三区| 丁香婷五月天开心六月| 国产日韩精品SUV| 久久婷中文字幕| 开心五月天私房婷婷| 热99只有里视频| 五月丁香六月婷综合成人综合| 久久久国产精品黄毛片| 婷婷五月综合久久中文字幕| 99er6热在线观看精品6| 襙逼网| 五月天丁香综合久久国产| 99精品在线观看| 99色久| 久久五月丁香激情综合| 51XX午夜影福利| 99久久婷婷国产综合精品电影| 大香蕉九操| 天天综合影院| 亚洲妇女熟BBW| 天天操天天曰天天射| 五月丁香六月婷婷不卡免费无码| 丁香婷婷性爱| 婷婷久久图片| 色射婷婷五月天| 久热免费| 99九九热在线观看| 天天爽天天摸天天爱| 成人无码髙潮喷水A片| 中文字幕av在线播放| 五月天婷婷成人资源站| 婷婷五月激情综合| 亚洲欧美婷婷五月色综合| 天天操综合网站| 亚洲综合在线视频| 啪啪啪综合网| 在线看片av| 亚洲视频1区| 丁香五月婷婷亚洲另类| 丁香色婷婷| 超碰在线免费9| 丁香五月激情鲁| 噼里啪啦在线观看免费完整版视频 | 这里只有精品视频在线| 91精品综合久久久久久五月丁香| 天天综合五月天| av一区二区电影免费在线观看| 激情99。| 可以看的av| 成片免费观看视频大全| 成人在线不卡| 99人妻碰碰碰久久久久视| 亚洲小视频| 久草热8精品视频在线观看| 婷婷丁香五月天哟啪| 亚洲AV网址| 在线99精品| 五月激情久久综合网| 婷婷五月天天| 男女久久婷婷五月天| 国产精品18久久久| 色色网站观看| a久久| 丁香五月六月久久综合| 激情五月激情综合网| 五月天激情图片| 超碰免费99| 99WWW免费视频| 六月丁香网| 9色免费网| 激情五月婷婷丁香综合网| 亚洲六月色| 这里只有免费的精品| 91 影音先锋| 99热精品一区| 任我干视频在线观看| 五月五丁香婷婷| 久久人妻超碰一区| av性爱在线| 亚洲av综合在线| 五月天激情啪啪| 九色1区视频在线| 涩涩涩五月天| 色噜噜狠狠色综合成人网| 中文字幕精品在线观看| 婷婷在线免费| 日韩成人精品中文字幕| 另类国产综合| 久久久五月天婷婷| 人人摸人人澡人人| 色婷久久| 另类少妇人与禽zOZZ0性伦| 婷婷五月丁香在线观看| 日B日潘金莲BB| 丁香五月激情五月开心五月| 色欲久久久久久综合网综合网| 狠狠色五月| 99操碰| 色五月激情综合网| 色婷婷六月开心中文字| 色婷婷第四色| 欧洲亚洲免费视频9| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 草AV9999| 久久大香蕉伊人| 婷婷色啪| 五月停停直播| 国产欧美大香蕉一区| 六月激情综合| 99久久久国产大片| 91久女| 五月丁香六月激情综合| 99视频在线| 极品人妻VIDEOSSS人妻| 99热这里只有精品66| 五月婷婷|欧美| 97精品综合久久| 激情五月婷婷欧美极品| 99色在线视频观看| 99免费在线| 婷婷六月久久| 精品99视频| 色丁香久久| 伊人9999| 五月婷婷影院| 激情综合视频| 色综合色五月| 丁香五月丁香伊人| 91成人看片| 五月天激情国产综合婷婷婷 | 亚洲婷婷久久综合| 国产美女无遮挡裸体毛片A片| 婷婷六月激情综合| 久久这里只有精品5| 久久久精品免费啪啪国| 久久婷婷热| 狠狠干狠狠干狠狠干狠狠干| 五月天婷婷操逼视频| 国自产拍偷拍精品啪啪一区二区 | 国产精品久久..4399| 欧美三级巜人妻互换| 99精品国产在热久久婷婷| 热无码A∨| 亚洲av成人电影在线观看| 天天爽夜夜操| 欧美五月婷婷| 激情综合网,五月| 亚洲婷婷激情综合激情999精品| 99热欧美| 玖玖午夜视频| 久久激情五月网| 色情五月婷婷| 久久香蕉婷婷| 天天色天天操天天射| 91丨九色丨熟女|新版| 日日操日日干| 五月天色色色| 激情 婷婷| 色噜噜丁香| 97人人射| www.狠狠| 久久九九蜜| 国产噜一噜天天噜| 色情婷婷。| 日本91在线播放| www.婷婷五月| 97超碰在线免费观看| 激情综合色婷婷啪啪六月天| 激情五月天综合网站网站网站| 99精品视频推荐| 精品人妻一区二区三区在| 九九99精品视频在线观看| 久久精品只有这| 丁香六月高清视频| 日本a片网址| 欧洲S级在线观看| 九月婷婷人人操人人舔人人爱| 婷婷91| 狠狠色噜噜狠狠狠狠综合| 欧美美美女性色视频| 丁香五月激情六月| 色五月婷婷天天干| 激情九月婷婷| 九热...av| 丁香久久九九99| 九九九激情网| 亚洲成人AV高清字幕| 综合网亚洲| 91碰| 26.uuu丁香五月婷婷| 91色情播放| 久99久热只有精品国产99| 天天色·欧美| 少妇丁香婷婷| 99热在线爱| 99热国产精品| 色婷婷九月| 婷婷午夜激情| 性视频久久| 激情综合网激情五月天| 五月丁香少妇| 九九热精品99| 亚卅毛片| 中文字幕,综合,91| 哇嘎成人久久| 激情图片久久| 婷婷五月丁香色综合| 久久天堂色| 丁香社92视频| 欧美日韩国产一区二区| 91性人人| 亚洲人妻Av| 久久99精品久久久久久噜噜| 色综合大香蕉| 九九综合九九| 色狠狠五月天| 久久九九免费大视频| 丁香六月色婷婷欧美| 丁香婷婷久久| 99成人网站| 精品婷婷五月天| 精品无码人妻一区| 九月婷婷丁香| 欧美精品熟女一区二区| 天天婷婷| 操操自拍| 久久国产色| 色色色欧美| 被强行糟蹋的女人A片| 99热个人在线| 伊人超碰在线| 人人操女人| 五月激情啪啪啪| 丁香九月综合| 丁香六月爱综合| 色综合天天天天做夜夜| 色播五月天激情| 原琪琪色影院| 婷婷五月天小说| 99精品偷自拍| 青青草99re| 久9热视频| 婷婷五月丁香五月| 性爱电影科技贸易有限公司| www.久久av.com| 中文字幕激情综合| 五月丁香啪啪网| 国产日产亚系列精品版优势| 精品视频网| 91色操| 99久久99热| 开心五月婷| 欧美色婷婷| 婷婷丁香五月综合| 成人无码髙潮喷水A片| Av免费网站在线| 五月婷婷天堂| 天天摸,天天爽| 99免费视频网| 婷婷色导航| 国内一级片| 在线观看亚洲AV| 免费视频舔| 337午夜福利| 丁香激情久久| 亚洲精品第一色色色色色色| 成人在线日韩欧美| 99热热九九| 色五月婷婷丁香五月| 99久久网站| 极品精品一区二区三区在线| 五月天婷婷爱| 六月丁香婷婷天堂| 久色激情| 亚洲乱码日产精品BD| 538任你爽视频不一样的| 这里只有精品偷拍| 淑女丝袜bi操逼123| 丁香色五月天| 亚洲欧洲一二| 色五月成人婷婷| 丁香六月婷婷色XXXXX| 玖玖婷婷五月天| 97操碰日本女人| 这里有精品99| 99热97| 精品成人无码A片观看香草视频| 百度4399有码精品V在线观看| 亚洲天堂亚洲色色色| 色五月av| 国产成人综合亚洲| 九九性视频| 久久开心五月天激情| 激情五月天丁香| 婷婷五月天久久综合88| 婷婷五月天激情综合深爱| 欧美人人操| 亚洲成人丁香花| 久久婷婷五月国产激情综合片| 婷香五月激情视频| 中文字幕无码AV| 91狠狠综合久久久| 色五月天电影| 淫五月停停| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 婷婷五月天小说| www.9797国产| 这里只精品热在线18| 天天综合精品| 超碰com| 夜夜夜夜撸夜夜操| 国产视频色色色色色色色| 99热日本| 色爱99| 美女爆乳18禁www久久久久久| 秋霞学生妹一二级| 97人人射| 五月婷婷综合久久| 人人干av| 九九久久色| 久久机热这里只有 | 俺也去色| 色丁香五月天射婷婷爱婷婷| 激情久久久久久久久久久| 亚州第一黄网| 色99综合视频| 国产乱子轮XXX农村| 丁香九月激情| 婷婷99狠狠躁天天躁中| 天堂网色婷婷| 亚洲情a| 亚洲精品久久久久久久久久吃药| 欧美情月伍月天| 日韩欧洲亚洲| 生活片五区| 九色无码| www久久久久| 激情五婷网| 天天射天天操天天干| 26uuu国产精品| 天天射影院| 性色播| 涩涩五月天| 激情综合网五月在线播放| 超碰色综合| 五月丁香六月婷婷成人| 蜜桃人妻无码AV天堂三区| 青青草Avb在线| 天天爽天天爽视频| 日本久久极品| 激情五月天激情五月天| 大鸡巴伊人网| 99在线精品在线视频| 色综啪啪| 综合激情站| 91热手机在线| 久久五月天综合| 99玖玖人人| 精品久热69| 伊人久久大香线蕉av一区| 婷婷五月激情的图片| 综合性爱网| 久久婷婷91| 丁香六月婷婷综合激情欧美| 91精品无码| 色色操| 99综合网| 天堂五月婷婷| 六月婷综合| 五月丁香六月婷婷久久| 久久香蕉婷婷| 国产在线黄色| 中文网AV| 日韩一区二区A片免费观看| 久久性爱网站| 超碰在线资源| 国产激情在线| 五月丁香| 777影视理论片大全在线观看| 丁香五月丁香伊人| 97超碰99热99| 9l视频自拍9l九色9l成人| 91精品婷婷国产综合久久| 中文字幕 中文字幕明步| 色婷丁香五月| 久久性综合| AV操操操| 久久色情| 色五月情| 色五月婷婷综合| 91色噜噜狠狠狠狠色综合| 婷婷丁香18| 久久精品小视频| 激情五月婷婷色色| 97影院一级片| 激情婷婷五六月天| 无语停婷丁香网| 婷婷五月色综合| 狠狠艹狠狠艹| 日本熟女啪啪| 五月丁香激情婷婷| 这里只有精品热| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 婷婷激情五月天激情| 婷婷丁香九月| 久久久国产精品黄毛片| 五月开心激情| 婷婷五月丁香综合亚洲 | 五月天激情综合网站| 五月激香蕉网| 美女激情综合| 色综合色欲综合天天免费| 日韩三级视频一区二区| 大香蕉久久| 五月丁香婷庭在线| 久久性操| 九九热123| 14色综合婷婷| 丁香五月激情六月综合| 日韩国产在线免费观看| 日韩成人综合网| 日日操夜夜骑| 五月丁香婷婷网网网网| 激情网色五月| 久久久久婷婷| 综合在线色婷婷| 五月天激日本色情在线| 婷婷综合偷拍| 欧美成人精品A片免费一区99| 丁香五月婷婷日本| 婷婷欧美色| 91xxxx九色| 激情婷婷| 久超超碰| 婷婷五月天另类网站| 97操在线视频| 99视频综合网| 色五月首页| 日91高清无玛| 综合色色婷婷| 天天插天天玩天天干| 丁香社92视频| 国产日韩精品SUV| 五月婷婷激情性爱| 天天做天天爱天天玩夜夜爽| 丁香无月在线观看| 五月丁香最新| 免费无码毛片一区二区A片| 色色色视频免费无码| 97国产精品女人碰碰| 亚洲婷婷五月天| www.91操| 很很干天天干| 天天干肏夜夜| 婷婷五月激情的图片| 99碰视频| 五月丁香久久激情综合| 99热综合| 91Chinese在线| 天天爱综合网| 狠狠久综合| 亚洲色色色色色| 日韩色色一区| 丁香五月停停av| 最近中文字幕在线中文视频| 亚洲AV日韩无码| 色色网站在线| 五月婷婷插一插| 人妻狠狠操| 九热精品| 深夜婷婷 丁香| 九九99久久| 内射综合网| 亚洲色情网站| 99视频精品全部免费观看| 天天舔天天插天天爱| 色在线99| 无码一级片| 影音先锋91在线资源站| av大香蕉| 欧美成人精品A片免费一区99| 四月婷婷五月丁香| 亚洲视频图片婷婷五月| 99热日本| 婷久看人爽| 欧美丁香婷婷天天操| 91色色色18| www.久久爱.c n| 丁香六月婷婷久久亚洲天堂| 国产又色又爽又黄又免费| 亚洲高清在线| 91精品婷婷国产综合久久| 夜色综合网| 久久a热| 丁香婷婷色五月合集| 很操日本7| www.狠狠操.co m| 五月丁香网视频| 超碰99在线观看| www.五月婷婷.com| 五月丁香啪啪综合网| 婷婷九月狠狠色| 98色丁香五月婷婷综合网| 亚洲123区高清入口| 久久婷婷五月天激情新地址| 成人做爰A片免费看视频| 99国产精品久久久久久久久久久| 九九亚洲| www99热| 久9精品视频| 性视频久久| 乱码操操| 婷婷丁香成人| 思思热视频| 四色永久成人网站| 99热最新| .精品久久久麻豆国产精品| 三男玩一女三A片| 这里只有精品久久| 国产成人精品一区二三区熟女在线| 五月天婷婷基地| 青草青草视频2免费观看| 国精产品一区一区三区免费视频| 成人无码精品1区2区3区免费看| 极品人妻VIDEOSSS人妻| 丁香五月激动深爱欧美| 国产精品久久久久久喷浆| 色综合激情图区| 四虎99热在线观看网站| 中文在线视频久9| 久久激情五月网| 久久98热re| 色色色激情| 高清激情av在线观看| 天天做天天干天天综合网 | 天花AV无码| 色噜噜五月丁香婷婷| 中文字幕综合| 九九精品网站| 久久网站观看免费欧洲国产 | 极品少妇XXXX精品少妇偷拍| 国产成人AV不卡| 亚洲天堂制| 婷婷综合九月| 色五月综合| 色婷婷五月天激情久久| 大狠狠在线| 久久色情综合免费网站| 成人网站免费在线播放| 99久久久99久久91熟女| 欧美丰满熟妇BBB久久久| 欧美A片在线视频免费观看| 欧美日韩精品一区二区三区钱| 97人人爱人人操| 九九色影视| 天干天天干天天天天天| 深爱婷婷丁香五月激情| 色香久久| 久久ww| 日韩精品在线观看9| 激情九九六月激情免费视频| 丁香五月天AV在线| 99视频精品全部免费观看| 激情综合网五月激情| AV在线免费播放| 强壮的公次次弄得我高潮A片日本 | 五月婷婷av在线| 91精品久久久久久久久久久久| 丁香六月婷婷综合激情欧美| 九九视频精品在线免费| 婷婷五月激情六月| 五月天久久婷婷| 婷婷五月天网| 婷婷久久在线| 丁香五月天堂网| 色色亚卅| 九九久久五月天| 五月激情综合网| 亚洲av成人电影在线观看| 丁香五月亚洲激情婷婷射| 色婷婷五月婷婷五月婷婷五月| 五月天成人综合| 丁香激情网| 一区操| 久久视这里只有精品| 99热日韩| 九九综合色| 久久密臀婷婷| 五月丁香亚洲校园欧美| 五月婷婷六月基地| 99久久网站| 五月婷婷黄网站大全| 99热碰碰热| 99成人免费视频| 五月丁香天堂网| 成人AV片播放| 美女天天艹人人爽| 思思久久精品| 99riAv1国产在线观看| 51精品国自产在线| 丁香五月综合婷婷| 开心五月婷婷在线| 五月丁香久久| 婷五月天| 超碰chaompinm| 精品A√| 69精品人人人人| 久久婷婷五| 密臀久久| 成人丁香五月| 热婷婷久| 久久婷婷五月草视频在线播放| 99只有精品| 丁香五月天堂婷婷| 91丨九色丨国产打屁股| 五月丁香成人视频| 国产99久久久国产精品免费看| 激情五月天啪啪| 开心五月深爱婷婷| 色婷婷丁香A片区毛片区女人区| 国产亚洲99久久| 九九精品在线网| 成人做爰A片免费看视频| 92国产福利| 综合一本道| 影音先锋91网站在线观看| 五月天激情图片| 九九视频在线| 果冻传媒A片一二三区| 5月色亭亭视频| 99九色视频在线观看| 国产探花一片区| 99色看| 伊人久久婷婷| 婷婷激情综合网| 看全色黄大色大片| 色婷婷av综合网| 婷婷五月丁香色情| 99综合视频一体| 色六月婷婷| 超碰网站在线观看| 欧美69色| 99re在线观看视频| 久激情网| 色色五月天丁香婷婷| 久热免费| 婷婷丁香六月天激情四射网| 襙比视频| 白人荫道BBWBBB大荫道| 天天久久66xxx| 婷婷的99视频网站| 五月天三级久久| 色播五月天激情| 日韩AV免费| 99热的无码| 香蕉婷婷五月| 婷婷色香六月综合激情| 色情丁香五月天| 色一情一乱一乱一区91Av| 天天爽免费视频| 狠狠色中色| 另类图片婷婷五月天| 亚洲精品一区中文字幕乱码| Xx色综合| 99久久网站| 67194国产| 97人人超| 九九热这里只有精品5| 婷婷综合激情| 久久东京热婷婷五月| Av九九| 丁香婷婷综合激情五月色| 亚洲免费婷婷| 98色丁香五月婷婷综合网| 开心五月网| 久久六月综合| 丁香六月婷婷综合缴| 激情丁香久久久久久| AA丁香综合激情| 九月婷婷综合网| 成人免费在线电影| 综合99久久天天综合| 色五月婷婷五月天| 性色av大香综合| 亚洲综合视频在线| 婷婷五月综合在线| 婷婷五月色情天| 日韩欧美五月丁综合| 色婷婷久久| 国产99精品免费视频| 8090在线影视少妇| 99热九九在线| 婷婷激情五月天激情小说| 五月天,激情四射,婷婷频道| 久久码久久无清| enecarbon-materials.com污K127封锁请涟系@wip1688 | 猫咪伊人久久| 大香蕉人妻| 97五月天| 丁香六月成人网| 久久久久九九九九视屏小说88| 这里只有精品69| 丁香五月天亚洲综合| 久久久人妻| 成人午夜无码视频| 99热免费| 伊人丁香花综合影院| 东北熟女视频99| 亚洲AV网站在线观看| 久久亚洲婷婷| 欧美激情性做爰免费视频| 99在线国| 丁香婷婷综合影院| 可以免费观看的av| 大香蕉五月丁香| 激情又色又爽又黄的A片| 五月婷婷色吧!| 碰碰操91| 激情婷婷丁香| 5月丁香六月婷婷| 91操在线观看| 五月天综合网| 亚洲 五月 婷婷 成人| 婷婷丁香五月91| 四色五月婷婷| 五月丁香色婷| 91视频五月丁香| 久久久五月天| 色狠狠色狠狠| 久久大香蕉同僚| 午夜少妇在线观看视频| 中文在线视频久1| 思思99久久| 日本熟妇乱妇熟色A片蜜桃| 亚洲五月花| 69精品人人人人| 成人无码髙潮喷水A片| 激情五月丁香亭亭| 怡红院 久久| 99这里有精品视频| 六月丁香VA| 久久这里这里有精品免费视频| 99婷五月| 丁香蜜臀黄色婷婷五月天| 国产欧美日韩一区二区三区| 91久久免费| 亚洲1区| 五月天婷婷影院影院观看| 一区色色色色网| 韩国97天堂| 九九热精品| 色女伊人| 激情六| 婷婷性爱视频在线| 九九热精品视频在线观看| 五月婷婷五月天激情网| 狠狠色丁香五月婷巨| 热久久婷婷| JAPANRCEP老熟妇乱子伦视频| 丁香五月亚综合图片| 丁香五月婷婷激情小说| 天天综合色99| 综合五月婷婷| 国产精品人人妻人人爽| 五月天丁香啪啪综合| 综合九九久久| 五月天电影网| 久久最新色| 97色婷婷五月天| 欧美日韩成人| 九九色天堂| 婷婷91视频| 538任你爽| 婷婷色情六月| 99高级会所久久| 欧美色99| 五月丁香另类网| 五月丁香成人网| 久碰婷婷视频| 深爱五月婷| 做爱夜夜干天天操| 丁香五月色网| 伊人天堂婷婷| 欧洲色| 五月婷婷久久综合| 无码色色| 婷色成人| www.99热| 一起草无码| 激情综合色婷婷啪啪五月天| 色婷婷综合网| 91操片| 色婷婷五月天激情在线观看| 亚洲精品99| 99久精品视频| 91窝窝| 五月伊人91| 国产毛片精品一区二区色欲黄A片 极品人妻VIDEOSSS人妻 | 色播五月丁香| 亚洲va在线∨a天堂va欧美va| www.五月婷婷久久.com| 激情com| 无码九九| 国产综合婷婷|