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

ARTICLE DETAIL

資訊詳情

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

基于Java與Netty構(gòu)建高可靠機房動環(huán)監(jiān)控系統(tǒng):從架構(gòu)設(shè)計到實戰(zhàn)避坑

基于Java與Netty構(gòu)建高可靠機房動環(huán)監(jiān)控系統(tǒng):從架構(gòu)設(shè)計到實戰(zhàn)避坑 簡介本資源是一套基于Java開發(fā)的機房動力環(huán)境檢測系統(tǒng)完整源碼面向高校計算機專業(yè)學(xué)生、Java初中級開發(fā)者及機房運維工程師解決信息化場景下對供電、溫濕度、空調(diào)、消防、漏水等關(guān)鍵動環(huán)參數(shù)實時監(jiān)控與異常報警的實際需求。壓縮包共66個文件含56個Java核心源文件實現(xiàn)數(shù)據(jù)采集、處理、告警與交互、2個Kotlin腳本用于輔助功能或輕量任務(wù)、1個YAML與1個XML配置文件支撐系統(tǒng)可配置性與擴展性、1個logback.xml日志配置、1個JAR可執(zhí)行包、1個Gradle構(gòu)建腳本及Windows批處理部署腳本等整體僅218KB結(jié)構(gòu)緊湊、開箱即用。目前已有527人學(xué)習下載。讀者可直接導(dǎo)入IDE運行掌握典型工業(yè)監(jiān)控類系統(tǒng)的分層架構(gòu)設(shè)計、多協(xié)議設(shè)備接入模擬、配置驅(qū)動開發(fā)模式及Gradle自動化構(gòu)建實踐代碼注釋清晰目錄遵循標準Maven/Gradle布局便于二次開發(fā)與教學(xué)演示。1. 項目緣起從一次深夜告警說起幾年前我還在負責一個中型互聯(lián)網(wǎng)公司的運維工作。某個周五的凌晨兩點手機突然被一連串的短信和電話轟炸——核心機房的溫濕度傳感器集體離線緊接著一臺核心業(yè)務(wù)服務(wù)器的風扇轉(zhuǎn)速告警。團隊在睡夢中被驚醒手忙腳亂地遠程登錄、檢查日志、聯(lián)系IDC值班人員。折騰了近一個小時最后發(fā)現(xiàn)只是機房空調(diào)的某個區(qū)域控制器因為固件bug假死導(dǎo)致局部溫度升高觸發(fā)了風扇告警而傳感器離線則是網(wǎng)絡(luò)交換機的一個端口短暫閃斷。雖然是有驚無險但整個過程暴露了我們運維體系的巨大盲區(qū)對機房物理環(huán)境的監(jiān)控嚴重依賴第三方動環(huán)廠商封閉的硬件和笨重的上位機軟件數(shù)據(jù)不透明、告警不精準、歷史追溯困難更別提與我們自己的運維平臺如Zabbix、Prometheus進行深度集成和自動化聯(lián)動了。那次事件后我們下定決心要打造一套屬于自己的、輕量、靈活、可深度定制的機房動力環(huán)境監(jiān)控系統(tǒng)。核心要求就幾點第一數(shù)據(jù)采集要準能兼容市面上常見的智能電表、溫濕度傳感器、漏水感應(yīng)繩等設(shè)備第二告警要快且智能能區(qū)分偶發(fā)抖動和真實故障第三系統(tǒng)要穩(wěn)不能自己成為故障點第四也是最重要的源碼要完全掌握在自己手里能夠根據(jù)業(yè)務(wù)需求隨時進行二次開發(fā)和深度集成。這就是“基于Java語言的機房動環(huán)檢測系統(tǒng)”這個項目最原始的驅(qū)動力。它不是學(xué)院派的課程設(shè)計而是從真實的運維痛點里長出來的實戰(zhàn)工具。今天我就把這個項目的設(shè)計思路、核心源碼實現(xiàn)以及踩過的那些“坑”毫無保留地分享出來。無論你是一個想深入了解工業(yè)數(shù)據(jù)采集的Java開發(fā)者還是一個苦于現(xiàn)有動環(huán)系統(tǒng)不夠靈活的運維工程師這篇文章都能給你提供一套從零到一的可落地方案。我們會繞過那些大而全的商業(yè)套件聚焦于如何用最經(jīng)典的Java技術(shù)棧Spring Boot, Netty, MyBatis構(gòu)建一個高可靠、易擴展的動環(huán)數(shù)據(jù)中樞。2. 核心架構(gòu)設(shè)計分層解耦與數(shù)據(jù)流在動手寫代碼之前花時間在架構(gòu)設(shè)計上是絕對值得的。一個糟糕的架構(gòu)會讓后續(xù)的擴展和維護變成噩夢。我們的核心設(shè)計思想是“采集與處理分離數(shù)據(jù)與告警分流”。2.1 總體技術(shù)棧選型與考量為什么是Java在物聯(lián)網(wǎng)和嵌入式領(lǐng)域Python和Go似乎更受青睞。但考慮到我們團隊的技術(shù)棧以Java為主且系統(tǒng)對穩(wěn)定性、多線程并發(fā)處理能力以及后期與企業(yè)內(nèi)部其他Java系統(tǒng)如OA、CMDB集成的便利性要求很高Java生態(tài)的成熟度特別是Spring生態(tài)就成了決定性優(yōu)勢。具體技術(shù)選型如下后端框架Spring Boot 2.7。沒什么好說的快速構(gòu)建Restful API和后臺任務(wù)的標準選擇其自動配置和starter機制能極大提升開發(fā)效率。數(shù)據(jù)采集層Netty。這是關(guān)鍵動環(huán)設(shè)備通信協(xié)議五花八門Modbus RTU/TCP, SNMP, 自定義TCP等且多為長連接或短連接請求-響應(yīng)模式。Netty作為高性能的NIO框架完美勝任協(xié)議解析、連接管理、斷線重連等臟活累活比直接用Java Socket或HttpClient要穩(wěn)健得多。數(shù)據(jù)持久化MySQL MyBatis-Plus。關(guān)系型數(shù)據(jù)庫適合存儲設(shè)備元數(shù)據(jù)、配置信息以及最終聚合后的監(jiān)控數(shù)據(jù)如每分鐘的平均溫度。對于超高頻的原始采樣數(shù)據(jù)如每秒的電量我們后期引入了時序數(shù)據(jù)庫InfluxDB但在項目初期MySQL足夠支撐。緩存Redis。兩個核心用途1) 作為實時數(shù)據(jù)看板的緩存避免前端頻繁查詢數(shù)據(jù)庫2) 存儲設(shè)備最新的狀態(tài)和讀數(shù)用于快速的告警判斷。消息中間件RabbitMQ。用于實現(xiàn)核心的“數(shù)據(jù)與告警分流”。采集到的原始數(shù)據(jù)經(jīng)過初步清洗后會同時發(fā)送到兩個隊列一個用于持久化存儲data.persist一個用于實時告警分析data.alert。這樣即使告警分析模塊暫時阻塞或升級也不會影響數(shù)據(jù)的落盤。前端Vue 2 Element UI??紤]到快速開發(fā)和美觀選擇了成熟的Vue和Element組合用于展示機房平面圖、設(shè)備實時狀態(tài)、歷史曲線和告警列表。這個技術(shù)棧看起來不新潮但貴在穩(wěn)定、可控、社區(qū)資源豐富每一個組件都有大量生產(chǎn)環(huán)境驗證能有效降低項目風險。2.2 四層架構(gòu)詳解我們將系統(tǒng)清晰地劃分為四個層次每一層職責單一通過明確的接口進行通信。第一層設(shè)備接入層 (Device Access Layer)這一層由基于Netty實現(xiàn)的協(xié)議適配器組成。每個主流的協(xié)議如Modbus TCP, SNMP V2c都會實現(xiàn)一個獨立的ProtocolAdapter。它的核心職責是連接管理維護與物理設(shè)備或網(wǎng)關(guān)的TCP連接實現(xiàn)心跳?;睢嗑€自動重連。協(xié)議解析將設(shè)備的二進制或特定格式的響應(yīng)報文解析成結(jié)構(gòu)化的Java對象如ModbusHoldingRegister。數(shù)據(jù)封裝將解析后的數(shù)據(jù)封裝成統(tǒng)一的內(nèi)部數(shù)據(jù)模型DeviceData包含設(shè)備ID、點位地址、數(shù)據(jù)值、時間戳、數(shù)據(jù)質(zhì)量正常、超時、解析錯誤等字段。// 簡化的統(tǒng)一數(shù)據(jù)模型示例 Data public class DeviceData { private String deviceId; // 設(shè)備唯一標識如“A列空調(diào)-1” private String pointAddress; // 點位地址如“40001”Modbus寄存器地址 private DataType dataType; // 數(shù)據(jù)類型ANALOG模擬量如溫度、DIGITAL數(shù)字量如開關(guān)狀態(tài) private Double value; // 數(shù)值對于狀態(tài)量可能是0/1 private Long timestamp; // 采集時間戳 private DataQuality quality; // 數(shù)據(jù)質(zhì)量GOOD, TIMEOUT, PARSE_ERROR private MapString, String tags; // 擴展標簽如機房、機柜位置 }第二層數(shù)據(jù)處理層 (Data Processing Layer)這一層接收來自接入層的DeviceData流。它像一個流水線包含多個處理器DataProcessor數(shù)據(jù)清洗器過濾掉質(zhì)量標識為TIMEOUT或PARSE_ERROR的無效數(shù)據(jù)對跳變異常的數(shù)據(jù)進行平滑處理例如1秒內(nèi)溫度變化超過10度視為傳感器異常予以丟棄或標記。單位轉(zhuǎn)換器將原始值轉(zhuǎn)換為業(yè)務(wù)值。例如Modbus采集的寄存器值可能是0-65535對應(yīng)溫度-20~80度這里就需要進行線性換算業(yè)務(wù)值 (原始值 / 65535) * 100 - 20。數(shù)據(jù)分發(fā)器這是核心。清洗轉(zhuǎn)換后的數(shù)據(jù)會被復(fù)制兩份分別投遞到RabbitMQ的data.persist和data.alert隊列。這里使用fanout交換器可以輕松實現(xiàn)一對多廣播未來增加新的消費者如實時大屏模塊也非常方便。第三層數(shù)據(jù)存儲與告警層 (Storage Alert Layer)這一層是異步的由消息隊列的消費者驅(qū)動。存儲消費者從data.persist隊列消費數(shù)據(jù)進行聚合后批量插入MySQL。我們不會存儲每秒的原始數(shù)據(jù)而是每分鐘計算一次平均值、最大值、最小值存入metric_history表。原始高頻數(shù)據(jù)如需存儲會寫入InfluxDB。告警消費者從data.alert隊列消費數(shù)據(jù)加載該設(shè)備點位的告警規(guī)則如溫度 28度持續(xù)5分鐘UPS負載率 85%進行實時判斷。告警引擎需要支持豐富的規(guī)則條件閾值、持續(xù)時間、變化率等。觸發(fā)告警后會生成告警事件存入數(shù)據(jù)庫并通過配置的渠道釘釘、短信、郵件通知相關(guān)人員。第四層應(yīng)用接口層 (Application Interface Layer)基于Spring Boot提供的RESTful API為前端提供數(shù)據(jù)查詢、設(shè)備管理、告警配置、歷史曲線查詢等服務(wù)。同時這一層也提供一些管理功能如動態(tài)加載新的協(xié)議適配器、手動觸發(fā)設(shè)備采集任務(wù)等。通過這樣的分層設(shè)計系統(tǒng)各模塊之間耦合度極低。例如你想更換數(shù)據(jù)庫從MySQL到PostgreSQL只需修改存儲消費者的實現(xiàn)想增加一個MQTT協(xié)議接入只需實現(xiàn)一個新的ProtocolAdapter并在配置中啟用即可完全不影響其他模塊。3. 核心源碼實現(xiàn)Netty協(xié)議適配器與數(shù)據(jù)流轉(zhuǎn)理論講完了我們來看最硬核的部分代碼如何落地。這里重點剖析兩個最核心的模塊Netty協(xié)議適配器和基于消息隊列的數(shù)據(jù)流轉(zhuǎn)。3.1 基于Netty的Modbus TCP采集器實現(xiàn)我們以最常用的Modbus TCP協(xié)議為例。目標是實現(xiàn)一個穩(wěn)定、支持多設(shè)備并發(fā)采集的客戶端。第一步設(shè)計連接管理器我們不能為每一個采集點都創(chuàng)建一個長連接那樣資源消耗太大。通常一個Modbus TCP網(wǎng)關(guān)會下掛多個傳感器。因此我們設(shè)計一個ModbusTcpClient類每個網(wǎng)關(guān)對應(yīng)一個客戶端實例內(nèi)部維護一個Netty的Channel。Component Slf4j public class ModbusTcpClient { private EventLoopGroup group; private Bootstrap bootstrap; private Channel channel; private String gatewayIp; private int gatewayPort; private volatile boolean connected false; // 初始化Bootstrap PostConstruct public void init() { group new NioEventLoopGroup(); bootstrap new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true) .option(ChannelOption.SO_KEEPALIVE, true) .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .handler(new ChannelInitializerSocketChannel() { Override protected void initChannel(SocketChannel ch) { ch.pipeline().addLast( new ModbusTcpDecoder(), // 自定義解碼器 new ModbusTcpEncoder(), // 自定義編碼器 new ModbusClientHandler() // 業(yè)務(wù)處理器 ); } }); } // 連接網(wǎng)關(guān) public synchronized void connect(String ip, int port) { if (connected) { return; } this.gatewayIp ip; this.gatewayPort port; try { ChannelFuture future bootstrap.connect(ip, port).sync(); this.channel future.channel(); this.connected true; log.info(ModbusTCP Client connected to {}:{}, ip, port); // 監(jiān)聽連接關(guān)閉觸發(fā)重連 this.channel.closeFuture().addListener(f - { log.warn(Connection to {}:{} lost, attempting to reconnect..., ip, port); connected false; scheduleReconnect(); }); } catch (Exception e) { log.error(Failed to connect to {}:{}, ip, port, e); scheduleReconnect(); } } private void scheduleReconnect() { group.schedule(() - connect(gatewayIp, gatewayPort), 10, TimeUnit.SECONDS); } // 發(fā)送讀取寄存器請求 public CompletableFutureModbusResponse readHoldingRegisters(int slaveId, int startAddr, int quantity) { if (!connected || channel null) { return CompletableFuture.failedFuture(new IllegalStateException(Channel not connected)); } ModbusRequest request new ModbusRequest(slaveId, FunctionCode.READ_HOLDING_REGISTERS, startAddr, quantity); CompletableFutureModbusResponse future new CompletableFuture(); // 將Future暫存在Handler中收到響應(yīng)后完成它 RequestPendingCenter.add(request.getTransactionId(), future); channel.writeAndFlush(request).addListener(f - { if (!f.isSuccess()) { RequestPendingCenter.remove(request.getTransactionId()); future.completeExceptionally(f.cause()); } }); // 設(shè)置超時 group.schedule(() - { if (!future.isDone()) { RequestPendingCenter.remove(request.getTransactionId()); future.completeExceptionally(new TimeoutException(Read holding registers timeout)); } }, 5, TimeUnit.SECONDS); return future; } }關(guān)鍵點1自定義編解碼器Modbus TCP有自己的協(xié)議幀格式MBAP頭PDU。我們需要實現(xiàn)MessageToMessageDecoder和MessageToMessageEncoder來處理。public class ModbusTcpDecoder extends MessageToMessageDecoderByteBuf { Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, ListObject out) { if (in.readableBytes() 6) { // MBAP頭至少6字節(jié) return; } in.markReaderIndex(); int transactionId in.readUnsignedShort(); int protocolId in.readUnsignedShort(); int length in.readUnsignedShort(); // 后續(xù)字節(jié)長度 int unitId in.readUnsignedByte(); if (in.readableBytes() length - 1) { // length包含Unit ID in.resetReaderIndex(); return; } // 讀取功能碼和數(shù)據(jù) byte functionCode in.readByte(); byte[] data new byte[length - 2]; // 減去Unit ID和Function Code in.readBytes(data); ModbusResponse response new ModbusResponse(transactionId, unitId, functionCode, data); out.add(response); } }關(guān)鍵點2請求-響應(yīng)的異步匹配Netty是異步的發(fā)送請求和接收響應(yīng)在不同的線程。我們設(shè)計了一個簡單的RequestPendingCenter用事務(wù)IDtransactionId作為Key將發(fā)送請求時創(chuàng)建的CompletableFuture暫存起來。當解碼器收到響應(yīng)時根據(jù)響應(yīng)中的事務(wù)ID找到對應(yīng)的Future并完成它。public class RequestPendingCenter { private static final ConcurrentHashMapInteger, CompletableFutureModbusResponse PENDING_MAP new ConcurrentHashMap(); public static void add(Integer transactionId, CompletableFutureModbusResponse future) { PENDING_MAP.put(transactionId, future); } public static void remove(Integer transactionId) { PENDING_MAP.remove(transactionId); } public static void complete(Integer transactionId, ModbusResponse response) { CompletableFutureModbusResponse future PENDING_MAP.remove(transactionId); if (future ! null) { future.complete(response); } } }關(guān)鍵點3采集任務(wù)調(diào)度有了客戶端我們還需要一個調(diào)度器來定時執(zhí)行采集任務(wù)。這里我們使用Spring的Scheduled注解配合一個線程池避免任務(wù)堆積。Service Slf4j public class DataCollectionScheduler { Autowired private ModbusTcpClient modbusClient; Autowired private DevicePointService pointService; // 獲取需要采集的點位配置 Autowired private DataProcessingPipeline pipeline; // 數(shù)據(jù)處理管道 private final ScheduledExecutorService executor Executors.newScheduledThreadPool(10); Scheduled(fixedDelay 5000) // 每5秒調(diào)度一次實際采集頻率由任務(wù)自身控制 public void scheduleCollection() { ListDevicePoint points pointService.getActivePoints(); for (DevicePoint point : points) { // 判斷是否到達該點位的采集周期 if (shouldCollect(point)) { executor.submit(() - collectData(point)); } } } private void collectData(DevicePoint point) { try { CompletableFutureModbusResponse future modbusClient.readHoldingRegisters( point.getSlaveId(), point.getStartAddress(), point.getQuantity() ); future.thenAccept(response - { if (response.isError()) { log.error(Device {} point {} read error: {}, point.getDeviceId(), point.getAddress(), response.getErrorCode()); // 生成一個質(zhì)量位為ERROR的DeviceData pipeline.process(DeviceData.error(point)); } else { // 解析響應(yīng)數(shù)據(jù)進行單位轉(zhuǎn)換等 Double rawValue parseResponse(response, point); Double businessValue convertToBusinessValue(rawValue, point); DeviceData data DeviceData.success(point, businessValue); // 送入處理管道 pipeline.process(data); } }).exceptionally(ex - { log.error(Collection failed for point {}: {}, point.getAddress(), ex.getMessage()); pipeline.process(DeviceData.error(point)); return null; }); } catch (Exception e) { log.error(Submit collection task failed for point {}, point.getAddress(), e); } } }3.2 基于RabbitMQ的數(shù)據(jù)與告警分流數(shù)據(jù)處理管道DataProcessingPipeline的最終步驟是分發(fā)。這是系統(tǒng)高內(nèi)聚低耦合的關(guān)鍵。Component public class DataDispatcher { Autowired private RabbitTemplate rabbitTemplate; public void dispatch(DeviceData data) { // 1. 發(fā)送至持久化隊列 rabbitTemplate.convertAndSend(amq.fanout, data.persist, data); // 使用fanout交換器路由鍵可忽略 // 2. 發(fā)送至告警分析隊列 rabbitTemplate.convertAndSend(amq.fanout, data.alert, data); log.debug(Dispatched data for device {}, point {}, data.getDeviceId(), data.getPointAddress()); } }存儲消費者示例Component Slf4j public class DataPersistenceConsumer { RabbitListener(queues queue.data.persist) public void handleMessage(DeviceData data) { // 這里可以進行分鐘級聚合 // 假設(shè)我們有一個聚合緩存器 Aggregator aggregator.add(data); // Aggregator內(nèi)部會每分鐘將聚合結(jié)果平均值、最大值等批量寫入MySQL } }告警消費者示例Component Slf4j public class AlertAnalysisConsumer { Autowired private AlertRuleService ruleService; Autowired private AlertService alertService; RabbitListener(queues queue.data.alert, concurrency 3) // 啟動3個并發(fā)消費者 public void handleMessage(DeviceData data) { if (!DataQuality.GOOD.equals(data.getQuality())) { return; // 非正常數(shù)據(jù)不觸發(fā)告警 } ListAlertRule rules ruleService.getRulesByPoint(data.getDeviceId(), data.getPointAddress()); for (AlertRule rule : rules) { if (rule.evaluate(data)) { // 評估規(guī)則如判斷閾值、持續(xù)時間 AlertEvent event new AlertEvent(rule, data); alertService.saveAndNotify(event); // 保存告警事件并發(fā)送通知 } } } }這種設(shè)計的好處是顯而易見的。某天存儲數(shù)據(jù)庫需要維護我們可以臨時關(guān)閉存儲消費者告警功能完全不受影響。同樣告警分析邏輯需要重構(gòu)升級也可以獨立部署新版本消費者與舊版本并行運行一段時間實現(xiàn)平滑升級。4. 實戰(zhàn)避坑指南穩(wěn)定性與性能調(diào)優(yōu)紙上得來終覺淺絕知此事要躬行。這套系統(tǒng)在線上穩(wěn)定運行了幾年期間踩過的坑數(shù)不勝數(shù)。我挑幾個最有代表性的分享給你希望能幫你繞過這些彎路。4.1 網(wǎng)絡(luò)抖動與設(shè)備無響應(yīng)處理工業(yè)網(wǎng)絡(luò)環(huán)境遠比辦公室復(fù)雜。交換機重啟、電磁干擾、設(shè)備死機都會導(dǎo)致采集失敗。粗暴的超時和重試可能會讓系統(tǒng)雪崩???同步阻塞導(dǎo)致的線程池耗盡早期我們使用同步的HttpClient調(diào)用設(shè)備API并設(shè)置了一個全局的固定大小線程池。某個設(shè)備故障無響應(yīng)會導(dǎo)致調(diào)用線程被長時間阻塞最終線程池耗盡整個采集服務(wù)癱瘓。解決方案為每個設(shè)備或設(shè)備組設(shè)置獨立的連接和超時。在Netty客戶端中我們通過ChannelOption.CONNECT_TIMEOUT_MILLIS控制連接超時通過CompletableFuture的scheduled任務(wù)控制請求超時。采用異步非阻塞模型。正如我們上面用Netty和CompletableFuture實現(xiàn)的一個線程可以管理成百上千個連接的IO操作資源利用率極高。實現(xiàn)熔斷機制。為每個設(shè)備端點引入一個簡單的熔斷器如基于失敗率的CircuitBreaker。連續(xù)失敗N次后熔斷器打開短時間內(nèi)不再嘗試采集該設(shè)備直接返回失敗并標記設(shè)備狀態(tài)為“離線”。每隔一段時間進入“半開”狀態(tài)嘗試一次成功則關(guān)閉熔斷器。這能有效防止反復(fù)重試拖垮系統(tǒng)。// 簡化的熔斷器實現(xiàn) public class SimpleCircuitBreaker { private final int failureThreshold; private final long resetTimeout; private int failureCount 0; private long lastFailureTime 0; private State state State.CLOSED; enum State { CLOSED, OPEN, HALF_OPEN } public boolean allowRequest() { if (state State.OPEN) { if (System.currentTimeMillis() - lastFailureTime resetTimeout) { state State.HALF_OPEN; // 進入半開狀態(tài)嘗試放行一個請求 return true; } return false; } return true; // CLOSED 或 HALF_OPEN 狀態(tài)允許請求 } public void recordSuccess() { failureCount 0; state State.CLOSED; } public void recordFailure() { failureCount; lastFailureTime System.currentTimeMillis(); if (state State.HALF_OPEN) { state State.OPEN; // 半開狀態(tài)下失敗再次打開 } else if (failureCount failureThreshold) { state State.OPEN; // 失敗次數(shù)達到閾值打開熔斷 } } }坑2設(shè)備響應(yīng)緩慢導(dǎo)致的隊列堆積即使采用了異步如果大量設(shè)備響應(yīng)極慢返回的CompletableFuture也會在內(nèi)存中堆積最終可能導(dǎo)致OOM。解決方案嚴格控制每個設(shè)備的采集超時時間。根據(jù)設(shè)備類型設(shè)置不同的超時如UPS可設(shè)3秒精密空調(diào)可設(shè)5秒。限制并發(fā)采集的任務(wù)數(shù)。使用有界隊列的線程池ThreadPoolExecutor當排隊任務(wù)過多時采取拒絕策略如丟棄最老的任務(wù)并記錄日志保證系統(tǒng)不會崩潰。監(jiān)控關(guān)鍵指標。監(jiān)控JVM內(nèi)存、線程池活躍線程數(shù)、任務(wù)隊列大小。一旦發(fā)現(xiàn)隊列持續(xù)增長立即告警可能是某個網(wǎng)段出現(xiàn)網(wǎng)絡(luò)故障或設(shè)備集體異常。4.2 數(shù)據(jù)一致性告警防抖與狀態(tài)恢復(fù)動環(huán)告警最怕“狼來了”。傳感器偶爾的誤報一個尖峰脈沖如果直接觸發(fā)告警會把運維人員搞得疲憊不堪。坑3瞬時抖動觸發(fā)誤告警溫度傳感器因為干擾突然上報一個35度的值閾值28度下一秒又恢復(fù)正常。如果不處理就會產(chǎn)生一條短暫的、無效的告警。解決方案持續(xù)時間判斷。這是告警引擎必須具備的核心功能。我們不在收到單個超標數(shù)據(jù)點時立即告警而是啟動一個“持續(xù)時間計時器”。只有當超標狀態(tài)持續(xù)了預(yù)設(shè)的時間如5分鐘才真正觸發(fā)告警。在實現(xiàn)上我們?yōu)槊總€監(jiān)控點位在Redis中維護一個狀態(tài)鍵記錄其連續(xù)超標次數(shù)或起始時間。// 在AlertRule.evaluate方法中實現(xiàn)持續(xù)時間判斷 public boolean evaluate(DeviceData data) { if (data.getValue() this.threshold) { String key alert:duration: this.ruleId : data.getDeviceId() : data.getPointAddress(); // 獲取或遞增連續(xù)超標次數(shù) Long exceedCount redisTemplate.opsForValue().increment(key); redisTemplate.expire(key, Duration.ofMinutes(10)); // 設(shè)置過期時間防止垃圾數(shù)據(jù)堆積 if (exceedCount ! null exceedCount this.durationThreshold) { // durationThreshold 如 5 (分鐘) // 觸發(fā)告警 return true; } } else { // 數(shù)據(jù)恢復(fù)正常清除連續(xù)計數(shù) redisTemplate.delete(key); } return false; }坑4告警恢復(fù)通知遺漏告警觸發(fā)了后來設(shè)備恢復(fù)正常了系統(tǒng)卻“忘記”通知了。運維人員可能一直以為問題還在。解決方案實現(xiàn)告警自動恢復(fù)機制。當告警觸發(fā)時除了生成“告警開始”事件還要在后臺啟動一個監(jiān)控任務(wù)持續(xù)檢查該點位的狀態(tài)。一旦發(fā)現(xiàn)數(shù)據(jù)恢復(fù)到正常范圍并持續(xù)一段時間例如2分鐘就自動生成一條“告警恢復(fù)”事件并發(fā)送恢復(fù)通知。這樣能形成完整的告警閉環(huán)。4.3 性能與擴展性數(shù)據(jù)庫設(shè)計與查詢優(yōu)化隨著監(jiān)控點位數(shù)量的增加從幾百到上萬數(shù)據(jù)存儲和查詢的壓力會急劇上升???MySQL單表數(shù)據(jù)量爆炸歷史查詢緩慢每分鐘一條記錄10000個點位一天就是1440萬條。幾個月后單表數(shù)據(jù)量巨大按時間范圍查詢上周的溫度曲線會非常慢。解決方案分庫分表/分區(qū)最直接的方法是對metric_history表按時間進行分區(qū)如按月分區(qū)或者按機房進行分表。這能大幅提升按時間范圍查詢的效率。引入時序數(shù)據(jù)庫對于需要高頻存儲和復(fù)雜聚合查詢的場景如每秒采集的電流數(shù)據(jù)需要查詢毫秒級波動MySQL力不從心。我們后期引入了InfluxDB。它的數(shù)據(jù)模型Measurement, Tag, Field, Time天生為時序數(shù)據(jù)設(shè)計壓縮率高針對時間范圍的聚合查詢性能是MySQL的數(shù)十倍。架構(gòu)演變?yōu)樵几哳l數(shù)據(jù) - InfluxDB分鐘級聚合數(shù)據(jù)、設(shè)備元數(shù)據(jù)、告警事件 - MySQL。前端數(shù)據(jù)采樣在查詢長時間段如一年的歷史曲線時不可能把幾百萬個點都返回給前端圖表。需要在后端或數(shù)據(jù)庫層進行降采樣Downsampling。例如查詢一年的數(shù)據(jù)可以按小時或按天返回最大值、最小值、平均值。InfluxDB內(nèi)置了強大的GROUP BY time()語法來實現(xiàn)這個功能???實時數(shù)據(jù)看板頻繁查詢數(shù)據(jù)庫前端大屏每5秒刷新一次如果每次都去查數(shù)據(jù)庫會給數(shù)據(jù)庫造成巨大壓力。解決方案利用Redis緩存實時數(shù)據(jù)。在數(shù)據(jù)處理層每當一個點位的清洗轉(zhuǎn)換完成除了發(fā)往消息隊列也同時更新到Redis的一個Hash結(jié)構(gòu)中。Key可以是realtime:device:{deviceId}Field是點位地址Value是最新的數(shù)據(jù)值和時間戳。前端查詢實時數(shù)據(jù)接口時后端直接從Redis讀取性能極高。// 在DataProcessingPipeline中更新Redis緩存 public void process(DeviceData data) { // ... 清洗轉(zhuǎn)換 ... // 分發(fā)到MQ dispatcher.dispatch(data); // 更新Redis緩存 String key realtime:device: data.getDeviceId(); String field data.getPointAddress(); String value data.getValue() , data.getTimestamp(); redisTemplate.opsForHash().put(key, field, value); redisTemplate.expire(key, Duration.ofMinutes(5)); // 設(shè)置過期防止僵尸設(shè)備數(shù)據(jù)永駐 }5. 從設(shè)計到部署一個完整的配置示例最后我們來看一個從設(shè)備配置到前端展示的完整鏈路讓你對整套系統(tǒng)的運作有個直觀的感受。假設(shè)我們要監(jiān)控“IDC-01”機房“A列”的“精密空調(diào)-1”的回風溫度。第一步在管理后臺配置設(shè)備與點位創(chuàng)建設(shè)備設(shè)備IDAC-01-01名稱精密空調(diào)-1協(xié)議Modbus TCPIP192.168.1.100端口502。創(chuàng)建監(jiān)控點位點位地址40001對應(yīng)Modbus寄存器地址名稱回風溫度數(shù)據(jù)類型ANALOG從機ID1。配置數(shù)據(jù)轉(zhuǎn)換原始值范圍0-65535對應(yīng)工程值范圍-20.0-80.0攝氏度。配置告警規(guī)則規(guī)則名稱AC-01-01溫度過高條件值 26.0持續(xù)時間300秒5分鐘告警級別嚴重通知渠道釘釘運維群。第二步系統(tǒng)自動采集與處理調(diào)度器觸發(fā)AC-01-01的采集任務(wù)。ModbusTcpClient向192.168.1.100:502發(fā)送請求[事務(wù)ID][協(xié)議ID][長度][單元ID1][功能碼03][起始地址40000][寄存器數(shù)量1]。設(shè)備返回響應(yīng)[事務(wù)ID][協(xié)議ID][長度][單元ID1][功能碼03][字節(jié)數(shù)2][數(shù)據(jù) 0x1388]0x1388十進制為5000。解碼器解析響應(yīng)RequestPendingCenter完成對應(yīng)的Future。采集任務(wù)收到值5000根據(jù)轉(zhuǎn)換公式計算(5000 / 65535) * 100 - 20 ≈ 56.12度顯然不對這里就體現(xiàn)了數(shù)據(jù)清洗的重要性。我們的清洗器會判斷這個值從之前的20多度跳到56度屬于異常跳變將其標記為INVALID并丟棄同時可能觸發(fā)一條“傳感器數(shù)據(jù)異?!钡脑O(shè)備告警而不是溫度告警。假設(shè)下一分鐘采集到值0x0CE43300計算得30.04度數(shù)據(jù)質(zhì)量GOOD。生成DeviceData對象。數(shù)據(jù)進入處理管道經(jīng)過清洗通過、單位轉(zhuǎn)換30.04被分發(fā)器投遞到RabbitMQ。存儲消費者收到數(shù)據(jù)更新聚合器。告警消費者收到數(shù)據(jù)檢查規(guī)則發(fā)現(xiàn)30.04 26.0在Redis中為這個規(guī)則-點位組合的計數(shù)器1。第三步告警觸發(fā)與展示連續(xù)5分鐘溫度都超過26度Redis中的計數(shù)器達到5。告警引擎觸發(fā)創(chuàng)建一條告警事件存入MySQL狀態(tài)為FIRING。AlertService調(diào)用DingTalkNotifier向預(yù)設(shè)的釘釘群發(fā)送消息“【嚴重告警】機房IDC-01設(shè)備精密空調(diào)-1回風溫度當前30.04℃超過閾值26.0℃持續(xù)時間5分鐘?!鼻岸隧撁嫱ㄟ^WebSocket或定時輪詢API收到新告警通知在告警列表高亮顯示。運維人員看到告警前往機房檢查發(fā)現(xiàn)空調(diào)設(shè)定溫度被人誤調(diào)高。調(diào)整后溫度開始下降。下一分鐘采集值25.5度告警引擎檢查規(guī)則條件不滿足清除Redis中的計數(shù)器并檢查是否存在對應(yīng)的FIRING狀態(tài)告警事件。如果存在則將其狀態(tài)更新為RESOLVED并發(fā)送恢復(fù)通知“【告警恢復(fù)】機房IDC-01設(shè)備精密空調(diào)-1回風溫度已恢復(fù)正常25.5℃。”前端告警列表狀態(tài)更新歷史告警頁面可以查詢到這次完整的告警事件流。整個流程從數(shù)據(jù)采集、處理、判斷到通知完全自動化形成了閉環(huán)。這套系統(tǒng)將運維人員從繁瑣的、被動的“消防員”角色中解放出來轉(zhuǎn)變?yōu)橹鲃拥摹邦A(yù)警員”和“分析師”。它不僅僅是一套代碼更是一套提升運維體系韌性和效率的方法論。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩av一区二区在线/日产精品久久久| 久久久jd| 丁香色五月 97干| 久久机热探花| 五月婷婷黄色| 丁香五月激情综合啪啪| 中文字幕五月久久婷| 久热只有精品| 男人天堂亚洲综合| 婷婷丁香五月基地| 色播五月婷婷| www,婷婷| 亚洲性受XXXX五月丁香| txt五月激情四射网综合俺也来了| 激情综合网址| 思思热久久久在线| 欧美噜一噜| 婷婷五月天丁香综合网| 开心深爱激情网| WWW.99热| 精品人妻在线| 九九激情网| AA片在线观看视频在线播放| 五月丁香花视频| 婷婷五月丁香基地在线视频官网| 九一牛视频探花| 99re免费精品视频| 91一起艹| 丁香五月成人网| 99婷婷五月天| 色婷精品91| 国产精品a无线| 婷婷五月无码| 五月成人丁香av91| 综合色图区| 波多野结衣AV无码Porn| 久久伊人9| 激情深爱五月| 色人妻五月| 乱女乱妇熟女熟妇综合网站 | 六月激情婷婷| 欧美综合激情丁香五月六月婷| 最新av在线观看| 丁香五月婷婷av影院| 久热免费| 五月丁香婷婷基地| 伊人婷婷五月天| 婷婷婷婷色| 色播五月婷婷综合| 五月综合色| 精品九九久久| 丁香婷婷综合影院| 九月婷婷激情| 67194国产| 99人碰碰碰| 97操碰日本女人| www.狠狠操| 久热这里只有| 99热婷婷| 中文字幕日产A片在线看| 久久精品性爱| 超碰婷婷五月| 婷婷伊人綜合中文| 97香蕉久久超级碰碰高清版 | 亚洲色就是色色色| 最近中文字幕大全免费版在线 | 99视频只有精品| 91精品久久久久久综合五月天| 97香蕉久久超级碰碰高清版| 99啪啪| 久色| 丁香五月六月| 欧美成综合在线观看| 九九色黄色| 玖玖激情网| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 五月婷婷很很色| 碰久久精品w| 婷婷综合在线网| 六月丁香天堂| 天天色综合色| 日本va欧美va欧美va| 丁香激情五月少妇| 婷婷综合五月| 婷婷色影音天| 99色精品| 亚洲色小说在线综合| 五月丁香激情五月天| 五月丁香六月婷婷综合伊人| 99热这里只有精品18| 久久色这里只有精品| 婷婷久久综| 激情四射婷婷| 色婷婷久久| 一本色道久久88综合日韩精品| 无码激情AAAAA片-区区| 久久久久98| 狠狠操.com| 婷婷丁香五月精品| 涩综合网| 五月天久久激情| 婷婷丁香九月| 噜噜色com| 五月激情站| 网站免费一站二站| h亚洲| 91九色国产| 狠狠大香婷婷爱| 狠狠色狠狠色综合日日91| 五月天激情视频| 色色色地址| 国外亚洲成AV人片在线观看| 国产亚洲色婷婷久久99精品91| 婷婷五月开心中文字幕在线| 99热66| WWW.久久久久久久久久久久久| 亚洲成人免费在线| 夜夜骑天天玩天天日| 亚洲成人五月天| 五月丁香婷婷综合视频| 日韩性爱无码| 色婷婷婷婷| 99热新网址| 国产精品黑丝| 五月花在线观看视频| 五月丁香偷拍| 一起肏在线视频| 婷婷五月天丁香花| 黄色片区子| 色婷婷香蕉丁丁网| 激情六月天婷婷| 一本色道久久88综合日韩精品| 日韩 中文 欧美| 伊人六月丁香婷婷| www.99视频| 丁香五月婷婷色偷偷| 久久网站免费亚洲| 99ri国产| www.sebowuyue| 久久成人精品视频| 31色区视频免费看| 色播激情婷婷| 色色丁香五月婷婷| 草草色情综合网| 天堂婷婷五月在线| 97久久人人| 日本毛片内射| 久久9视频欧美| 91嫩草久久| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 毛片色五月| 亚洲黄色网址| 欧美激情综合色综合色| 777米奇影视第四色| 婷婷色色色| www.丁香黄色五月天人与| 婷色五月| 丁香五月六月婷婷怡红院| BBWCUCKOLD精品熟妇| 性婷婷| 亚洲激情综| 热久久色| 综合网亚洲| 五月丁香成人网| 色爱亚洲| 六月婷婷网站| 久久精品一区二区三区四区| 亚洲第精品| 成人国产欧美大片一区| 中文AV网| www久久五月com| 中文字幕人妻熟女在线| 综合激情视频| 69精品人人人人| 天天插天天插天天插天天插| 九九热区一区二区三区| 五月婷婷导航| 激情五月丁香五月| 丁香五月天激情免费在线观看AV777| 亚洲天堂青草| 99亚州综合精品成人网| 99er这里只有精品| 综合五月激情| 婷婷深爱五月天| 色情五月丁香婷婷网| 亚洲精品久久久无码| 99久久婷婷五月天| 色婷婷情片| 99精品国产热久久91色欲| 久热99| 最近中文字幕大全免费版在线| 五月丁香伊人网| 99色免费在线观看| 99噜噜| 久久er免费视频| 欧类av怡春院| 六月婷婷av| 九月婷婷综合八月丁香在线观看| 激情五月婷婷色综合| 久久这里只有国产视频| 六月丁香久久| 狠狠狠狠青草| 亚洲日本韩国| 婷婷开心激情| 天堂久久婷婷| 激情综合五月婷婷六月丁香| 亚洲精品视频在线播放| 99久久99综合| 五月天婷婷久久视频| 丁香五月欧美色综合| 亚洲AV电影美洲AV电影| 9久热精品在线视频| 丁香六月综合激情| 激情欧美五月丁香| 五月丁香激情综合六月涩涩爱| 日本一级淫| 丁香婷婷色九月| 狠狠干狠狠干狠狠干狠狠干| 亭亭丁香aV| 超碰在线资源| 婷婷狠狠综合网入口| 久久99精品视频| 激情小说之五月| AV中文字幕夜夜操b天天摸bb| 99re免费精品视频| 欧美成人日韩| 久久av电影| 综合久久高清| 五月天啪啪网| 中国操逼99| 中文av网站| 色在线99| 99热精品观看| 丰满人妻一区二区三区| 丁香五月婷中字幕| 日本五月天婷婷丁香| 国产Va视频| 色五月色五天色情网| 日本久碰| 日本9区视频| 丁香婷婷天堂| 狠狠干,狠狠操| 日本五月天网站| 五月婷婷影视| 性色99| 激情五月丁香激情综合网| 激情六月丁香综合| 狠狠色丁婷婷日日,伊人激情综合网| 九九久久99精品免费观看www| 91碰九色| 天天久综合网永久入口17v| 热热99爱爱| 爱狠射| 五月天丁香婷婷视频网址 | 亚洲黄色影视| 免费观看全黄做爰的视频| 91狠狠综合久久| 激情五月婷婷| 五月丁香六月情| 99在线视频播放| 五月丁香啪啪网| 99爱这里只有精品免费视频| 色色综合激情| 综合六月久久| 日韩成人无码| 狠狠色婷婷色| 殴美日韩成人| 在线99热| 中文字幕簧片| 五月婷婷真爱激情网| 十月色综合| 久久精热| 9久精品视频| 亚洲五月婷婷| 1024日韩| 国产AV一区二区三区日韩| 99这里都是精品| 亚洲精品99| 97色色婷婷| 内射爽无广熟女亚洲| 国外亚洲成AV人片在线观看| 狠狠久久婷| 黑人熟妇一区二区三区| 久久五月天大美女| 丁香五月婷在线观看| 人人爱国产| 五月天婷综合| 欧美成人猛片AAAAAAA| 婷婷在线五月综合| 99久热在线精品| 精品久色| 天天干天天色综合| 久久小视频| 9l视频自拍九色9l黑人| 丁香六月婷婷一区| 五月婷婷啪啪| 国产欧美日韩综合精品一区二区| 九九综舍久久| 欧洲亚洲欧洲99久久| 可以免费观看的AV| 综合另类视频| 91聚色综合网| 开心五月婷婷五月| 色婷婷五月天偷拍| 亚洲开心激情网| 五月婷婷六月丁香| 欧州色色| 香蕉AV777XXX色综合一区| 久久一品区| 激情五月天婷婷久久久久久久久久久| 久久这里有精品| 超碰99在线观看| www.韩日视频| 天天在线天天综合网色| 色九网| 九九色插| 婷婷色色综合激情| 四虎99热在线观看网站| 欧美色图片88| 91丨九色丨43老版熟女| 狠狠干无码| 午夜丁香| 九九九热精品| 日日操日日干| 99热超碰在线| 婷婷丁香视频在线观看免费| 国产精品视频| 97成人在线视频精品| 久久亚洲色导航| 婷婷色五月开心五月| 色色五月婷婷网| 激情五月天久久丁香| www.99热| 欧美色碰| 久热免费| 亚洲激情五月| 色久五月天| 九九热精品视频在线观看| 久久久久亚洲AV无码网影音先锋| 五月天天天色| 婷婷操无码| 五月婷婷五月丁香综合| 欧美性爱五月天| 99无码视频| 婷婷五月天网| 色情五月婷| 99热这里只有精品亚洲| 99精品网| 色9色| 影音先锋男人资源站一区二区| 五月天婷婷久久日| 91欧美| 丁香花婷婷五月天| 色五月婷婷一二| 人人操碰| 久久久无码精品成人A片小说| 青青操日本摸摸看看| 开心色播色五月婷婷| 老师的粉嫩小又紧水又多A片视频| 影音先锋色色色资源色资源色| 色五月综合激情| 欧美在线看| 欧洲一区二区| 99久久免费性爱视频`| 欧美97色| 色青青五月| 午夜69成人做爰视频| 99热九九这里只有精品10| 大香蕉五月天婷婷| 五月婷婷插一插| 婷婷六月激情综合| 激情五月婷黄版| AV无码免费| 超碰人人操在线| 亚欧州精品视频| 婷婷五月香蕉| 婷婷四月 成人 狠狠干| 丁香五月天AV在线| 亚洲成人网站在线播放| 五月婷婷开心深| 国产成人精品一区二区三区视频| 79色色色色| 九九热婷婷| 丁香美女主播视频在线观看| 成人资源在线| 国产超碰在线| 俺也高清无码高清视频| 人伦30P| 人人爱国产| 色插综合网| 超碰在线免费观看3 9| 人人摸人人摸| 91精品久久久久久| 久久黄色免费视频| se.久久视频在线观看| 色色五月天网站| 丁香五月网站| 影音先锋91男人资源在线播放| 成人一级片| 激情婷婷五六月天| 在线视频99| 婷婷久久综合| 婷婷五月色色| 开心五月婷婷激情网| 美女xx不卡| 婷婷色导航| 这里只有精品在线播放| 中美日韩成人在线| 亭亭丁香97| 99re在线精品视频| 日本成人噜噜| 久久这里在精品视频| 色吧99| 国产精品大香蕉| VA婷婷亚洲| 另类激情五月| 日本三级色| 精品无码久久久久久久久| 五月天婷婷在线观看| 九九RE视频在线精品| 婷婷字幕在线| 五月婷婷激情| 婷婷五月激情图片| 久久婷狠狠色| 久色欧美| 欧美丁香五月天| jiujiu热在线视频| 久热A片| 97人人射| 新97人人上人人| 亚洲成人黄色网| 色婷婷在线视频久| 九九视频网| 亚洲天堂啪啪| 色噜噜五月丁香婷婷| 丁香六月av| 停停五月色宗合| 偷拍丁香九月激情| 精品一二三区久久AAA片| 成人五月天视频| 色婷婷色五月色丁香| 久久性爱视频| 丁香色色网| 婷婷五月丁香香蕉| 天天色综| 六月婷婷啪啪| 五月天狠狠色| 国产视频福利| 五月丁香激情综合六月涩涩爱| 婷婷丁香中文字幕| 97日本在线播放| 天天天天干| 91干| 六月婷婷中文字幕| 99精品网| 精品无码久久久久久久久| 日韩成人综合网| 2020日日干| 日韩综合久| 五月天婷久精视频| 99这里只有精品| 亚亚州久久高潮| 丁香五月综合亚洲| www激情com| 99热这里只有免费| 丁香五月播播| 婷婷的色色五月天| 亚洲超碰在线| 91操人| 国产欧美日韩综合精品一区二区| 久草婷婷在线| av五月丁香| 蜜桃婷婷狠狠久久综合| 国産精品| 七七九九色色| 亚洲人人干| 五月天激情久色| 色五月综合婷婷| 五月婷婷丁香色吧网| 婷婷 月 丁香| 大香蕉婷婷久久| 丁香九月婷婷| 95精品区一区二| 亚洲岛国电影| 大香蕉久热| 亚洲成人综合在线| 思思w99| 99热亚洲精品| 狠狠狠狠狠狠狠狠| 激情美女五月天| sS丁香五月婷婷| 久色中文| 99色网站| 婷婷色情 | 婷婷五月综合基地| 色婷婷久久综合久色综| 五月天播播综合| 久热A| 丁香五月天婷婷激情| 丁香婷婷大香蕉| 亚洲无AV在线中文字幕| 婷婷色中文| 激情小说五月丁香在线视频观看视频| 天天天久久人人人合| 丁香色六月婷婷| 香蕉AV777XXX色综合一区| 欧美碰碰| 午夜性爱影视一区77| 久久六月综合| 人妻丰满精品一区二区A片| 五月丁香综合久久夜夜| 婷婷丁香77777| 国产精品久久7777777精品无码| 九月婷婷色色| 青吴乐视频| 久99热| 开心激情播播五月天| 亚洲旡码| 成人免费网站免费看| 丁香五月,开心五月,成人婷婷| 久久这里有精品在线观看| 五月丁香激情四射| 丁香九月激情在线视频| 色五月无码| 五月婷婷婷丁香播| 天天射天天操天天干| 国产成人网| 五月婷婷福利| 99精品成人无码A片观看金桔| 日本三级毛片| 久久九九在线视频| 婷婷五月天成人| 9999三级片| 思思热国产| 67194国产| 9精品在线| 亚洲精品国产精品乱码视99| 七七婷婷综合| 国产成人亚洲综合A∨婷婷| 亚洲黄色网址| 激情网 五月天| 超碰在线看| 男人的天堂97| 亚洲综合激情五月久久| 无码字幕中文| 久久人人人人妻| 亚洲精品久久久久久久久久吃药| 亚洲激情综合| 六月色色| 久热9| 欧美日本国产欧美日本韩国99| 9l视频自拍九色9l黑人| 99热久草| 日韩三级高清无码| 久久机热这里只有精品| 婷婷丁香91综合| 婷婷深爱五月天在线| 亚洲五月天婷婷| 亚洲愉拍99热成人精品| 五月婷婷久久综合| 97香蕉碰碰人妻国产欧美| 亚洲无码99| 大香蕉啪啪啪啪啪啪| 天天做天天摸| 视频久久9| 五月花免费视频| 69人人操人人爽| 逼里香不卡| 日本A片一区| 99愛国产| 久久精品噜噜噜成人A∨色欲| 丁香婷婷视频| 97婷婷在线| 欧美日韩成人在线网站| 激情五月天色网站| 欧洲色色| 五月天婷婷丁香视频| 综合久久丁丁香婷| 婷婷五月天欧美| 久久狠婷婷| 性生活视频98791| 97碰久久| 国产特级毛片AAAAAAA高清| 日日干日日s| 色婷网站| 日韩成人电影在线播放| 在线观看熟女少妇| 欧美69久成人做爰视频| 欧美婷婷精品激情| 婷婷99中文字幕| 久久狠狠干| 激情五月综合ì香亚洲| 婷婷五月综合免费在线| 大香蕉婷婷丁香天堂AV| 青青草搞屄视频网站| 99精品成人无码A片观看金桔| 亚州视频九九99| 99亚洲色| 综合亚洲AV| 337p大胆噜噜噜噜噜91Av| 高潮毛片遮挡费高一百度| 99精品视频在线观看| 色久激情在线| 亚洲综合婷婷五月| 六月成人网| 狠狠狠色激情综合适合| 包操45分钟网站| 中文字幕人妻一区二区| 九九香蕉网| 婷婷成人综合免费视频| 国产精品岛国片在线观看免费| 亚洲人妻av| 26UUU精品一区二区c〇m| 五月丁香久久丝袜啪啪| 免费视频WWW在线观看网站| 激情綜合W W W,激情五月天| 激情五月天啪啪视频| 99艹精品在线观看| 色狠狠综合| 婷婷五月天色| 成人婷婷桔色| 射区导航| 婷婷五月丁香第四色超碰在线| 丁香六月激情四射| www.五月丁香av| 九九99免费视频| 色域五月丁香| 亚洲综合色网| 亚洲无码播放| 激情五月色播五月| 五月丁香婷婷五月色| 99ri精品视频在线观看| 日韩爱操视频| 激情五月亚洲综合网| aaa久久| 91精选国| 日本精品久久久久中文字幕 | 色五月综合在线| www色婷婷久久综合久色| 97婷婷在线| 日本三级99人妇网站| 六月婷婷色综合| 色五月丁香伊人五月| 婷婷五月天另类视频| 激情六月丁香| 超碰99资源站| 九九视屏| 婷婷久久18| a免费在线| 欧美色综合天天久久综合精品 | 天堂婷婷五月在线| 久操干| 久色大香蕉| 这里只有精品96| 在线另类| 激情四射五月天| 99热在线观看精品| 日本99久久| 中文字幕,综合,91| 另类综合色| 这里只有免费精品| 五月深爱激情网| www激情网| 在线综合婷婷| 亚洲爱爱无码婷婷色五月| 亚洲日本激情| 天天草狠狠擦| 99 这里只有精品| 丁香六月亚洲| 五月天自拍视频| 五月婷色丁香| 五月天色婷婷基地| 洗浴中心操B视频| 丁香五月无码| 久久九九色| 激情六月天| 久久色五月| 99这里有精品视频| 五月婷婷之综合激情| 99性爱视频| 久久久天堂国产精品女人| 色婷婷影视| 国产精品久久久久9999小说| 婷婷色影音天| 国产性爱色| 五月婷婷日| 99操逼视频| 丁香五月婷婷亚洲色图| 婷婷五月丁香婷婷| 亚洲av骚货| 天天操中文字幕| 精品乱码久久久久| 精品夜夜澡人妻无码AV| 色婷婷狠狠禁久久| 玖玖在线| 欧美色播综合在线观看| 久热网在线视频| 午夜丁香婷婷| 啪啪啪大香蕉| 婷婷丁香五月综合网| 色约约视频一区二区三区四区五区| 99视频在线观看视频| 久久9视频欧美| 色情丁香五月天| 噜噜久| AAA久久| 思思久久99热只有频精品66| 怡红院成人AV| 99热只有精品综合| 久久在线人妻| 五月天久久婷婷| 99精品偷自拍| 97色色综合| 丁香五月另类小说在线阅读| 久久99热这里只有精品| 五月天com| 婷婷五月丁香性爱| 丁香婷婷久久| 婷婷五月丁香基地| 天天影院色| 亚洲国产成人AV在线| 亚洲综合婷婷| 亚艹艹| 狠狠穞A片一區二區三區| 久久婷五月影院| 少妇人妻人伦A片| 国产欧美熟妇另类久久久| 日韩三及成人AV片| 丁香六月视频| 99在线观看| 日本天堂网站99| 九玖视频这里只有精品| 婷婷丁香五月网| 99婷婷精品推荐在线视频| 九色七七| 五月天色婷婷激情| 午夜天堂一区人妻| 9999久久久久| 天天透天天爱| 婷婷五月久久| 9999热精品在线免费播放| 久re热视频| 五月天婷婷色综合| 五月丁香啪啪激情| 91成人性爱视频| 日91高清无玛| 桔色成人在线| 成人龟情网丁香五月| 久久99这里只有精品| 综合一区二区三区| 五月丁香久久婷| 91人妻视频| 五月丁香影院| 永久的网站AAAA| 色偷偷色婷婷| 久re热视频| 婷婷五月天欧美| 激情五月婷婷老师| 婷婷色日本| 天天操夜夜操| 久久婷婷激情五月天一区二区| 色色色色色色色色色色色色色97| 色综合久久无码| 丁香婷在线| 国产精品91抖高| 五月丁香 久久久| 91精品91久久久中77777| www.99色| 激情五月天综合网| 亚洲国产精品成人免费一区久久久在线观看AAAA | 亚洲六月色| 天天摸天天肏| 丁香五月性| 六月婷婷激情| 五月天色丁香| 日韩九九视频| 色五月丁香五月| 日韩无码一区二区三区四区| 99自拍视频在线| 色婷婷中文字母五月丁香| 亚洲天堂色色| 欧美激情 日韩无码 婷婷 五月天| 欧美色色色色色| 久热这里只有国产| 免费看欧美成人A片无码| 99re在线观看视频| AV在线不卡播放| 婷婷成人基地| 久久视频婷婷视频| 婷婷中合| 丁香婷婷五月| 99精品在线观看视频| 欧美日韩99| 婷婷六月丁香开心深深爱| 亚洲精品色| 日本在线噜噜| 无码色综合| 九九热中文| 狠狠操之狠狠操| 三级片AAA久久久AAA久久久AAA | 激情五月图| 久久久天堂国产精品女人| 五月丁香亚洲婷婷| 香蕉视频91| 人人摸人人| 日本在线噜噜| 91日韩在线| 婷婷五月丁香综合激情| 丁香伊人激情| 九月av在线| 天天天天操| 影音先锋按摩| a性生活久久无| z色五月播播久久| 久久五月婷| 麻豆AV一区二区三区| 精品A√| 91avse| 亚洲欧洲中文日韩久久AV乱码| 婷婷开心激情五月激情网| 99精品久久久久| 噜噜噜狠狠色综合| 狠狠xx| 五月天丁香六月综合| 色综合视频在线| 丁香九月综合激情| 男人综合网| 国产婷婷综合在线免费视频| 久操婷婷| 九九成人视频| 一区二区三区四区五区| 99er热精品视频| 天天拍天天操| 影音先锋91| 99热精品综合| 在线婷婷| 久久香视频| 婷婷在线视频| 无码色| 色视五月天婷婷| www.91九色| 97五月婷| 亚洲激情另类| www.五月丁香| 久久人妻在线| 五月婷婷六月丁| 婷婷色片| 亚洲狠9| 天天插天天插| 91久久精品无码一区二区三区| 伊人丁香婷婷东京| 丁香五月在线人妻| 五夜丁香| 丁香九色不卡aaa| 97碰碰碰免费公开在线视频| 色婷婷狠狠18禁| 狠狠插狠狠操| 五月丁香无码| 亚洲综合干| 五月婷婷六月丁香免费| 亚洲免费观看高清完整版AV线| 五月婷A V在线| 99精品在线| 五月天激情四射| 五月丁香六月色| 热99视频精品在线| 天天色亚洲| 98永久精品| 人妻久久久久久久 | 色五月丁香五月婷婷五月成人网 | 亚洲天堂婷婷丁香| 久热大香蕉| 五月婷色色| 日日干夜夜干| 天天爽天天干| 亚洲热视频| 思思热在线播放| 久久aaaa片一区二区| 这里只有精品99www| 天天综合色丁香| 久久久婷婷| 99久久婷婷国产综合| 久9精品视频| 97丁香五月| www.婷婷,com| 久久在线92| 偷拍九九五月丁香婷婷| 婷香狠狠爱五月| 丁香六月婷婷色XXXXX| 久草九一| 九月丁香婷婷网| 综合网精品99| 久久久噜噜噜操操操| 色五月噜噜| 婷婷综合久久综合| 成人 九九九九| 亚洲热久| 香蕉久久国产av一区二区| 大香蕉婷婷丁香| 99热国内精品| 五月丁香激情啪啪| 五月丁香婷婷福利| 97激情五月天| 婷婷六月天亚州| 亚洲五月天婷婷在线| 色综合激情| 亚洲婷婷欧美婷婷| 91丨九色丨高潮丰满日本| 99色色网| www.久久99| 狠狠五月婷婷| 99久久高清视频| 91九色中文字幕女在线观看| 97超碰综合| 5月婷婷6月丁香aV| 亚洲色婷婷视频| 九九热精品在线| 九九综合精品| 国产人妻人伦精品一区二区| 三年高清大片免费观看国语| 九月色婷婷综合亚洲| 亚洲XX网| 伊人五月天男人的天堂在线| 91视屏在线观看com.wwwvv| 天天操综合网站| 69色婷婷| 思思热在线视频精品| 免费碰碰视频久| 久久色五月天| 激情q青青草在线婷婷| 爱婷婷五月| WWW.桔色成人.COM| 五月天社区| 97碰91| 超碰91在线| 婷婷激情综合网| 婷婷的色色五月天| 欧美性做爰大片免费看办公室| 淫视馆av三区| 日韩成人综合网| 久久久五月婷婷| 国产 亚洲 在线| 影音先锋91在线资源站| 五月久久婷婷天堂视频| 六月激情婷婷色| 色久丁香五| 大学生高潮无套内谢视频| 色色色色色色色色色色色色色五月天| 婷婷五月色| 涩婷婷五月天| 五月婷婷影院| 综合五月丁香97| 五月婷婷久久激情| 日本色色网站| 1024亚洲无码| 中文字幕在线观看视频www| 狠色狠色综合久久| 婷婷五月天色| 久婷自拍视频| 涩涩五| www久久99| 久久色吧| 狠狠操天天日| 直接看的AV| 欧美日韩国产一区二区| 五月天影院婷婷在线观看| 丁香六月色婷婷| 9l视频自拍九色9l黑人| 丁香香五月激情免费视频| 五月婷婷五月天| 久草丁香婷婷1024| 另类的婷婷| 久久久香| 超碰97色| 蜜臀九九九九| 91久久久久久| 97人人干人人操| 99热只有| 亚洲精品另类| 天天操,天天插| 天天爱天天操| 中文无码婷婷| 97色永久免费视频| 婷婷激情四射五月天| 特级片神马电影| 欧美S码亚洲码精品M码| 亚洲综合网区| 99热9| 99热在线精品播放| 久久久无码精品成人A片小说| 黄色高清无码| AV大香蕉| 亚洲无码11| 五月丁香啪啪网| 五他月天啪啪啪| 人人摸人人干人人做| 丰满少妇乱A片无码| 精品九九在线观看| 婷婷色导航| eeuus五月婷| 激情第四色| 国产精品久久99| 亚洲天天| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 久久只有18视频| 色情网综合| 五月丁香婷爱在线| Caoub青青超碰| 亚洲色无码| 中文字幕av网站| 五月婷婷六月丁香综合| 热久久这里只有三级视频| 丁香五月在线看| 久久五月天精品视频| 国产婷婷五月天| 五月婷婷之综合激情在线| 五月丁香六月婷婷亚洲综合| 亚洲人成网站999综合| 久久成人人妻| 色色五月激情| 五月婷啪啪| 超碰人妻在线| 日韩成人精品中文字幕| 69午夜成人影片| 久操香蕉| 色五月婷婷在线| 任我肏| 国产成人网址| 久久99热精品a片在线观看| www.婷婷激情网.com| 青青草激情网| 色婷婷免费视频| 激情深爱五月天| 无码激情精品色婷婷久久久久| 色色婷婷综合| 亚洲精品永久久久久久| 翔田千里 50岁 无码| 婷婷五月天成人| 色婷丨日丨天丨综合久久| 色综合女人99| 99啪| 综合狠狠干| 9热久久在线| 九九99九九99| 色爱99| 丁香五月婷婷激情中文| 人人妻人人澡| 五月天激情小说电影| 狠狠狠狠草草| 久99久在线| 七七九九色色| 超碰五月婷婷五月天| 久久作爱| 热99re| 激情综合99| 国产亚洲精品AAAA片APP| 韩国天天婷婷| 他改变了拜占庭| 九九色插| 久久伊人五月天| 开心五月婷| 六月婷婷激情| 1024成人免费看| 午夜丁香| 婷婷干五月综合在线播放| 五月丁香免费视频| 韩国不卡AC视频| 亚洲综合网 665566| 激情 婷婷 丁香五月天| 伊人婷婷综合| 色婷婷很很丝袜| 婷婷久久久久| av网站中文| 久久激情网| 丁香五月ⅤA久久久| 天天干天天干天天干| 婷婷激情小说| 伊人成人宗合网| 婷婷色啪| #NAME?| 99色综合| 色色色婷婷五月天| 激情丁香六月| 丁香五月激情欧欧美| 中文精品在| 免费色婷婷| 丁香六月激情综合| www.五月天色色.com| 九九精品在线网| 涩涩五月天综合| 色五月婷婷操逼| 精品视频网| WWW.久久.COM| 亭亭五月丁香五月天激情| 五月天成人在线视频网站| 天天久久综合| eeuus五月婷| 日韩一级A片黄色| 国产操逼网站| 三日本无码| 无码激情AAAAA片-区区| 热99这就是精品视频| 色欲婷婷五月天丁香| 色人妻五月| 亚洲丁香五月深爱五月| www.婷婷五月天,com| 日本三久久| 免费成人中文字幕| 99久久婷婷国产综合精品电影| 99热亚洲| 99久久网站| 久久大香蕉| 色综合久久综合中文综合网| 色五婷婷在线视频| 五月丁香六月综合基地| 婷婷五月天美女视频| 白天AV月月| 五月丁香激情综合网官网| 夜夜骑操AV| 婷婷五月天视| 婷婷激情五月天激情在线| 婷婷色色网| 久久久18| 97在线精品| 99久久婷婷| 99色在线| 人人人操Av| 丁香六月婷婷综合激情欧美| 色婷婷狠狠| 噜噜噜噜噜久| 日本激情ⅩXX免费视频| 激情久久四色| www.av视频xx999.com| 婷婷五月天播| 翔田千里aV中文字幕| 免费日韩99| 啪啪婷婷五月天激情| 五月丁香婷婷成人伊人网| 色五月婷婷视频| www.五月激情红色| 丁香九月婷婷色| 激情五月小说婷婷| 久久98热re| 99ri视频| 99久久综合| 北条麻妃九九九国产精品视频| 99热香港| 五月五月婷婷| 色五月色图| 婷婷和五月天| 亚洲激情高潮| 五月丁香婷婷激激激综合网色播| www.激情五月天| 精品久久这里热66| 99re久久| 青草视频在线观看视频| 丁香花大香蕉婷婷综合| 九九热99在线视频| 操逼五月婷婷| 五月天狠狠草| 天天综合亚洲| 99热天堂| 婷婷激情六月| 97夫妻超碰| 亚洲无码激情| 99操中文视频| 狠狠色情婷婷| 99亚州综合精品成人网| 99九九热在线观看| 亚洲人妻av| 丁香五月欧美婷婷| 九九亚洲综合| 色天天综合色| 99热在线播放| 丁香五月综合| 操精品9| 一区二区乱码视频| 66久久视频在线| 99er精品视频| 丁香五月色| 五月丁香婷婷欧美色图视频五月丁香777电影 | 26uuu另类亚洲欧美日本一| 超碰国产AV| 99色热| 久久一级免费黄色片| 五月丁香六月香香蕉| 思思热在线精品视频网站| 91se在线观看| 夜夜穞天天穞狠狠穞AV美女按摩| 丁香五月婷婷亚洲天堂| 丁香五月激情综合| 99色免费视频| www.激情五月| 丁香六月婷婷开心婷婷网| 六月丁香视频网站| 色情综合网| 亚洲无码99| 五月花激情网| 开心四月婷婷在线色播播| 99热66| 懂色av粉嫩av蜜臀av| 久久网日本| 五月婷婷六月开心| 欧美99| 9人人操人人看| 久99热| 一级黄色影片| 大香蕉五月天婷婷丁香91| 我爱va亚洲va52| 激情五月天电影| HD久久精品视频| 婷婷五月天亚洲天堂| 人人97碰| 激情淫乱男女| 噜噜噜噜在线| 天天爽天天日| www.婷婷,com| 激情性五月天免费小说视频| 色情五月综合婷婷| 久操福利| 日韩aaa| 五月丁香婷婷色啪| 国产五月丁香在线| 丁香激情网| 色月丁| 九九在线这里只有精品视频| 亚洲精品久久久久久久久久吃药| 99啪| 激情五月天婷婷| 大香伊人婷婷影院| 婷婷日日天天| 国产毛片欧美毛片久久久| 五月香婷婷| 97热这里精品在线视频| 婷婷色基地在线看 | 91人人操人人| 久久一级片| 色狠狠色综合| 五月天婷婷综合色| 五月丁香直播| CHINESE熟女老女人HD视频| 婷婷综合欧美| 99精品在线播放| 任你日视频| 99毛片| 九热久| 婷久久| 91人人操人人| 婷婷五月丁香综合| 97操视频| 久久九九爽| 丁香大香蕉| 91色婷婷综合久久中文字幕二区| 操操自拍| 中文资源在线a | 五月丁香激情综合六月涩涩爱| 亚洲热综合| 色婷婷影| 激情丁香九九五月综合网| 久99在线视频| 97久久人人操| 玖玖在线视频福利| www.五月天婷婷| va中文资源在线观看| 少妇2做爰HD韩国电影| 九九爱看亚洲|