日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java Kafka 消費積壓監控的示例代碼

瀏覽:27日期:2022-08-10 15:40:53

后端代碼:

Monitor.java代碼:

package com.suncreate.kafkaConsumerMonitor.service;import com.suncreate.kafkaConsumerMonitor.model.ConsumerInfo;import org.apache.kafka.clients.consumer.ConsumerConfig;import org.apache.kafka.clients.consumer.KafkaConsumer;import org.apache.kafka.clients.consumer.OffsetAndMetadata;import org.apache.kafka.common.PartitionInfo;import org.apache.kafka.common.TopicPartition;import org.apache.kafka.common.serialization.StringDeserializer;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.*;/** * kafka消費監控 * * @author suxiang */public class Monitor { private static final Logger log = LoggerFactory.getLogger(Monitor.class); private String servers; private String topic; private String groupId; private long lastTime; private long lastTotalLag = 0L; private long lastLogSize = 0L; private long lastOffset = 0L; private double lastRatio = 0; private long speedLogSize = 0L; private long speedOffset = 0L; private String time; private List<ConsumerInfo> list; private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss'); public String getTime() {return time; } public void setTime(String time) {this.time = time; } public long getLastTotalLag() {return lastTotalLag; } public double getLastRatio() {return lastRatio; } public String getTopic() {return topic; } public String getGroupId() {return groupId; } public long getSpeedLogSize() {return speedLogSize; } public long getSpeedOffset() {return speedOffset; } public List<ConsumerInfo> getList() {return list; } public void setList(List<ConsumerInfo> list) {this.list = list; } private KafkaConsumer<String, String> consumer; private List<TopicPartition> topicPartitionList; private final DecimalFormat decimalFormat = new DecimalFormat('0.00'); public Monitor(String servers, String topic, String groupId) {this.servers = servers;this.topic = topic;this.groupId = groupId;this.list = new ArrayList<>();//消費者Properties properties = new Properties();properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, this.servers);properties.put(ConsumerConfig.GROUP_ID_CONFIG, this.groupId);properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);consumer = new KafkaConsumer<String, String>(properties);//查詢 topic partitionstopicPartitionList = new ArrayList<>();List<PartitionInfo> partitionInfoList = consumer.partitionsFor(topic);for (PartitionInfo partitionInfo : partitionInfoList) { TopicPartition topicPartition = new TopicPartition(partitionInfo.topic(), partitionInfo.partition()); topicPartitionList.add(topicPartition);} } public void monitor(boolean addToList) {try { long startTime = System.currentTimeMillis(); //查詢 log size Map<Integer, Long> endOffsetMap = new HashMap<>(); Map<TopicPartition, Long> endOffsets = consumer.endOffsets(topicPartitionList); for (TopicPartition partitionInfo : endOffsets.keySet()) {endOffsetMap.put(partitionInfo.partition(), endOffsets.get(partitionInfo)); } //查詢消費 offset Map<Integer, Long> commitOffsetMap = new HashMap<>(); for (TopicPartition topicAndPartition : topicPartitionList) {OffsetAndMetadata committed = consumer.committed(topicAndPartition);commitOffsetMap.put(topicAndPartition.partition(), committed.offset()); } long endTime = System.currentTimeMillis(); log.info('查詢logSize和offset耗時:' + (new DecimalFormat('0.000')).format((endTime - startTime) / 1000.0) + ' 秒'); startTime = System.currentTimeMillis(); //累加lag long totalLag = 0L; long logSize = 0L; long offset = 0L; if (endOffsetMap.size() == commitOffsetMap.size()) {for (Integer partition : endOffsetMap.keySet()) { long endOffset = endOffsetMap.get(partition); long commitOffset = commitOffsetMap.get(partition); long diffOffset = endOffset - commitOffset; totalLag += diffOffset; logSize += endOffset; offset += commitOffset;} } else {log.error('Topic:' + topic + ' consumer:' + consumer + ' topic partitions lost'); } log.info('Topic:' + topic + ' logSize:' + logSize + ' offset:' + offset + ' totalLag:' + totalLag); if (lastTime > 0) {if (System.currentTimeMillis() - lastTime > 0) { speedLogSize = (long) ((logSize - lastLogSize) / ((System.currentTimeMillis() - lastTime) / 1000.0)); speedOffset = (long) ((offset - lastOffset) / ((System.currentTimeMillis() - lastTime) / 1000.0));}if (speedLogSize > 0) { String strRatio = decimalFormat.format(speedOffset * 100 / (speedLogSize * 1.0)); lastRatio = Double.parseDouble(strRatio); log.info('Topic:' + topic + ' speedLogSize:' + speedLogSize + ' speedOffset:' + speedOffset + ' 百分比:' + strRatio + '%');} } lastTime = System.currentTimeMillis(); lastTotalLag = totalLag; lastLogSize = logSize; lastOffset = offset; endTime = System.currentTimeMillis(); log.info('計算耗時:' + (new DecimalFormat('0.000')).format((endTime - startTime) / 1000.0) + ' 秒'); if (addToList) {this.setTime(simpleDateFormat.format(new Date()));this.list.add(new ConsumerInfo(this.getTopic(), this.getGroupId(), this.getLastTotalLag(), this.getLastRatio(), this.getSpeedLogSize(), this.getSpeedOffset(), this.getTime()));if (this.list.size() > 500) { this.list.remove(0);} }} catch (Exception e) { log.error('Monitor error', e);} }}

MonitorService.java代碼:

package com.suncreate.kafkaConsumerMonitor.service;import com.suncreate.kafkaConsumerMonitor.model.ConsumerInfo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;import java.util.*;@Servicepublic class MonitorService { private static final Logger log = LoggerFactory.getLogger(MonitorService.class); @Value('${kafka.consumer.servers}') private String servers; private Monitor monitor; private List<Monitor> monitorList; @PostConstruct private void Init() {monitorList = new ArrayList<>();monitorList.add(new Monitor(servers, 'wifiData', 'wifi-kafka-hbase'));monitorList.add(new Monitor(servers, 'KK_PASS_INFO_TYCC', 'EXTRACT-SAMPLE'));monitorList.add(new Monitor(servers, 'KK_PASS_INFO_TYCC', 'dblrecog-upload2vcn'));monitorList.add(new Monitor(servers, 'KK_PASS_INFO_TYCC_FILTER', 'yisa20210521000001'));monitorList.add(new Monitor(servers, 'KK_PASS_INFO_TYCC_FILTER', 'kafka-filter-check-19'));monitorList.add(new Monitor(servers, 'motorVehicle', 'unifiedstorage-downloader'));monitorList.add(new Monitor(servers, 'motorVehicle', 'full-vehicle-data-storage-kafka2ch'));monitorList.add(new Monitor(servers, 'motorVehicle', 'vehicle_store'));monitorList.add(new Monitor(servers, 'motorVehicle', 'vcn-sk-upload-luyang'));monitorList.add(new Monitor(servers, 'motorVehicle', 'vcn-sk-upload-yaohai'));monitorList.add(new Monitor(servers, 'motorVehicle', 'vcn-sk-upload-baohe'));monitorList.add(new Monitor(servers, 'peopleFace', 'kafka-filter-check-19')); } public void monitorOnce(boolean addToList) {for (Monitor monitor : monitorList) { monitor.monitor(addToList);} } public List<ConsumerInfo> getConsumerList() {List<ConsumerInfo> list = new ArrayList<>();for (Monitor monitor : monitorList) { list.add(new ConsumerInfo(monitor.getTopic(), monitor.getGroupId(), monitor.getLastTotalLag(), monitor.getLastRatio(), monitor.getSpeedLogSize(), monitor.getSpeedOffset(), monitor.getTime()));}return list; } public List<ConsumerInfo> getDetails(String topic, String groupId) {for (Monitor monitor : monitorList) { if (monitor.getTopic().equals(topic) && monitor.getGroupId().equals(groupId)) {return monitor.getList(); }}return new ArrayList<>(); }}

MonitorConfig.java代碼:

package com.suncreate.kafkaConsumerMonitor.task;import com.suncreate.kafkaConsumerMonitor.service.MonitorService;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.SchedulingConfigurer;import org.springframework.scheduling.config.ScheduledTaskRegistrar;import org.springframework.scheduling.support.CronTrigger;import java.text.SimpleDateFormat;@Configuration@EnableSchedulingpublic class MonitorConfig implements SchedulingConfigurer { private static final Logger logger = LoggerFactory.getLogger(MonitorConfig.class); private String cronExpression = '0 */3 * * * ?'; //private String cronExpression = '*/20 * * * * ?'; private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss.SSS'); @Autowired private MonitorService monitorService; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(() -> { monitorService.monitorOnce(true);}, triggerContext -> new CronTrigger(cronExpression).nextExecutionTime(triggerContext)); }}

MonitorController.java代碼:

package com.suncreate.kafkaConsumerMonitor.controller;import com.suncreate.kafkaConsumerMonitor.model.ConsumerInfo;import com.suncreate.kafkaConsumerMonitor.model.LayuiData;import com.suncreate.kafkaConsumerMonitor.service.MonitorService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController@RequestMapping('/monitor')public class MonitorController { @Autowired private MonitorService monitorService; @GetMapping('/getConsumers') public LayuiData getConsumers() {List<ConsumerInfo> list = monitorService.getConsumerList();LayuiData data = new LayuiData(list);return data; } @GetMapping('/monitorOnce') public void monitorOnce() {monitorService.monitorOnce(false); } @GetMapping('/getDetails') public LayuiData getDetails(String topic, String groupId) {List<ConsumerInfo> list = monitorService.getDetails(topic, groupId);LayuiData data = new LayuiData(list);return data; }}

pom.xml文件(有些東西沒用到或者備用,沒有刪):

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.suncreate</groupId> <artifactId>kafka-consumer-monitor</artifactId> <version>1.0</version> <name>kafka-consumer-monitor</name> <description>Kafka消費積壓監控預警</description> <properties><java.version>1.8</java.version><elasticsearch.version>6.1.4</elasticsearch.version> </properties> <dependencies><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version></dependency><dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency><dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <scope>test</scope></dependency><dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.0</version></dependency><dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>6.1.4</version></dependency><dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.1.0.7.0</version></dependency><dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11</artifactId> <version>0.11.0.1</version></dependency><dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.11.0.1</version></dependency> </dependencies> <build><plugins> <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration> <source>8</source> <target>8</target></configuration> </plugin></plugins> </build></project>

前端使用了 Layui 和 ECharts 展示表格和圖表

index.css代碼:

.div-title { font-size: 18px; margin-top: 10px; margin-left: 10px;}.div-right { text-align: right;}.span-red { color: #ff0000;}

index.html代碼(展示topic、消費者組Consumer GroupId、Total Lag、Kafka數據生產速度、Kafka數據消費速度等):

<!DOCTYPE html><html lang='zh'><head> <meta charset='UTF-8'> <title>Title</title> <link rel='stylesheet' href='http://www.b3g6.com/bcjs/css/index.css' rel='external nofollow' rel='external nofollow' > <link rel='stylesheet' href='http://www.b3g6.com/bcjs/js/layui-v2.6.8/css/layui.css' rel='external nofollow' rel='external nofollow' media='all'> <script type='text/javascript' src='http://www.b3g6.com/bcjs/js/jquery-1.7.1.js'></script> <script type='text/javascript' src='http://www.b3g6.com/bcjs/js/layui-v2.6.8/layui.js' charset='utf-8'></script></head><body><div class='div-title'>Kafka 監控 <button type='button' onclick='refreshTable()'>刷新</button></div><table id='myTable'></table><script type='text/javascript'> var myTable; layui.use(’table’, function () {var table = layui.table;myTable = table.render({ elem: ’#myTable’, url: ’/home/monitor/getConsumers’, cellMinWidth: 80, //全局定義常規單元格的最小寬度 cols: [[{field: ’topic’, width: 300, title: ’topic’, sort: true},{field: ’groupId’, width: 300, title: ’groupId’},{ field: ’totalLag’, width: 150, title: ’Total Lag’, sort: true, templet: function (d) {if (d.delayDay * 24 > 2) { return ’<div class='div-right'><span class='span-red'>’ + d.totalLag + ’</span></div>’} else { return ’<div class='div-right'><span>’ + d.totalLag + ’</span></div>’} }},{ field: ’speedLogSize’, width: 150, title: ’生產速度(條/秒)’, templet: function (d) {return ’<div class='div-right'>’ + d.speedLogSize + ’</div>’ }},{ field: ’speedOffset’, width: 150, title: ’消費速度(條/秒)’, templet: function (d) {return ’<div class='div-right'>’ + d.speedOffset + ’</div>’ }},{ field: ’ratio’, width: 100, title: ’消費/生產’, templet: function (d) {if (d.ratio < 90) { return ’<div class='div-right'><span class='span-red'>’ + d.ratio + ’%</span></div>’} else { return ’<div class='div-right'><span>’ + d.ratio + ’%</span></div>’} }},{ field: ’delayDay’, width: 150, title: ’積壓(天)’, sort: true, templet: function (d) {if (d.delayDay * 24 > 2) { return ’<div class='div-right'><span class='span-red'>’ + d.delayDay + ’</span></div>’} else { return ’<div class='div-right'><span>’ + d.delayDay + ’</span></div>’} }},{ field: ’ope’, width: 100, title: ’操作’, templet: function (d) {return ’<a href='http://www.b3g6.com/home/detail.html?topic=’ + d.topic + ’&groupId=’ + d.groupId + ’' rel='external nofollow' target='_blank' >詳細</a>’; }} ]]}); }); function refreshTable() {if (myTable) { myTable.reload();} } setInterval(function () {refreshTable(); }, 30000); // setInterval(function () { // $.get('/home/monitor/monitorOnce'); // }, 30000);</script></body></html>

detail.html代碼(展示單個消費者組的Total Lag、生產速度、消費速度以及Total Lag趨勢圖):

<!DOCTYPE html><html lang='zh'><head> <meta charset='UTF-8'> <title>Title</title> <link rel='stylesheet' href='http://www.b3g6.com/bcjs/css/index.css' rel='external nofollow' rel='external nofollow' > <link rel='stylesheet' href='http://www.b3g6.com/bcjs/js/layui-v2.6.8/css/layui.css' rel='external nofollow' rel='external nofollow' media='all'> <script type='text/javascript' src='http://www.b3g6.com/bcjs/js/jquery-1.7.1.js'></script> <script type='text/javascript' src='http://www.b3g6.com/bcjs/js/layui-v2.6.8/layui.js' charset='utf-8'></script> <script type='text/javascript' src='http://www.b3g6.com/bcjs/js/echarts-v4.7.0/echarts.min.js'></script></head><body><div class='div-title'><span id='detailTitle'></span> 明細 <button type='button' onclick='refreshTable()'>刷新</button></div><div style='height:400px;'></div><table id='test'></table><script type='text/javascript'> var myTable; var topic = getQueryVariable('topic'); var groupId = getQueryVariable('groupId'); $('#detailTitle').html(topic + ' ' + groupId); layui.use(’table’, function () {var table = layui.table;myTable = table.render({ elem: ’#test’, url: ’/home/monitor/getDetails?topic=’ + topic + ’&groupId=’ + groupId, cellMinWidth: 80, //全局定義常規單元格的最小寬度 initSort: {field: ’time’, //排序字段,對應 cols 設定的各字段名type: ’desc’ //排序方式 asc: 升序、desc: 降序、null: 默認排序 }, cols: [[{field: ’topic’, width: 300, title: ’topic’},{field: ’groupId’, width: 300, title: ’groupId’},{field: ’time’, width: 180, title: ’時間’, sort: true},{ field: ’totalLag’, width: 150, title: ’Total Lag’, templet: function (d) {if (d.delayDay * 24 > 2) { return ’<div class='div-right'><span class='span-red'>’ + d.totalLag + ’</span></div>’} else { return ’<div class='div-right'><span>’ + d.totalLag + ’</span></div>’} }},{ field: ’speedLogSize’, width: 150, title: ’生產速度(條/秒)’, templet: function (d) {return ’<div class='div-right'>’ + d.speedLogSize + ’</div>’ }},{ field: ’speedOffset’, width: 150, title: ’消費速度(條/秒)’, templet: function (d) {return ’<div class='div-right'>’ + d.speedOffset + ’</div>’ }},{ field: ’ratio’, width: 100, title: ’消費/生產’, templet: function (d) {if (d.ratio < 90) { return ’<div class='div-right'><span class='span-red'>’ + d.ratio + ’%</span></div>’} else { return ’<div class='div-right'><span>’ + d.ratio + ’%</span></div>’} }},{ field: ’delayDay’, width: 150, title: ’積壓(天)’, templet: function (d) {if (d.delayDay * 24 > 2) { return ’<div class='div-right'><span class='span-red'>’ + d.delayDay + ’</span></div>’} else { return ’<div class='div-right'><span>’ + d.delayDay + ’</span></div>’} }} ]]}); }); function refreshTable() {if (myTable) { myTable.reload();}showChart(); } setInterval(function () {refreshTable(); }, 30000); function getQueryVariable(variable) {var query = window.location.search.substring(1);var vars = query.split('&');for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (pair[0] == variable) {return pair[1]; }}return (false); } function showChart() {$.ajax({ type: 'GET', url: ’/home/monitor/getDetails?topic=’ + topic + ’&groupId=’ + groupId, success: function (data) {if (data && data.data && data.data.length > 1) { debugger; var chartDom = document.getElementById(’main’); var myChart = echarts.init(chartDom); var option; var xAxis = []; var serseis = []; for (var i = 0; i < data.data.length; i++) {xAxis.push(data.data[i].time);serseis.push(data.data[i].totalLag); } option = {title: { show: true, text: 'Total Lag 趨勢圖', x: ’center’},xAxis: { type: ’category’, data: xAxis},yAxis: { type: ’value’},series: [{ data: serseis, type: ’line’}] }; myChart.setOption(option);} }}); } showChart();</script></body></html>

效果圖:

消費者組列表:

Java Kafka 消費積壓監控的示例代碼

消費者組明細:

Java Kafka 消費積壓監控的示例代碼

到此這篇關于Java Kafka 消費積壓監控的文章就介紹到這了,更多相關Java Kafka 消費監控內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
啪啪亚洲精品| 国产欧美自拍| 精品精品国产三级a∨在线| 日本欧美在线| 欧美亚洲一区二区三区| 88久久精品| 国产精品一区二区美女视频免费看| 日韩高清中文字幕一区| 欧美一区不卡| 国产精品香蕉| 欧美激情一区| 精品不卡一区| 亚洲精品一级二级| 久久精品不卡| 国产精品91一区二区三区| 久久亚洲国产| 国产一区清纯| 视频一区欧美精品| 日韩不卡视频在线观看| 国产精品**亚洲精品| 国产精品欧美日韩一区| 久久亚洲黄色| 日韩欧美字幕| 激情综合自拍| 中文字幕一区二区三区在线视频| 亚洲精品大片| 麻豆精品少妇| 韩国精品主播一区二区在线观看| 欧美高清一区| 日韩精品中文字幕吗一区二区| 国产精品分类| 日本不良网站在线观看| 精品一区在线| 日本不卡的三区四区五区| 欧美激情一区| 亚洲手机视频| 欧美日韩1区2区3区| 国产一区国产二区国产三区| 日韩深夜视频| 在线看片日韩| 欧美黄色一区二区| 欧美.日韩.国产.一区.二区| 亚洲精品视频一二三区| 欧美国产不卡| 天堂资源在线亚洲| 伊人久久一区| 国产美女亚洲精品7777| 成人欧美一区二区三区的电影| 欧美在线亚洲综合一区| 日本视频在线一区| 欧洲一级精品| 日韩一区二区三免费高清在线观看| 久久精品国产亚洲aⅴ| 亚洲性色视频| 日韩三级精品| 日韩三区在线| 日韩精品久久久久久久软件91| 成人日韩av| 久久av一区| 精品国产精品久久一区免费式| 亚洲激精日韩激精欧美精品| 欧美日韩一区二区三区不卡视频 | 精品国产欧美日韩一区二区三区| se01亚洲视频| 天堂va欧美ⅴa亚洲va一国产| 成人在线视频区| 亚洲一区二区三区久久久| 欧美黄页在线免费观看| 日韩视频一区| 国产一区2区| 综合一区在线| 午夜av不卡| 91亚洲无吗| 国产尤物精品| 精品网站999| 蜜桃视频在线观看一区二区| 国产+成+人+亚洲欧洲在线| 亚洲区国产区| 999精品一区| 欧美极品一区二区三区| 中文一区一区三区免费在线观 | 水蜜桃久久夜色精品一区| 一区二区三区午夜视频| 亚洲黄色网址| 日韩动漫一区| 蜜桃国内精品久久久久软件9| 国产精品videossex| 蜜桃免费网站一区二区三区| 色天使综合视频| 精品视频在线你懂得| 色综合视频一区二区三区日韩 | 色爱综合av| 国产精品一区二区三区av麻| 爽好多水快深点欧美视频| av综合电影网站| 国产欧美一区二区色老头| 视频一区在线视频| 精品一区亚洲| 日韩电影免费网址| 久久亚洲人体| 国产精品日本一区二区三区在线 | 美女久久一区| 欧美综合另类| 最近高清中文在线字幕在线观看1| 国产探花在线精品| 国产精品美女久久久| 久久久久蜜桃| 韩国久久久久久| 精品一区二区三区免费看| 欧美日韩1区| 青青草国产精品亚洲专区无| 亚洲一级在线| 国产精品免费看| 尤物在线精品| 午夜在线视频一区二区区别| 狠狠色狠狠色综合日日tαg| 激情久久中文字幕| 天堂资源在线亚洲| 亚洲一级黄色| 欧美天堂亚洲电影院在线观看| 久久天堂成人| 久久久久欧美精品| 久久婷婷激情| 久久久精品久久久久久96| 色综合www| 久久九九电影| 影视先锋久久| 亚洲一区黄色| 六月婷婷一区| 亚洲精品亚洲人成在线观看| 亚洲免费成人av在线| 亚洲精品自拍| 久久国产婷婷国产香蕉| 国产精品白丝久久av网站| 国产精品一二| 国产极品一区| 国产日韩欧美一区二区三区| 国产精品日韩精品中文字幕| 久久三级中文| 日本а中文在线天堂| 日韩精品永久网址| 亚洲伦乱视频| 亚洲作爱视频| 亚洲区第一页| 国产精品毛片aⅴ一区二区三区| 精品久久精品| 国内精品福利| 亚洲人成毛片在线播放女女| 欧美亚洲二区| 98精品久久久久久久| 91精品亚洲| 久久99伊人| 国产人成精品一区二区三| 成人台湾亚洲精品一区二区| 香蕉久久99| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 国产精品欧美大片| 国产一区二区三区四区大秀 | 国产一区二区高清| 青草av.久久免费一区| 国产精品xvideos88| 精品91福利视频| 亚洲伦乱视频| 免费国产自线拍一欧美视频| 91精品国产一区二区在线观看| 久久三级中文| 欧美日韩国产在线一区| 日韩av不卡一区二区| 国产91在线播放精品| 亚洲免费观看| 国产一精品一av一免费爽爽| 成人片免费看| 在线看片一区| 国产一区二区三区日韩精品| 国产亚洲综合精品| 国产精品探花在线观看| 亚洲人成在线网站| 中文字幕日韩欧美精品高清在线| 国产精品宾馆| 亚洲精品1区2区| 老色鬼精品视频在线观看播放| 久久久久国产精品一区三寸| 日韩福利在线观看| 91精品久久久久久久久久不卡| 日韩国产一区二| 99久久亚洲精品蜜臀| 日韩高清不卡一区二区| 久久久久久美女精品| 欧美日韩亚洲一区三区| 91精品精品| 国产亚洲久久| 99久久九九| 国产精品一区免费在线| 亚洲女同中文字幕| 国际精品欧美精品| 亚洲一区av| 99精品电影| 国产精品一区二区三区www| 91久久午夜| 中文字幕在线视频久|