精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Apache Hertzbeat:開箱即用的實時監控系統

開發 開發工具
Apache HertzBeat (incubating) 是一個易用友好的開源實時監控告警系統,無需 Agent,高性能集群,兼容 Prometheus,提供強大的自定義監控和狀態頁構建能力。

一 系統介紹

1.1 介紹

1.2 特點

1.3 系統架構圖

二 實踐

2.1 快速入門(演示英文,系統支持中文/英文)

2.2 Grafana可視化集成 (可選)

2.3 插件管理

三 原理

3.1 任務采集調度

3.2 高性能集群、云邊協同

3.3 插件管理

四 總結

一、系統介紹

1.1 介紹

Apache HertzBeat (incubating) 是一個易用友好的開源實時監控告警系統,無需 Agent,高性能集群,兼容 Prometheus,提供強大的自定義監控和狀態頁構建能力。

1.2 特點

  • 集 監控+告警+通知 為一體,支持對應用服務,應用程序,數據庫,緩存,操作系統,大數據,中間件,Web服務器,云原生,網絡,自定義等監控閾值告警通知一步到位。
  • 易用友好,無需 Agent,全 WEB 頁面操作,鼠標點一點就能監控告警,無需學習成本。
  • 將 Http, Jmx, Ssh, Snmp, Jdbc, Prometheus 等協議規范可配置化,只需在瀏覽器配置監控模板 YML 就能使用這些協議去自定義采集想要的指標。您相信只需簡單配置即可快速適配一款 K8s 或 Docker 等新的監控類型嗎?
  • 兼容 Prometheus 的系統生態并且更多,只需頁面操作就可以監控 Prometheus 所能監控的。
  • 高性能,支持多采集器集群橫向擴展,支持多隔離網絡監控,云邊協同
  • 自由的告警閾值規則,郵件 Discord Slack Telegram 釘釘 微信 飛書 短信 Webhook Server醬 等方式消息及時送達。
  • 提供強大的狀態頁構建能力,輕松向用戶傳達您產品服務的實時狀態。

1.3 系統架構圖

圖片圖片

二、實踐

2.1 快速入門(演示英文,系統支持中文/英文)

1. 開啟Actuator配置

在項目 pom.xml 中添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

配置 application.yml 暴露端點:

management:
  endpoints:
    web:
      exposure:
        include: '*'
    enabled-by-default: true
  metrics:
    export:
      prometheus:
        enabled: true


注意:如果你的項目里還引入了認證相關的依賴,比如 springboot-security ,那么 SpringBoot Actuator 暴露出的接口可能會被攔截,此時需要你手動放開這些接口,以 springboot-security 為例,需要在 SecurityConfig 配置類中加入以下代碼:

public class SecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception{
        httpSecurity
                // 配置要放開的接口
                .antMatchers("/actuator/**").permitAll()
                .antMatchers("/metrics/**").permitAll()
                .antMatchers("/trace").permitAll()
                .antMatchers("/heapdump").permitAll()
                // ...
    }
}

2. 新增監控

系統頁面 -> 監控中心 -> 新增監控 -> AUTO -> Prometheus任務

圖片

