久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

使用spring boot 整合kafka,延遲啟動消費者

瀏覽:133日期:2023-02-18 15:50:56
spring boot 整合kafka,延遲啟動消費者

spring boot整合kafka的時候一般使用@KafkaListener來設置消費者,但是這種方式在spring啟動的時候就會立即開啟消費者。如果有需要根據配置信息延遲開啟指定的消費者就不能使用這種方式。

參考了類:KafkaListenerAnnotationBeanPostProcessor,我提取了一部分代碼。可以根據需要隨時動態的開啟消費者。還可以很方便的啟動多個消費者。

為了方便使用,我自定義了一個注解:

import org.springframework.kafka.annotation.TopicPartition; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; @Target({ ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface DelayKafkaConsumer { String id() default ''; String[] topics() default {}; String errorHandler() default ''; String groupId() default ''; TopicPartition[] topicPartitions() default {}; String beanRef() default '__listener';}配合注解使用的factory:

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.aop.framework.Advised;import org.springframework.aop.support.AopUtils;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.ListableBeanFactory;import org.springframework.beans.factory.ObjectFactory;import org.springframework.beans.factory.config.*;import org.springframework.context.expression.StandardBeanExpressionResolver;import org.springframework.core.MethodIntrospector;import org.springframework.core.annotation.AnnotationUtils;import org.springframework.core.convert.converter.Converter;import org.springframework.core.convert.converter.GenericConverter;import org.springframework.format.Formatter;import org.springframework.format.FormatterRegistry;import org.springframework.format.support.DefaultFormattingConversionService;import org.springframework.kafka.annotation.KafkaListenerConfigurer;import org.springframework.kafka.annotation.PartitionOffset;import org.springframework.kafka.annotation.TopicPartition;import org.springframework.kafka.config.KafkaListenerEndpoint;import org.springframework.kafka.config.KafkaListenerEndpointRegistrar;import org.springframework.kafka.config.MethodKafkaListenerEndpoint;import org.springframework.kafka.listener.KafkaListenerErrorHandler;import org.springframework.kafka.support.KafkaNull;import org.springframework.kafka.support.TopicPartitionInitialOffset;import org.springframework.messaging.converter.GenericMessageConverter;import org.springframework.messaging.handler.annotation.support.*;import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;import org.springframework.stereotype.Service;import org.springframework.util.Assert;import org.springframework.util.ReflectionUtils;import org.springframework.util.StringUtils; import java.lang.reflect.Method;import java.util.*;import java.util.concurrent.atomic.AtomicInteger; @Servicepublic class MyKafkaConsumerFactory implements KafkaListenerConfigurer,BeanFactoryAware { private static final Logger logger = LoggerFactory.getLogger(MyKafkaConsumerFactory.class); private KafkaListenerEndpointRegistrar kafkaListenerEndpointRegistrar; private final AtomicInteger counter = new AtomicInteger(); private BeanFactory beanFactory; private BeanExpressionResolver resolver = new StandardBeanExpressionResolver(); private BeanExpressionContext expressionContext; private final ListenerScope listenerScope = new ListenerScope(); private final KafkaHandlerMethodFactoryAdapter messageHandlerMethodFactory = new KafkaHandlerMethodFactoryAdapter(); @Override public void configureKafkaListeners(KafkaListenerEndpointRegistrar registrar) {this.kafkaListenerEndpointRegistrar = registrar;addFormatters(messageHandlerMethodFactory.defaultFormattingConversionService); } public void startConsumer(KafkaListenerEndpoint endpoint){kafkaListenerEndpointRegistrar.registerEndpoint(endpoint); } public void startConsumer(Object target){logger.info('start consumer {} ...',target.getClass());Class<?> targetClass = AopUtils.getTargetClass(target);Map<Method, Set<DelayKafkaConsumer>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,new MethodIntrospector.MetadataLookup<Set<DelayKafkaConsumer>>() { @Override public Set<DelayKafkaConsumer> inspect(Method method) {Set<DelayKafkaConsumer> listenerMethods = findListenerAnnotations(method);return (!listenerMethods.isEmpty() ? listenerMethods : null); } });if (annotatedMethods.size()==0) throw new IllegalArgumentException(target.getClass()+' need have method with @DelayKafkaConsumer');for (Map.Entry<Method, Set<DelayKafkaConsumer>> entry : annotatedMethods.entrySet()) { Method method = entry.getKey(); logger.info('find message listen handler method : {} , object : {}',method.getName(),target.getClass()); for (DelayKafkaConsumer listener : entry.getValue()) {if(listener.topics().length==0) { logger.info('topics value is empty , will skip it , method : {} , target object : {}',method.getName(),target.getClass()); continue;}processKafkaListener(listener,method,target);logger.info('register method {} success , target object : {}',method.getName(),target.getClass()); }}logger.info('{} consumer start complete .',target.getClass()); } protected void processKafkaListener(DelayKafkaConsumer kafkaListener, Method method, Object bean) {Method methodToUse = checkProxy(method, bean);MethodKafkaListenerEndpoint endpoint = new MethodKafkaListenerEndpoint();endpoint.setMethod(methodToUse);endpoint.setBeanFactory(this.beanFactory);String errorHandlerBeanName = resolveExpressionAsString(kafkaListener.errorHandler(), 'errorHandler');if (StringUtils.hasText(errorHandlerBeanName)) { endpoint.setErrorHandler(this.beanFactory.getBean(errorHandlerBeanName, KafkaListenerErrorHandler.class));}processListener(endpoint, kafkaListener, bean, methodToUse); } protected void processListener(MethodKafkaListenerEndpoint<?, ?> endpoint, DelayKafkaConsumer kafkaListener, Object bean, Object adminTarget) {String beanRef = kafkaListener.beanRef();if (StringUtils.hasText(beanRef)) { this.listenerScope.addListener(beanRef, bean);}endpoint.setBean(bean);endpoint.setMessageHandlerMethodFactory(this.messageHandlerMethodFactory);endpoint.setId(getEndpointId(kafkaListener));endpoint.setGroupId(getEndpointGroupId(kafkaListener, endpoint.getId()));endpoint.setTopics(resolveTopics(kafkaListener));endpoint.setTopicPartitions(resolveTopicPartitions(kafkaListener));kafkaListenerEndpointRegistrar.registerEndpoint(endpoint);if (StringUtils.hasText(beanRef)) { this.listenerScope.removeListener(beanRef);} } private String getEndpointId(DelayKafkaConsumer kafkaListener) {if (StringUtils.hasText(kafkaListener.id())) { return resolve(kafkaListener.id());}else { return 'Custom-Consumer' + this.counter.getAndIncrement();} } private String getEndpointGroupId(DelayKafkaConsumer kafkaListener, String id) {String groupId = null;if (StringUtils.hasText(kafkaListener.groupId())) { groupId = resolveExpressionAsString(kafkaListener.groupId(), 'groupId');}if (groupId == null && StringUtils.hasText(kafkaListener.id())) { groupId = id;}return groupId; } private String[] resolveTopics(DelayKafkaConsumer kafkaListener) {String[] topics = kafkaListener.topics();List<String> result = new ArrayList<>();if (topics.length > 0) { for (int i = 0; i < topics.length; i++) {Object topic = resolveExpression(topics[i]);resolveAsString(topic, result); }}return result.toArray(new String[result.size()]); } private void resolveAsString(Object resolvedValue, List<String> result) {if (resolvedValue instanceof String[]) { for (Object object : (String[]) resolvedValue) {resolveAsString(object, result); }}else if (resolvedValue instanceof String) { result.add((String) resolvedValue);}else if (resolvedValue instanceof Iterable) { for (Object object : (Iterable<Object>) resolvedValue) {resolveAsString(object, result); }}else { throw new IllegalArgumentException(String.format( '@DelayKafkaConsumer can’t resolve ’%s’ as a String', resolvedValue));} } private TopicPartitionInitialOffset[] resolveTopicPartitions(DelayKafkaConsumer kafkaListener) {TopicPartition[] topicPartitions = kafkaListener.topicPartitions();List<TopicPartitionInitialOffset> result = new ArrayList<>();if (topicPartitions.length > 0) { for (TopicPartition topicPartition : topicPartitions) {result.addAll(resolveTopicPartitionsList(topicPartition)); }}return result.toArray(new TopicPartitionInitialOffset[result.size()]); } private List<TopicPartitionInitialOffset> resolveTopicPartitionsList(TopicPartition topicPartition) {Object topic = resolveExpression(topicPartition.topic());Assert.state(topic instanceof String,'topic in @TopicPartition must resolve to a String, not ' + topic.getClass());Assert.state(StringUtils.hasText((String) topic), 'topic in @TopicPartition must not be empty');String[] partitions = topicPartition.partitions();PartitionOffset[] partitionOffsets = topicPartition.partitionOffsets();Assert.state(partitions.length > 0 || partitionOffsets.length > 0,'At least one ’partition’ or ’partitionOffset’ required in @TopicPartition for topic ’' + topic + '’');List<TopicPartitionInitialOffset> result = new ArrayList<>();for (int i = 0; i < partitions.length; i++) { resolvePartitionAsInteger((String) topic, resolveExpression(partitions[i]), result);} for (PartitionOffset partitionOffset : partitionOffsets) { Object partitionValue = resolveExpression(partitionOffset.partition()); Integer partition; if (partitionValue instanceof String) {Assert.state(StringUtils.hasText((String) partitionValue),'partition in @PartitionOffset for topic ’' + topic + '’ cannot be empty');partition = Integer.valueOf((String) partitionValue); } else if (partitionValue instanceof Integer) {partition = (Integer) partitionValue; } else {throw new IllegalArgumentException(String.format('@PartitionOffset for topic ’%s’ can’t resolve ’%s’ as an Integer or String, resolved to ’%s’',topic, partitionOffset.partition(), partitionValue.getClass())); } Object initialOffsetValue = resolveExpression(partitionOffset.initialOffset()); Long initialOffset; if (initialOffsetValue instanceof String) {Assert.state(StringUtils.hasText((String) initialOffsetValue),'’initialOffset’ in @PartitionOffset for topic ’' + topic + '’ cannot be empty');initialOffset = Long.valueOf((String) initialOffsetValue); } else if (initialOffsetValue instanceof Long) {initialOffset = (Long) initialOffsetValue; } else {throw new IllegalArgumentException(String.format('@PartitionOffset for topic ’%s’ can’t resolve ’%s’ as a Long or String, resolved to ’%s’',topic, partitionOffset.initialOffset(), initialOffsetValue.getClass())); } Object relativeToCurrentValue = resolveExpression(partitionOffset.relativeToCurrent()); Boolean relativeToCurrent; if (relativeToCurrentValue instanceof String) {relativeToCurrent = Boolean.valueOf((String) relativeToCurrentValue); } else if (relativeToCurrentValue instanceof Boolean) {relativeToCurrent = (Boolean) relativeToCurrentValue; } else {throw new IllegalArgumentException(String.format('@PartitionOffset for topic ’%s’ can’t resolve ’%s’ as a Boolean or String, resolved to ’%s’',topic, partitionOffset.relativeToCurrent(), relativeToCurrentValue.getClass())); } TopicPartitionInitialOffset topicPartitionOffset = new TopicPartitionInitialOffset((String) topic, partition, initialOffset, relativeToCurrent); if (!result.contains(topicPartitionOffset)) {result.add(topicPartitionOffset); } else {throw new IllegalArgumentException(String.format('@TopicPartition can’t have the same partition configuration twice: [%s]',topicPartitionOffset)); }}return result; } private void resolvePartitionAsInteger(String topic, Object resolvedValue, List<TopicPartitionInitialOffset> result) {if (resolvedValue instanceof String[]) { for (Object object : (String[]) resolvedValue) {resolvePartitionAsInteger(topic, object, result); }}else if (resolvedValue instanceof String) { Assert.state(StringUtils.hasText((String) resolvedValue), 'partition in @TopicPartition for topic ’' + topic + '’ cannot be empty'); result.add(new TopicPartitionInitialOffset(topic, Integer.valueOf((String) resolvedValue)));}else if (resolvedValue instanceof Integer[]) { for (Integer partition : (Integer[]) resolvedValue) {result.add(new TopicPartitionInitialOffset(topic, partition)); }}else if (resolvedValue instanceof Integer) { result.add(new TopicPartitionInitialOffset(topic, (Integer) resolvedValue));}else if (resolvedValue instanceof Iterable) { for (Object object : (Iterable<Object>) resolvedValue) {resolvePartitionAsInteger(topic, object, result); }}else { throw new IllegalArgumentException(String.format( '@DelayKafkaConsumer for topic ’%s’ can’t resolve ’%s’ as an Integer or String', topic, resolvedValue));} } private Set<DelayKafkaConsumer> findListenerAnnotations(Method method) {Set<DelayKafkaConsumer> listeners = new HashSet<>();DelayKafkaConsumer ann = AnnotationUtils.findAnnotation(method, DelayKafkaConsumer.class);if (ann != null) { listeners.add(ann);}return listeners; } private Method checkProxy(Method methodArg, Object bean) {Method method = methodArg;if (AopUtils.isJdkDynamicProxy(bean)) { try {method = bean.getClass().getMethod(method.getName(), method.getParameterTypes());Class<?>[] proxiedInterfaces = ((Advised) bean).getProxiedInterfaces();for (Class<?> iface : proxiedInterfaces) { try {method = iface.getMethod(method.getName(), method.getParameterTypes());break; } catch (NoSuchMethodException noMethod) { }} } catch (SecurityException ex) {ReflectionUtils.handleReflectionException(ex); } catch (NoSuchMethodException ex) {throw new IllegalStateException(String.format('target method ’%s’ found on bean target class ’%s’, ' +'but not found in any interface(s) for bean JDK proxy. Either ' +'pull the method up to an interface or switch to subclass (CGLIB) ' +'proxies by setting proxy-target-class/proxyTargetClass ' +'attribute to ’true’', method.getName(), method.getDeclaringClass().getSimpleName()), ex); }}return method; } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;if (beanFactory instanceof ConfigurableListableBeanFactory) { this.resolver = ((ConfigurableListableBeanFactory) beanFactory).getBeanExpressionResolver(); this.expressionContext = new BeanExpressionContext((ConfigurableListableBeanFactory) beanFactory, this.listenerScope);} } private String resolveExpressionAsString(String value, String attribute) {Object resolved = resolveExpression(value);if (resolved instanceof String) { return (String) resolved;}else { throw new IllegalStateException('The [' + attribute + '] must resolve to a String. ' + 'Resolved to [' + resolved.getClass() + '] for [' + value + ']');} } private Object resolveExpression(String value) {String resolvedValue = resolve(value);return this.resolver.evaluate(resolvedValue, this.expressionContext); } /** * Resolve the specified value if possible. * @param value the value to resolve * @return the resolved value * @see ConfigurableBeanFactory#resolveEmbeddedValue */ private String resolve(String value) {if (this.beanFactory instanceof ConfigurableBeanFactory) { return ((ConfigurableBeanFactory) this.beanFactory).resolveEmbeddedValue(value);}return value; } private void addFormatters(FormatterRegistry registry) {for (Converter<?, ?> converter : getBeansOfType(Converter.class)) { registry.addConverter(converter);}for (GenericConverter converter : getBeansOfType(GenericConverter.class)) { registry.addConverter(converter);}for (org.springframework.format.Formatter<?> formatter : getBeansOfType(Formatter.class)) { registry.addFormatter(formatter);} } private <T> Collection<T> getBeansOfType(Class<T> type) {if (this.beanFactory instanceof ListableBeanFactory) { return ((ListableBeanFactory) this.beanFactory).getBeansOfType(type).values();}else { return Collections.emptySet();} } private static class ListenerScope implements Scope { private final Map<String, Object> listeners = new HashMap<>(); ListenerScope() { super();} public void addListener(String key, Object bean) { this.listeners.put(key, bean);} public void removeListener(String key) { this.listeners.remove(key);} @Overridepublic Object get(String name, ObjectFactory<?> objectFactory) { return this.listeners.get(name);} @Overridepublic Object remove(String name) { return null;} @Overridepublic void registerDestructionCallback(String name, Runnable callback) {} @Overridepublic Object resolveContextualObject(String key) { return this.listeners.get(key);} @Overridepublic String getConversationId() { return null;} } private class KafkaHandlerMethodFactoryAdapter implements MessageHandlerMethodFactory { private final DefaultFormattingConversionService defaultFormattingConversionService = new DefaultFormattingConversionService(); private MessageHandlerMethodFactory messageHandlerMethodFactory; public void setMessageHandlerMethodFactory(MessageHandlerMethodFactory kafkaHandlerMethodFactory1) { this.messageHandlerMethodFactory = kafkaHandlerMethodFactory1;} @Overridepublic InvocableHandlerMethod createInvocableHandlerMethod(Object bean, Method method) { return getMessageHandlerMethodFactory().createInvocableHandlerMethod(bean, method);} private MessageHandlerMethodFactory getMessageHandlerMethodFactory() { if (this.messageHandlerMethodFactory == null) {this.messageHandlerMethodFactory = createDefaultMessageHandlerMethodFactory(); } return this.messageHandlerMethodFactory;} private MessageHandlerMethodFactory createDefaultMessageHandlerMethodFactory() { DefaultMessageHandlerMethodFactory defaultFactory = new DefaultMessageHandlerMethodFactory(); defaultFactory.setBeanFactory(MyKafkaConsumerFactory.this.beanFactory); ConfigurableBeanFactory cbf = (MyKafkaConsumerFactory.this.beanFactory instanceof ConfigurableBeanFactory ? (ConfigurableBeanFactory) MyKafkaConsumerFactory.this.beanFactory : null); defaultFactory.setConversionService(this.defaultFormattingConversionService); List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(); // Annotation-based argument resolution argumentResolvers.add(new HeaderMethodArgumentResolver(this.defaultFormattingConversionService, cbf)); argumentResolvers.add(new HeadersMethodArgumentResolver()); // Type-based argument resolution final GenericMessageConverter messageConverter = new GenericMessageConverter(this.defaultFormattingConversionService); argumentResolvers.add(new MessageMethodArgumentResolver(messageConverter)); argumentResolvers.add(new PayloadArgumentResolver(messageConverter) { @Overrideprotected boolean isEmptyPayload(Object payload) { return payload == null || payload instanceof KafkaNull;} }); defaultFactory.setArgumentResolvers(argumentResolvers); defaultFactory.afterPropertiesSet(); return defaultFactory;} }}

通過startConsumer來啟動一個消費者(多次調用會啟動多個消費者)。target必須至少包含一個有@DelayKafkaConsumer注解的方法。這里類似@KafkaListener。我去掉了一部分功能,保留了比較常用的部分。

這里提供了一個通過注解的方式在spring boot項目中動態控制consumer的方法。還有其他的方法來達到這種效果,不過我覺得這種方法比較方便。

java項目集成springboot使用kafka消費者,啟動失敗報錯 Failed to construct kafka consumer

之前博客里面提到本公司為物聯網項目。項目中使用mqtt+kafka進行與設備端的通訊,之前的協議格式為json格式,現在改成字節數組byte[]格式進行通信。

集成springboot后,具體的demo網上很多,接下來有時間會出一份kafka的demo。

報錯信息如下:

Failed to start bean ’org.springframework.kafka.config.internalKafkaListenerEndpointRegistry’; nested exception is org.apache.kafka.common.KafkaException:Failed to construct kafka consumer

原因分析:

之前json格式通信時候,構建kafka消費工廠的時候,其中ConcurrentMessageListenerContainer的key為String類型,而value現在為byte[]類型,所以構建消費者工廠的時候需要指定正確的value類型。

代碼如下:

public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, byte[]>> kafkaListenerContainerByteFactory() { ConcurrentKafkaListenerContainerFactory<String, byte[]> factory = new ConcurrentKafkaListenerContainerFactory<String, byte[]>(); factory.setConsumerFactory(consumerByteFactory()); factory.setConcurrency(concurrency); factory.getContainerProperties().setPollTimeout(1500); return factory; }

整體kafka生產者+kafka消費者的demo會在接下來的博客中陸續整理。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
主站蜘蛛池模板: 国产999精品久久久久久 | 欧美精品一区二区三区一线天视频 | 亚洲品质自拍视频网站 | 伊人91| 欧美xxxx网站 | 丁香五月亚洲综合在线 | 亚洲在线播放 | 国产成人av在线 | 国产亚洲一区二区三区在线观看 | chinese中国真实乱对白 | 国产精品伦一区二区三级视频 | 久久波多野结衣 | 欧美激情一区二区 | 亚洲欧洲日本国产 | 人妖天堂狠狠ts人妖天堂狠狠 | 亚洲色图88 | 久久免费99精品久久久久久 | 欧美日韩精品在线 | 香蕉视频黄色 | 男女羞羞视频免费观看 | 一区福利视频 | 久久久亚洲一区二区三区 | 久久久婷| 免费观看国产视频在线 | julia一区二区三区中文字幕 | 国产精品一区二区在线观看 | 中国一级特黄毛片大片 | 亚洲视频免费看 | 精品无码久久久久久国产 | www.一区| 99精品国产在热久久 | 欧美精品二区中文乱码字幕高清 | 欧美一级二级三级 | 欧美性一区二区 | 日本一区高清 | 午夜影院在线观看 | 精品一区二区在线观看 | 欧美福利一区二区三区 | 欧美在线一区二区 | 日日爱影视 | 中文字幕在线免费视频 | 欧美成年黄网站色视频 | www.亚洲 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 久久久精彩视频 | 免费午夜电影 | 中文字幕久久精品 | 一区二区精品视频 | 99久久99久久久精品色圆 | 欧美性18| 精品国产青草久久久久福利 | 亚洲精品一区二区三区在线播放 | 免费一区二区三区 | 狠狠中文字幕 | 91精品久久久久久久久 | a级片在线观看 | 日韩精品中文字幕在线观看 | 狠狠操中文字幕 | 一区二区网站 | 午夜欧美| 欧美精品不卡 | 亚洲国产精品久久久久久女王 | 欧美一区二区三区国产精品 | 久久久www成人免费精品 | 一级毛片网 | 91在线观看视频 | 国产亚洲视频在线观看 | 国产中文字幕亚洲 | 91精品国产综合久久香蕉922 | 黄版视频在线观看 | 亚洲伊人成人 | 久热最新 | 亚洲国产日韩a在线播放性色 | 91免费在线| 精品国产乱码久久久久久久软件 | 超碰免费在线观看 | 欧美精品欧美精品系列 | 在线视频91 | 在线观看91 | 亚洲 欧美 自拍偷拍 | 美日韩精品视频 | 午夜视频一区二区三区 | 伊人春色网 | 国产精品国产三级国产aⅴ中文 | 中文字幕在线不卡 | 亚洲精品aaa | 在线观看免费视频日韩 | 在线播放亚洲 | 国产中文视频 | 日韩精品一区在线 | 色一情一乱一伦一区二区三区 | 成人在线一区二区三区 | 毛片免费在线观看 | 国产精品久久嫩一区二区免费 | 99精品全国免费观看视频软件 | 日日操视频 | 欧洲精品视频在线观看 | 人人草在线观看视频 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | 久久精品99 | 免费在线成人 | 成人久久久 | 91国产精品| 国产精品视频播放 | 久久精品国产99国产 | 欧美黑人狂躁日本寡妇 | 日韩电影中文字幕 | a中文字幕 | 日韩中文在线 | 中文字幕欧美在线 | 久久精品日韩 | 欧美在线a| 天天舔天天干天天操 | www.色综合 | www国产网站 | 亚洲精品一区二三区不卡 | 欧美在线播放一区 | 91精品国产乱码久久蜜臀 | 免费在线一区二区 | av免费网| 午夜视频 | 成人一级视频在线观看 | 日韩不卡 | 你懂的在线视频播放 | 天天操妹子 | 性色av网| 亚洲精品日本 | 亚洲第一黄 | 天堂av2020 | 国产精品1区2区 | 国产又粗又长又硬又猛电影 | 亚洲一区久久 | 99精品久久 | av免费网站 | 久免费视频 | 一级大片免费观看 | 中文字幕在线观看精品视频 | 国产精品永久免费自在线观看 | 国产日韩精品一区二区 | 日韩国产在线观看 | 在线看www| 国产精品久久久久久久一区探花 | 日韩欧美综合在线 | 毛片真人毛毛片毛片 | 久久久久久久久综合 | 日日操视频 | 日韩一区二区三区福利视频 | 美国一级毛片a | 午夜精品久久久久久久星辰影院 | 亚洲欧美一区二区三区在线 | 毛片毛片毛片 | 亚洲一区二区精品在线观看 | 日韩在线一区二区 | 欧美高清一区 | 中文字幕在线视频免费播放 | 欧美日韩在线看 | 最新精品在线 | 91精品视频在线播放 | 国产精品久久久久一区二区三区 | 欧美久久视频 | 日本小视频网站 | 中国黄色在线视频 | 亚洲乱码国产乱码精品精的特点 | www久久九| av亚洲在线 | 久久国产婷婷国产香蕉 | 欧美日韩一区二区中文字幕 | 欧美精品一区二区三区蜜桃视频 | 国产乱码精品一区二区三区中文 | 一区免费视频 | 免费 视频 1级 | 午夜免| www.久久精品| 毛片网| 国产精品久久久久久亚洲影视 | 成人久久久| 四虎永久免费在线 | 国产成人精品免费视频大全最热 | 亚洲这里只有精品 | 亚洲精品一区二区三区不 | 日韩精品在线观看视频 | 国产欧美一二三区在线粉嫩 | 日本狠狠操| 91精品久久久久久久久久 | 99精品国产在热久久 | 成人日韩av | 亚洲区国产区 | 成人亚洲一区二区 | 亚洲精品乱码久久久久久不卡 | 男人的天堂视频网站 | 久久成人在线视频 | 天堂一区二区三区在线 | 日韩视频在线观看一区 | 成年人在线视频 | 国产高清久久久 | 亚洲欧美一区二区三区在线 | 亚洲一区在线视频 | 欧美黄色性视频 | 久久情趣视频 | 欧美性18 | 国产免费一区二区 | 国产精品久久久久久久久久妞妞 | 亚洲成人精品影视 | 在线欧美日韩 | 成人在线网| 欧美日韩综合 | 成人精品久久久 | 精品九九| 91亚洲免费视频 | 麻豆精品国产91久久久久久 | 97爱爱爱| 久久人人网 | 极品一区 | 精品亚洲一区二区 | 亚洲国产伊人 | 日韩成年人视频 | 刘亦菲的毛片 | 成人免费在线播放 | 色久视频| av免费在线观看网站 | 国产成人欧美一区二区三区的 | 成人深夜免费视频 | 亚洲区一区二 | 97精品视频 | 久久久久久久久一区二区三区 | 这里只有精品在线视频观看 | 亚洲精品美女久久久 | 777777777亚洲妇女 | 男女视频在线免费观看 | 免费在线一区二区三区 | 99re国产精品视频 | 天堂在线www| 国产麻豆一区二区三区 | 四虎影院入口 | 国产精品99久久久久久宅男 | 在线免费观看色视频 | 欧美国产日韩精品 | 高清视频一区 | 成人精品视频免费 | 国产视频福利在线观看 | 久久视频精品 | 国产成人视屏 | 日摸夜操 | 欧美日韩国产在线观看 | 国产一区二区精品 | 欧美精品一区三区 | 91在线视频播放 | 亚洲国产精品成人久久久 | 中文字幕在线观看www | 国产精品久久国产愉拍 | 欧美国产精品久久久 | 久久香蕉国产视频 | 日韩日韩日韩日韩日韩日韩日韩 | 亚洲成人久久久久 | 国产精品久久久久久中文字 | 一区二区三区免费在线观看 | 亚洲国产婷婷香蕉久久久久久99 | 国产欧美久久一区二区三区 | 中文字幕日韩欧美 | 成年人在线观看 | 色综合天天综合网国产成人网 | 亚洲一区| 97天堂 | 国产二区视频 | 伊人网亚洲 | 国产精品国产三级国产aⅴ9色 | t66y最新地址一地址二69 | 国产在线在线 | 国产欧精精久久久久久久 | 91精品国产综合久久久久久丝袜 | 97超碰自拍| 亚洲午夜精品视频 | 精品国产乱码久久久久久丨区2区 | 久久久久国产一区二区三区 | 品久久久久久久久久96高清 | 久久久久久久一区 | 在线干| 成人在线观看h | 亚洲一区二区三区蜜桃 | 天天天天爽 | 久久综合一区二区三区 | 一级毛片中国 | 日韩一区中文字幕 | 九九久久久| 亚洲一区二区三区在线免费观看 | 天天干视频| 韩国精品一区 | 91精品国产综合久久久久久漫画 | 欧美一区二区在线免费观看 | 国产亚洲精品精品国产亚洲综合 | 欧美一区二 | 在线观看成人高清 | 欧美亚洲91 | 欧美狠狠操 | 中文精品久久久 | 色99在线| 欧美视频在线播放 | 日韩欧美国产一区二区 | 黄色网免费看 | 欧美色综合一区二区三区 | 国产成人一级毛片 | 日产一区二区 | 日本一二三区在线 | 成人精品视频99在线观看免费 | 国产a免费| 欧美成视频 | 色九九 | ririsao亚洲国产中文 | 欧美日韩国产一区二区 | 亚洲成年人网站在线观看 | 一区二区三区的视频 | 精品国产乱码久久久久久1区2区 | 国产精品丝袜视频 | jizz在亚洲 | 黄色大片免费网站 | 日韩国产在线 | 在线成人av | 久久精品一区视频 | 一区二区三区免费av | 亚洲精品一区二三区不卡 | 欧洲亚洲精品久久久久 | 国产精品久久久一区二区 | 亚洲精品乱码久久久久久麻豆不卡 | 中文字幕在线观看亚洲 | 免费的一级黄色片 | 亚洲欧洲精品成人久久奇米网 | 国产最好的精华液网站 | 成年人精品视频 | www.国产精品 | 久久久久久成人 | 亚洲91| 国产一区二区三区四区在线观看 | 免费在线成人av | 久久va| 久久久久国产精品免费免费搜索 | 在线观看91精品国产入口 | 综合久久综合久久 | 二区三区在线观看 | 青青久久 | 欧美在线影院 | 日韩欧美在线视频免费观看 | 日日干夜夜干 | 激情欧美日韩一区二区 | 欧美在线视频一区 | 免费看91| 亚洲成人久久久 | 亚洲一二三区在线观看 | 成人影院av| 日韩精品在线一区 | 欧美在线国产 | 亚洲成人精品av | 亚洲视频免费 | 欧美成人免费一级人片100 | 日本最新免费二区 | 中文字幕在线视频精品 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | xnxx 美女19| 国产视频一区二区在线 | 中文字幕综合在线 | 欧美国产日韩一区 | 新疆少妇videos高潮 | 成人一级视频在线观看 | 九九热有精品 | 国产大奶视频 | 99视频在线播放 | 亚洲成av | 国产大毛片 | 美女久久久久 | 99久久视频| 久久99精品久久久久久久青青日本 | 日本三级网站在线观看 | 国产一区av在线 | 成人男女激情免费视频 | 九九视频这里只有精品 | 亚洲精品在线视频 | 精品一二三区 | 91在线观| 欧美福利影院 | 日韩视频精品在线 | 成人av观看 | www.国产 | 99视频免费看 | 91亚洲国产成人精品性色 | 欧美黑人巨大xxx极品 | 伊人狠狠 | 精品久久一区二区三区 | 一二三区不卡视频 | 欧美日本高清 | 国内自拍偷拍视频 | 久久久www成人免费无遮挡大片 | 久热久热 | 日韩成人精品视频在线观看 | 99热免费精品 | 欧美精品在线一区二区三区 | 成人在线播放 | av女人的天堂 | 欧美午夜精品一区二区三区电影 | 国产精品久久国产精品99 gif | 成人午夜视频网 | 一级毛片色一级 | 久久综合一区二区 | 狠狠干av| 欧美日韩不卡合集视频 | 精品在线一区二区 | 精品免费视频 | 欧美激情一区二区 | 久久九九国产 | 中文字幕免费在线 | 久久国内 | 亚洲国产精品久久久久久 | 热99这里只有精品 | 精品国产欧美一区二区三区成人 | 久操成人| 在线国产专区 | 91精品久久久久久久久久 | 国外成人在线视频网站 | 亚洲成人一区二区 | 黄色在线免费观看 | 日韩一区二区影视 | 国产亚洲一区二区三区 | 国产2区 | 一级黄色毛片a | 五月网婷婷 | 国产一区二区三区免费视频 | 91看片官网 | 视频一区二区三区在线观看 | 亚洲精品久久久久久久久久久久久 | 精品国产91乱码一区二区三区 | 岛国av一区| 成人在线网址 | 国产视频黄在线观看 | 午夜www| 一级性视频 | 色黄视频在线观看 | 久草中文在线 | 伊人网综合在线 | 久久亚洲精品国产一区 | 日本久久艹 | 国产午夜精品一区二区三区 | 亚洲高清在线观看 | 久在线视频播放免费视频 | 久久久精品久久久久 | 久久se精品一区精品二区 | 99热婷婷 | 色资源站 | 精品在线不卡 | 性色在线| 国产在线观看高清 | ririsao久久精品一区 | 亚洲免费视频网站 | 欧美亚洲日本 | 亚洲一区二区三区在线播放 | 一区二区三区小视频 | 无套内谢孕妇毛片免费看红桃影视 | 成人亚洲网 | 成人国产精品色哟哟 | 日本中文字幕在线观看 | 天天澡天天狠天天天做 | 国产一区二区三区不卡在线观看 | 成人一区二区电影 | 天天摸天天看 | 国产精品一区一区 | 久久99国产精品久久99果冻传媒 | 亚洲精品久久久久久国产精华液 | 天天干天天av | 亚洲精品成人av | 韩国精品一区 | av一区二区在线观看 | 国产一区二区久久 | 一区二区三区国产精品 | 久久成人精品 | 亚洲综合视频 | 精品久久久久久久久久久久久久 | 亚洲女人天堂成人av在线 | 国产伦精品一区二区三区四区视频_ | 天天干网| 成人小视频在线观看 | 欧美成人伊人 | 久草成人 | 精品国产乱码久久久久夜 | 欧美视频一二 | 成人免费视频网站在线看 | 日本美女一区二区三区 | 成人h漫在线观看 | 老司机午夜免费精品视频 | 欧美精品欧美极品欧美激情 | 久草免费在线 | 午夜精品网站 | xx视频在线观看 | 欧美精品久久久 | 成人在线h | 欧美日韩中文字幕 | 欧美精品欧美精品系列 | 日韩视频免费在线 | 成人免费看 | 欧美日韩在线电影 | 日本黄色大片 | 精品久久久久久久久福利 | 中文字幕 亚洲一区 | 精品一区二区三区视频 | 亚洲高清视频网站 | 欧美日韩国产综合视频 | 在线观看国精产品二区1819 | 亚洲欧美国产精品久久 | 黄色网页大全 | 国产亚洲精品精品国产亚洲综合 | 三级视频在线观看 | 日韩日韩日韩日韩日韩日韩日韩 | 日韩在线 | 一区二区国产精品 | 自拍视频在线观看免费 | 久久久久久成人 | 香蕉久久网 | 久久久成人网 | 亚洲精品电影在线观看 | 欧美视频在线免费 | 能直接看的av网站 | 久草热8精品视频在线观看 欧美全黄 | 成人羞羞网站 | 97在线免费观看 | 国产中文在线 | 免费一区二区三区 | 中字一区| 欧洲免费av | 久久人人av | 久草视频在线播放 | 日本在线小视频 | 国产一区二 | 国精品一区 | 久草成人网 | 中文字幕在线电影观看 | 国产高清免费视频 | 精品久久久久久久久久久久久久 | 中文字幕在线视频免费播放 | 在线观看亚洲大片短视频 | www,四虎| 在线观看欧美一区 | 国产亚洲精品久 | 玖玖精品 | 特黄级国产片 | 特黄特色大片免费视频观看 | 国产激情视频在线 | 亚洲精品a在线观看 | 九九综合| 国产成人精品一区二 | 丁香婷婷综合激情五月色 | 欧美日韩国产一区二区三区 | 亚洲 欧美 综合 | 精品国产一区二区三区小蝌蚪 | 欧美一级特黄aaaaaaa视频片 | 天天操夜夜爽 | 一区二区三区回区在观看免费视频 | 草草视频在线免费观看 | 国产一级纯肉体一级毛片 | 国产成人综合一区二区三区 | 国产成人久久 | 老司机狠狠爱 | www.中文字幕在线 | 日韩精品一区二区三区 | 日韩av免费在线观看 | 久久久久久久国产精品 | aa级毛片毛片免费观看久 | 亚洲欧洲日本国产 | 成人国产 | 黄色影片网址 | 久久99热精品免费观看牛牛 | 国产三级网站 | 精品国产鲁一鲁一区二区在线观看 | 精品国偷自产国产一区 | 1000部精品久久久久久久久 | 亚洲欧美韩国 | 中文字幕亚洲第一 | 欧美日韩视频在线第一区 | 久久99国产精品久久99果冻传媒 | 成人免费xxxxxxx | 九色国产 | www.91av在线| 国产一二三四在线 | 久热精品视频在线播放 | 九色在线观看 | 亚洲成人精品视频 | 精品国产不卡一区二区三区 | 国产美女久久 | 欧美大片一区二区 | 中文字幕一区二区三区不卡 | 国产亚洲欧美一区二区 | 日韩精品视频在线观看免费 | 人人种亚洲 | 亚洲不卡网站 | 日韩国产 | 国产高清视频在线观看 | 国产精品久久久久国产a级 99精品欧美一区二区三区综合在线 | 91精品综合久久久久久五月天 | 一级黄色片视频 | 欧美日韩精品一区二区在线播放 | 日韩国产在线 | 一级黄色录像视频 | 中文字幕日韩欧美一区二区三区 | 成人免费在线电影 | 依人久久| 一区在线看 | 免费一看一级毛片 | 三级黄色片在线播放 | 日韩高清成人 | 日韩久久一区二区 | 欧美激情一区二区三区在线视频 | 国产中文区二幕区2012 | 爱福利视频 | www.久久 | 天堂免费在线 | a在线观看| 麻豆久久精品 | 欧美一级免费播放 | 成人免费视频网站在线看 | 午夜影院免费看 |