3. 參數填寫

  • 目標Host:SpringBoot 應用服務器地址(不帶協議頭,例如: https://, http:// )
  • 端口:應用服務端口(例如: 8080)
  • 端點路徑:/actuator/prometheus 可以使用標簽分類來管理任務,如添加env=test等業務相關標簽。

圖片圖片

4. 查看監控數據

圖片圖片

圖片

5. 告警配置

系統頁面 -> 告警 -> 閾值規則 -> 新增 -> 新增閾值

圖片圖片

HertzBeat 提供了 實時計算 和 計劃周期 兩種類型的閾值規則設置,這里我們以 計劃周期 閾值規則為例。

  • 閾值名稱:閾值規則名稱
  • 閾值規則:填寫指標監測的規則(支持 PromQL)
  • 執行周期:周期性執行閾值計算的時間間隔
  • 告警級別:觸發閾值的告警級別,從低到高依次為: 警告-warning,嚴重-critical,緊急-emergency
  • 觸發次數:設置觸發閾值多少次之后才會發送告警
  • 告警內容:填寫監測告警的內容(支持填寫變量)

6. 設置閾值規則

比如監測 SpringBoot 應用程序的 CPU 占用,添加閾值規則:system_cpu_usage{job="Jolly_Vulture_43vT"} > 0.01

圖片圖片

最后可以在 告警中心 看到已觸發的告警。

圖片圖片

7. 設置告警通知

系統頁面 -> 消息通知 -> 通知媒介 -> 新增接收對象

圖片圖片

系統頁面 -> 消息通知 -> 通知策略 -> 新增通知策略 -> 選擇接收對象并啟用通知

圖片圖片

2.2 Grafana可視化集成 (可選)

 1. Grafana 圖表配置

需啟用 Grafana 可嵌入功能,并開啟匿名訪問。

 2. HertzBeat 監控中嵌入 Grafana 儀表盤

配置啟用 Grafana 后,重啟 HertzBeat 服務,在新增的 AUTO 監控中啟用并上傳 Grafana 模板。 比如:Grafana 數據源選擇hertzbeat-victoria-metrics,然后在儀表盤點擊:「Share」→「Export」→「Save to file」下載模板并上傳至 HertzBeat 監控中。

圖片圖片

3. 查看 Grafana 圖表

進入新增 AUTO 監控頁面,點擊 Grafana 圖標按鈕,即可查看 Grafana 圖表。

圖片圖片

2.3 插件管理

2.3.1 簡介

  • HertzBeat 現有交互局限于告警后的通知功能,而插件功能可支持用戶在其生命周期各階段添加自定義操作,例如告警后執行 SQL、Shell 腳本,或采集監控數據后發送至其他系統。
  • 用戶按自定義插件流程開發并打包后,通過 “插件管理 - 上傳插件” 功能上傳并啟用,即可在不重啟 HertzBeat(熱更新) 的情況下擴展自定義功能。

2.3.2 支持插件類型

Post-Alert插件
  • 作用:在告警后執行自定義操作
  • 實現接口:org.apache.hertzbeat.plugin.PostAlertPlugin
Post-Collect插件
  • 作用:在采集后執行自定義操作
  • 實現接口:org.apache.hertzbeat.plugin.PostCollectPlugin

2.3.3 Demo

  • 定位到plugin模塊的 Plugin接口。
  • 在org.apache.hertzbeat.plugin.impl目錄下, 新建一個PostAlertPlugin 實現類,如DemoPlugin,在實現類中接收Alert 類作為參數,實現execute方法,邏輯由用戶自定義.
  • 在 META-INF/services/org.apache.hertzbeat.plugin.PostAlertPlugin  文件中增加接口實現類的全限定名,每個實現類全限定名單獨成行。 例如:org.apache.hertzbeat.plugin.impl.DemoPluginImpl
  • 打包 hertzbeat-plugin 模塊。
  • 通過 插件管理-上傳插件 功能,上傳以 -jar-with-lib.jar 結尾的插件包,啟用插件即可在告警后執行自定義操作

2.3.4 自定義插件參數

  • 插件功能支持自定義參數,并且在使用插件時可以通過插件管理 - 編輯參數 功能填寫插件運行時需要的參數。 下面以定義一個包含兩個參數的插件為例,詳細介紹定義插件參數的流程:
  • 在 define 目錄下增加參數定義文件 ,注意參數定義文件必須是名稱為 define 開頭的 yml 文件,例如 define-demo.yml; 在 define-demo.yml 中定義參數,如下所示:
params:
 - field: host
   # name-param field display i18n name
   name:
     zh-CN: 目標 Host
     en-US: Target Host
   # type-param field type(most mapping the html input type)
   type: text
   # required-true or false
   required: true
# field-param field key
 - field: port
   # name-param field display i18n name
   name:
     zh-CN: 端口
     en-US: Port
   # type-param field type(most mapping the html input type)
   type: number
   # when type is number, range is required
   range: '[0,65535]'
  •   在插件邏輯中使用參數
@Override
 public void execute(Alert alert, PluginContext pluginContext) {
     log.info("param host:{}",pluginContext.getString("host"));
     log.info("param port:{}",pluginContext.getInteger("port"));
 }

三 原理

3.1 任務采集調度

3.1.1 時間輪算法

HertzBeat的監控任務調度內部使用的是時間輪算法。

  • 時間輪定義: 時間輪是一個 存儲定時任務的環形隊列,底層采用數組實現,數組中的每個元素可以存放一個定時任務列表。TimerTaskList 是一個環形的雙向鏈表,鏈表中的每一項表示的都是定時任務項
  • 概念圖

圖片圖片

3.1.2 業務流程圖

圖片圖片

3.1.3 代碼詳解

任務采集器
//初始化桶大小為512 -1,用于取模
        int mask = 511;
        // 初始化起始時間
        startTime = System.nanoTime();
        do {
            // 獲取下一個時間指針
            long deadline = waitForNextTick();
            if (deadline > 0) {
                // 計算當前桶索引(取模)
                int idx = (int) (tick & mask);
                // 清理已取消任務
                processCancelledTasks();
                // 獲取當前桶
                HashedWheelBucket bucket = wheel[idx];
                // 將新任務添加到桶桶
                transferTimeoutsToBuckets();
                // 執行到期任務
                bucket.expireTimeouts(deadline);
                // 推進時間+1
                tick++;
            }
        } while (isRunning());
 獲取時間指針(waitForNextTick)
  • 作用:確保每秒精確推進一個時間槽(tickDuration 默認為 1 秒)。
  • 細節:通過休眠補償時間差,避免忙等待。
private long waitForNextTick() {
    // 計算下一個tick的絕對時間點(單位:納秒)
    // tickDuration:每個tick的時間長度(默認1秒=1e9納秒)
    // tick:當前已執行的tick計數
    long deadline = tickDuration * (tick + 1);

    // 自旋等待直到達到下一個tick時間點
    for (; ; ) {
        // 計算當前已過去的時間(納秒)
        final long currentTime = System.nanoTime() - startTime;
        
        // 計算需要休眠的時間(毫秒)
        // +999999:實現納秒到毫秒的向上取整轉換(避免精度丟失)
        long sleepTimeMs = (deadline - currentTime + 999999) / 1000000;

        // 檢查是否已達到或超過deadline
        if (sleepTimeMs <= 0) {
            // 處理極端邊界情況
            if (currentTime == Long.MIN_VALUE) {
                return -Long.MAX_VALUE;  // 異常返回值
            } else {
                return currentTime;  // 返回實際經過的時間
            }
        }
        
        // Windows平臺特殊處理:調整休眠精度
        // 原因:Windows默認系統定時器精度約15ms,調整為10ms倍數可減少無效喚醒
        if (NetworkUtil.isWindowsPlatform()) {
            sleepTimeMs = sleepTimeMs / 10 * 10;  // 向下對齊到10ms
        }

        try {
            // 精確休眠直到下一個tick
            Thread.sleep(sleepTimeMs);
        } catch (InterruptedException ignored) {
            // 被中斷時檢查是否處于關閉狀態
            if (WORKER_STATE_UPDATER.get(HashedWheelTimer.this) == WORKER_STATE_SHUTDOWN) {
                return Long.MIN_VALUE;  // 返回關閉標識
            }
            // 否則忽略中斷繼續等待
        }
    }
}
 移除取消任務(processCancelledTasks)
  • 作用:刪除桶中已取消任務節點
  • 細節:timeout實現remove從雙向鏈表中刪除當前節點
private void processCancelledTasks() {
            for (; ; ) {
                // 從取消任務隊列獲取取消任務
                HashedWheelTimeout timeout = cancelledTimeouts.poll();
                if (timeout == null) {
                    // all processed
                    break;
                }
                try {
                    // timeout實現的從雙向鏈表中刪除當前節點
                    timeout.remove();
                } catch (Throwable t) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("An exception was thrown while process a cancellation task", t);
                    }
                }
            }
        }
任務分配邏輯(transferTimeoutsToBuckets)

deadline賦值邏輯:long deadline = System.nanoTime() + unit.toNanos(delay) - startTime;

短期任務(如 30 秒):remainingRounds = 0,直接放入對應桶。

長期任務(超出一輪范圍,如 1000 秒): 假設桶總數 512,當前 tick=0:

  • calculated = 1000 / 1 = 1000
  • remainingRounds = (1000 - 0) / 512 = 1(需 1 輪)
  • 桶索引:1000 % 512 = 488(放入第 488 號桶)
private void transferTimeoutsToBuckets() {
    // 每次tick最多轉移100,000個任務,防止添加任務的線程循環添加導致工作線程阻塞
    for (int i = 0; i < 100000; i++) {
        // 從任務隊列取出任務
        HashedWheelTimeout timeout = timeouts.poll();
        // 隊列為空時結束轉移
        if (timeout == null) {
            break;
        }
        // 跳過已取消的任務
        if (timeout.state() == HashedWheelTimeout.ST_CANCELLED) {
            continue;
        }
        // 計算任務的理論觸發時間槽(單位:tick)
        long calculated = timeout.deadline / tickDuration;
        // 計算任務需要經歷的完整輪數
        timeout.remainingRounds = (calculated - tick) / wheel.length;
        // 確保任務不會分配到過去的時間槽:
        // 如果計算的時間槽小于當前tick,則使用當前tick
        final long ticks = Math.max(calculated, tick);
        // 計算桶索引(通過位運算替代取模,要求wheel.length是2的冪)
        int stopIndex = (int) (ticks & mask);
        // 將任務添加到對應桶中
        HashedWheelBucket bucket = wheel[stopIndex];
        bucket.addTimeout(timeout);
    }
}
 執行到期任務(expireTimeouts)
  • 執行條件: remainingRounds <= 0 且未取消的任務。
  • 輪數更新:未到期的任務減少剩余輪數(每輪掃到桶時-1)。
void expireTimeouts(long deadline) {
            HashedWheelTimeout timeout = head;
            // 遍歷桶中任務鏈表
            while (timeout != null) {
                HashedWheelTimeout next = timeout.next;
                // 剩余輪數為 0
                if (timeout.remainingRounds <= 0) {
                    // 從鏈表移除
                    remove(timeout);
                    if (timeout.deadline <= deadline) {
                        // 執行任務
                        timeout.expire();
                    }
                } elseif (timeout.isCancelled()) {
                    // 移除已取消任務
                    remove(timeout);
                } else {
                    // 減少剩余輪數
                    timeout.remainingRounds--;
                }
                // 指針next
                timeout = next;
            }
        }

3.2 高性能集群、云邊協同

3.2.1 介紹

高性能集群:
  • HertzBeat 支持部署采集器集群,多采集器集群橫向擴展,指數級提高可監控數量與采集性能。
  • 監控任務在采集器集群中自調度,單采集器掛掉無感知故障遷移采集任務,新加入采集器節點自動調度分擔采集壓力。
  • 單機模式與集群模式相互切換部署非常方便,無需額外組件部署。
 云邊協同
  • HertzBeat 支持部署邊緣采集器集群,與主 HertzBeat 服務云邊協同提升采集能力。
  • 多個隔離網絡部署邊緣采集器,采集器在隔離網絡內部進行監控任務采集,采集數據上報,由主服務統一調度管理展示

3.2.2 架構圖

圖片圖片

3.2.3 自動調度

  • 實現原理: 采用一致性哈希算法,構建虛擬節點環,未指定采集器的任務通過哈希值自動映射至最近虛擬節點
  • 哈希環結構

圖片圖片

key:虛擬節點hash值

value:任務id集合

 創建哈希環流程圖

圖片圖片

 創建哈希環代碼詳解
// 1. 添加物理節點
public void addNode(Node newNode) {
    if (!isPrivateMode(newNode)) {
        int vnodes = getVirtualNodeCount(newNode);
        for (int i = 0; i < vnodes; i++) {
            addVirtualNode(newNode, newNode.id + i);
        }
    }
    nodeMap.put(newNode.id, newNode);
    rebalanceJobs();
}

// 2. 添加虛擬節點(核心遷移邏輯)
public synchronized void addVirtualNode(Node node, String vnodeId) {
    int vHash = hash(vnodeId);
    hashRing.put(vHash, node);  // 加入哈希環
    
    // 初始化虛擬節點任務集
    node.initVirtualNode(vHash);  
    
    // 獲取順時針后繼節點
    Node nextNode = getNextNode(vHash);
    
    // 遷移任務:從后繼節點獲取任務集合
    Set<Long[]> jobs = nextNode.getJobsForMigration(vHash);
    
    if (!jobs.isEmpty()) {
        // 拆分任務:需要遷移的部分
        Set<Long[]> migrateJobs = extractJobsToMigrate(jobs, vHash);
        
        // 更新節點任務映射
        nextNode.updateJobs(jobs);          // 更新原節點
        node.addJobsToVirtualNode(vHash, migrateJobs); // 添加到新節點
        
        // 更新物理節點狀態
        if (node != nextNode) {
            migrateJobStatus(nextNode, node, migrateJobs);
        }
    }
}

// 3. 管理虛擬節點任務
private void addVirtualNodeJobs(int vHash, Set<Long[]> jobs) {
    if (vNodeJobs == null) vNodeJobs = new ConcurrentHashMap<>();
    
    // 合并或創建任務集
    if (vNodeJobs.containsKey(vHash)) {
        vNodeJobs.get(vHash).addAll(jobs);
    } else {
        vNodeJobs.put(vHash, jobs);
    }
}
任務分配代碼詳解
public Node dispatchJob(Integer dispatchHash, Long jobId, boolean isFlushed) {
        if (dispatchHash == null || hashCircle == null || hashCircle.isEmpty()) {
            log.warn("There is no available collector registered. Cache the job {}.", jobId);
            dispatchJobCache.add(new DispatchJob(dispatchHash, jobId));
            return null;
        }
        // 獲取哈希環中第一個大于等于dispatchHash的節點
        Map.Entry<Integer, Node> ceilEntry = hashCircle.ceilingOrFirstEntry(dispatchHash);
        int virtualKey = ceilEntry.getKey();
        Node curNode = ceilEntry.getValue();

        curNode.addJob(virtualKey, dispatchHash, jobId, isFlushed);
        return curNode;
    }

3.2.4 無感知故障遷移

  • 實現原理:通過netty監控心跳每5秒一次,如果某采集器節點心跳失效,HertzBeat重新分配任務
  • 代碼詳解
  • 感知到采集器下線后,會調用collectorGoOffline
public void collectorGoOffline(String identity) {
    // ... 更新數據庫狀態
    
    // 關鍵步驟:從一致性哈希環移除
    consistentHash.removeNode(identity);
    
    // 關鍵步驟:重新平衡任務分配
    reBalanceCollectorAssignJobs();
}

3.3 插件管理

3.3.1 實現原理:

通過SPI結合自定義類加載器實現插件熱更新

3.3.2 代碼詳解

  • 插件新增邏輯
public void savePlugin(PluginUpload pluginUpload) {
        // 1. 保存JAR文件到plugin-lib目錄
        String jarPath = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()).getAbsolutePath();
        Path extLibPath = Paths.get(new File(jarPath).getParent(), "plugin-lib");
        File extLibDir = extLibPath.toFile();
        String fileName = UUID.randomUUID().toString().replace("-", "") + "_" + fileName;
        File destFile = new File(extLibDir, fileName);

        // 2. 驗證JAR文件內容
        PluginMetadata parsed = validateJarFile(destFile);

        // 3. 保存插件元數據到數據庫
        metadataDao.save(pluginMetadata);
        itemDao.saveAll(pluginItems);

        // 4. 重新加載類加載器
        loadJarToClassLoader();

        // 5. 同步插件狀態
        syncPluginStatus();
    }
  • 插件更新
@PostConstruct
private void loadJarToClassLoader() {
    // 1. 關閉舊的類加載器
    for (URLClassLoader pluginClassLoader : pluginClassLoaders) {
        if (pluginClassLoader != null) {
            pluginClassLoader.close();
        }
    }
    
    // 2. 清理內存
    if (!pluginClassLoaders.isEmpty()) {
        pluginClassLoaders.clear();
        System.gc();
    }
    
    // 3. 重新加載所有啟用的插件
    List<PluginMetadata> plugins = metadataDao.findPluginMetadataByEnableStatusTrue();
    for (PluginMetadata metadata : plugins) {
        List<URL> urls = loadLibInPlugin(metadata.getJarFilePath(), metadata.getId());
        urls.add(new File(metadata.getJarFilePath()).toURI().toURL());
        pluginClassLoaders.add(new URLClassLoader(urls.toArray(new URL[0]), Plugin.class.getClassLoader()));
    }
}
  • 插件調用
@Override
public <T> void pluginExecute(Class<T> clazz, Consumer<T> execute) {
    for (URLClassLoader pluginClassLoader : pluginClassLoaders) {
        // 使用ServiceLoader發現插件實現
        ServiceLoader<T> load = ServiceLoader.load(clazz, pluginClassLoader);
        for (T t : load) {
            if (pluginIsEnable(t.getClass())) {
                execute.accept(t);
            }
        }
    }
}

四 總結

  • 開箱即用:Docker 快速部署,端口映射即可使用;集成監控、告警、通知,覆蓋多類對象。
  • 極簡易用:部署簡單,配置量少,無需 Agent 即可直接監控;全 WEB 操作,零學習成本。
  • 界面直觀:菜單簡潔,無深層嵌套,核心功能集中在一級菜單;用戶配置在配置文件中完成,操作便捷。
  • 安全可靠:數據密鑰全鏈路加密。
  • 高性能與自定義:支持多協議模板化配置,YML 自定義指標;集群橫向擴展,適配多網絡場景;靈活告警與多渠道通知,可快速適配新 K8s 監控類型。

關于作者

閆書銘,轉轉回收技術部 后端工程師,Apache HertzBeat Committer

責任編輯:武曉燕 來源: 轉轉技術
相關推薦

2025-08-04 07:36:09

Apache開源監控

2024-02-06 08:36:54

2021-08-31 15:53:48

Nuxt 開箱服務

2013-11-01 09:37:19

Android系統架構工具

2025-05-15 08:35:00

2023-01-15 20:28:32

前端圖片壓縮

2023-03-08 21:25:58

開源工具庫開箱

2023-11-04 12:43:44

前端圖片參數

2022-08-08 08:29:55

圖片壓縮前端互聯網

2021-09-26 05:41:47

基礎設施連接無線技術網絡

2024-08-19 09:25:42

2021-09-01 17:43:32

StreamNativ開源

2021-09-28 09:30:18

uni-appVue 3.0uniCloud

2023-01-29 07:49:57

2022-08-02 09:01:55

后臺管理模版

2022-08-29 15:02:12

系統管理

2022-01-03 18:15:35

FlaskTepHttpRunner

2015-06-30 09:49:19

管理平臺開源KVM
點贊
收藏

51CTO技術棧公眾號

日本三级中国三级99人妇网站| 亚洲桃色在线一区| **欧美日韩vr在线| 久久久久久国产免费a片| 国产精品视频一区二区三区| 亚洲va韩国va欧美va精品| 国产福利精品av综合导导航| 国产精品综合激情| 中文字幕一区二区三区中文字幕 | 日韩av在线播放资源| 亚州精品一二三区| 精精国产xxxx视频在线播放| 国产精品久久久久久久裸模| 久中文字幕一区| 精品国产亚洲av麻豆| 日韩系列欧美系列| 亚洲国产精品久久| 天天爽夜夜爽视频| 麻豆视频在线免费观看| 99国产精品99久久久久久| 欧美激情精品久久久| 伊人影院综合网| 欧美重口另类| 欧美变态口味重另类| 最新国产黄色网址| 韩国女主播一区二区| 午夜不卡av在线| 最近免费观看高清韩国日本大全| 九色在线免费| 91麻豆国产自产在线观看| 成人3d动漫一区二区三区91| 九九热这里有精品视频| 国产探花一区| 亚洲男人天堂手机在线| 无码一区二区精品| 精品一区二区男人吃奶| 日韩精品一区二区三区在线播放| 亚洲一区二区三区观看| 国产极品久久久久久久久波多结野| 天天影视网天天综合色在线播放| 青青青在线观看视频| www在线免费观看视频| 国产成人免费视频一区| 成人精品久久久| 中文字幕在线视频第一页| 日韩激情视频网站| 国产精品久久久久7777婷婷| 少妇高潮av久久久久久| 久久狠狠婷婷| 国产suv精品一区二区| 成人午夜淫片100集| 亚洲永久免费| 日韩av免费网站| 久久精品视频5| 丝袜亚洲精品中文字幕一区| 国产精品福利网站| 国产又粗又猛又爽又黄的视频一| 精品一区二区三区免费毛片爱| 成人在线激情视频| 不卡av中文字幕| 大白屁股一区二区视频| 国产一区免费在线观看| 五月婷婷免费视频| 国产日韩欧美综合在线| 视频在线99| 国产一区久久精品| 亚洲国产一区在线观看| 午夜精品一区二区三区四区| av网站大全在线观看| 国产精品不卡一区| 欧美一二三不卡| av今日在线| 91久久免费观看| 亚洲一级片av| 欧美18xxxx| 在线成人一区二区| 欧美日韩亚洲国产另类| 日韩一级欧洲| 国产精品久久久久av| 国产免费av电影| 99久久综合狠狠综合久久| 日韩精品久久一区二区三区| 九色porny丨首页在线| 亚洲一区在线看| 日韩欧美xxxx| 欧美大陆国产| 亚洲精品国产欧美| 日本伦理一区二区三区| 伊人成人在线视频| 国产精品视频播放| 黄色av一区二区| 国产在线一区观看| 人偷久久久久久久偷女厕| 日本成a人片在线观看| 亚洲va中文字幕| 羞羞的视频在线| 老司机成人在线| 久久九九全国免费精品观看| 女人十八岁毛片| 国产乱码一区二区三区| 欧美在线3区| 福利写真视频网站在线| 欧美三级视频在线观看| 欧美xxxxx精品| 香蕉综合视频| 国产精品美女www爽爽爽视频| 黄色aaa大片| 亚洲丝袜自拍清纯另类| 久久精品99国产| 狠狠久久伊人| 久久国产精品电影| 中文字幕视频一区二区| 91亚洲国产成人精品一区二三 | 欧美午夜一区| 国产精品中文字幕在线| 久香视频在线观看| 亚洲成国产人片在线观看| 99九九精品视频| 成人精品久久| 国产ts一区二区| 日韩性xxxx| 亚洲精品欧美在线| 在线观看免费的av| 欧美色女视频| 国产福利精品在线| 青青青草原在线| 天涯成人国产亚洲精品一区av| 视频区 图片区 小说区| 91欧美在线| 国产精品入口夜色视频大尺度 | 成人一区二区三| 婷婷成人综合| 98精品在线视频| 免费观看的毛片| 亚洲国产aⅴ成人精品无吗| 中文写幕一区二区三区免费观成熟| 国产精品久久久乱弄| 国产精品爽黄69天堂a| 国产永久免费高清在线观看视频| 色婷婷久久久亚洲一区二区三区| 国产精品三级在线观看无码| 国产精品永久| 国产精品综合网| 精品产品国产在线不卡| 波多野结衣久久| 亚洲第一国产精品| 日韩毛片在线视频| 99久久精品国产麻豆演员表| 男女视频网站在线观看| 丝袜美腿一区二区三区动态图| 45www国产精品网站| 可以在线观看av的网站| 成人动漫一区二区| 日本免费黄视频| 国产99精品| 国产欧美日韩丝袜精品一区| 看黄网站在线| 日韩亚洲欧美综合| 日本少妇毛茸茸高潮| 91色视频在线| 手机视频在线观看| 亚洲欧洲美洲一区二区三区| 不卡一卡2卡3卡4卡精品在| а√天堂8资源在线| 日韩久久精品成人| 中文字幕av免费观看| 亚洲人精品一区| 亚洲色图欧美日韩| 视频在线观看一区| 五月天综合婷婷| 国产人妖ts一区二区| 日本欧美一二三区| 午夜激情在线观看| 亚洲成人av资源网| 中文字幕精品无| 亚洲啪啪综合av一区二区三区| 亚洲图片欧美另类| 水野朝阳av一区二区三区| 在线亚洲美日韩| 国产精品毛片视频| 国产精品www色诱视频| 在线中文字幕-区二区三区四区 | 无码人妻丰满熟妇精品区| 国产精品情趣视频| 91传媒理伦片在线观看| 日韩高清一级片| 国产精品视频一二三四区| 美女毛片一区二区三区四区| 亚洲a区在线视频| 最新日韩精品| 欧美人交a欧美精品| 男人的天堂在线视频| 欧美成人r级一区二区三区| 无码人妻av免费一区二区三区| 亚洲精品ww久久久久久p站| 岛国av免费在线| 亚洲国产1区| 一区二区三区四区欧美日韩| 日韩精品a在线观看91| 亚洲自拍av在线| 日韩欧美一区二区三区在线观看| 亚洲美女自拍视频| 精品黑人一区二区三区国语馆| 色综合一区二区| 久久婷婷国产麻豆91| 国产精品网站一区| 91精品人妻一区二区三区蜜桃欧美| 国产一区在线观看视频| 亚洲一区二区蜜桃| 国产精品嫩草99av在线| 国产精品免费看久久久无码| 成人在线国产| 欧美激情第六页| 国产一区丝袜| 99re国产视频| 国产麻豆一区二区三区| 国产精品久久久久久久久男| 欧美hdxxx| 超在线视频97| 欧美日本一道| 一区二区三区视频免费在线观看| 香蕉视频成人在线| 精品国产乱码久久久久久老虎| 99热在线只有精品| 亚洲成a人片综合在线| 高清国产在线观看| 久久蜜臀精品av| 少妇饥渴放荡91麻豆| www.激情成人| 日本美女视频网站| 成人一级片网址| 91超薄肉色丝袜交足高跟凉鞋| 国产裸体歌舞团一区二区| 亚洲精品午夜在线观看| 免费人成网站在线观看欧美高清| 国产视频一区二区三区在线播放| 蜜桃视频一区| 久草在在线视频| 日韩中文字幕麻豆| 我看黄色一级片| 视频精品一区二区| 不卡av免费在线| 秋霞电影网一区二区| www.com黄色片| 久久激五月天综合精品| 日韩 欧美 视频| 国产精品啊v在线| 欧美在线一区二区三区四区| 免费精品国产的网站免费观看| 美国av一区二区三区| 国产一区二区三区四区五区| 日韩欧美第二区在线观看| 欧美日中文字幕| 国产精品久久久对白| 99热这里只有精品首页| 九九九九九精品| 国产日产精品_国产精品毛片| 婷婷久久青草热一区二区| 99久久99热这里只有精品| 中国老女人av| 99在线热播精品免费99热| 91黄色小网站| 久久精品国产免费| 美女流白浆视频| 91在线看国产| 久久精品三级视频| 亚洲免费观看高清完整版在线观看 | 久久视频这里有精品| 久久99伊人| 99九九精品视频| 99精品热视频| 国产欧美一区二区三区在线观看视频| 亚洲人成网站精品片在线观看| 精品亚洲永久免费| 欧洲av一区二区嗯嗯嗯啊| 国产免费一区二区三区免费视频| 亚洲第一网站免费视频| av在线二区| 高清欧美性猛交| 成人网ww555视频免费看| 亚洲一区二区三区香蕉| 一本色道久久综合亚洲精品酒店| 懂色av一区二区三区四区五区| 日韩视频二区| 亚洲精品在线网址| 久久久亚洲精品石原莉奈| 91人妻一区二区三区蜜臀| 欧美日韩一区二区在线| 国产又粗又猛又黄又爽无遮挡 | 成年女人的天堂在线| 欧美大片在线影院| 亚洲电影有码| 国产精品久久久久久久久久久久午夜片| 综合伊思人在钱三区| 大地资源网在线观看免费官网| 性色一区二区三区| 潘金莲一级淫片aaaaaaa| 欧美激情在线免费观看| 国产一卡二卡在线播放| 亚洲人成网站影音先锋播放| 黄色一级片免费在线观看| 欧美一区二区三区电影| 国产在线你懂得| 国模精品一区二区三区色天香| 色综合一区二区日本韩国亚洲| 国产日韩欧美综合| 日韩一级电影| 男人天堂a在线| 国产精品自产自拍| 天堂资源在线视频| 欧美性高潮床叫视频| 亚洲第一页视频| 久久精品国产91精品亚洲| 先锋欧美三级| 免费99视频| 国产欧美精品| 中文成人无字幕乱码精品区| 亚洲一区二区三区四区在线观看 | 国产激情一区二区三区四区 | 亚洲高清不卡在线观看| 国产精品乱码一区二区| 中文字幕不卡在线视频极品| free欧美| 欧美在线视频一区二区三区| 亚洲欧美视频| 免费在线观看成年人视频| 亚洲成人777| 黄色a在线观看| 久久久久久香蕉网| 成人免费直播在线| 福利视频免费在线观看| 国产.精品.日韩.另类.中文.在线.播放 | 欧美天堂影院| 国产在线播放观看| 老司机精品福利视频| 网站免费在线观看| 国产精品乱码一区二三区小蝌蚪| 中文字幕在线观看视频免费| 亚洲人成网站免费播放| 亚洲精品福利电影| 日本在线高清视频一区| 久久在线精品| 国产极品视频在线观看| 欧美三级欧美一级| 黄色网页在线观看| 99国产精品久久久久老师| 午夜精彩国产免费不卡不顿大片| 午夜性福利视频| 亚洲第一搞黄网站| 三级av在线| 国产不卡在线观看| 成人免费a**址| 亚洲精品免费一区亚洲精品免费精品一区 | 色呦呦在线免费观看| 国产精品区一区二区三含羞草| 亚洲第一区色| 性欧美丰满熟妇xxxx性仙踪林| 色欧美日韩亚洲| 秋霞午夜在线观看| 91免费看网站| 欧美在线综合| 可以免费看av的网址| 日韩精品一区二区三区swag| 川上优av中文字幕一区二区| 欧美另类一区| 久久精品国产精品青草| 国内偷拍精品视频| 亚洲黄页网在线观看| 久久精品女人天堂av免费观看| 杨幂一区欧美专区| 成人免费观看男女羞羞视频| 日韩特级黄色片| 中文字幕亚洲一区在线观看 | 亚洲第一中文字幕| 亚洲综合av一区二区三区| 伊人网在线免费| 91麻豆成人久久精品二区三区| 91成年人视频| 亚洲日本aⅴ片在线观看香蕉| 粉嫩av一区二区三区四区五区| 久久福利一区二区| 2021国产精品久久精品| 91丨porny丨在线中文| 97超级碰碰碰| 97人人精品| www.色多多| 欧美一区二区三区公司| 自拍偷自拍亚洲精品被多人伦好爽| 在线观看日本一区| 91在线国内视频| 国内精品久久久久久久久久| 国产99视频精品免视看7| 国产一区欧美| 欧美88888| 精品在线小视频| 亚洲高清在线一区| 亚洲三级视频网站| 岛国av一区二区在线在线观看| a天堂中文在线官网在线| 欧洲视频一区二区三区|