黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術(shù)文章
文章詳情頁

源碼解讀Spring-Integration執(zhí)行過程

瀏覽:170日期:2023-07-10 17:37:36
一,前言

Spring-Integration基于Spring,在應(yīng)用程序中啟用了輕量級消息傳遞,并支持通過聲明式適配器與外部系統(tǒng)集成。這一段官網(wǎng)的介紹,概況了整個(gè)Integration的用途。個(gè)人感覺消息傳遞是真正的重點(diǎn)。

源碼解讀Spring-Integration執(zhí)行過程

如上圖所示,典型的生產(chǎn)者-消費(fèi)者模式,中間通過一個(gè)特定的通道進(jìn)行數(shù)據(jù)傳輸,說到這,是不是隱隱感覺到queue的存在。確實(shí)事實(shí)上這個(gè)所謂的通道默認(rèn)就是用的 blockingqueue。

Spring-Integration網(wǎng)上的資料是真少,再加上源碼分析的是更少。關(guān)于Spring-Integration的基本介紹直接去官網(wǎng)上看更加的直觀,這邊就不累述了。

今天主要是看個(gè)簡單的hello word進(jìn)來分析下整個(gè)執(zhí)行過程。

先看下代碼:

<?xml version='1.0' encoding='UTF-8'?><beans:beans xmlns='http://www.springframework.org/schema/integration'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xmlns:beans='http://www.springframework.org/schema/beans'xsi:schemaLocation='http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/integrationhttps://www.springframework.org/schema/integration/spring-integration.xsd'><annotation-config/><channel ><queue/></channel><beans:bean /></beans:beans>

@Configurationpublic class Beans { @ServiceActivator(inputChannel = 'ic', outputChannel = 'oc') public String sayHello(String name) {return 'Hello ' + name; }}

public class HelloWorldDemo { @Test public void testDemo() throws Exception {ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext('/demo.xml', HelloWorldDemo.class);DirectChannel inputChannel = context.getBean('ic', DirectChannel.class);PollableChannel outputChannel = context.getBean('oc', PollableChannel.class);inputChannel.send(new GenericMessage<String>('World'));System.out.println('==> HelloWorldDemo: ' + outputChannel.receive(0).getPayload());context.close(); }}out:==> HelloWorldDemo: Hello World二,ServiceActivator

上面的代碼演示了調(diào)用方法的入站通道適配器和標(biāo)準(zhǔn)的出站通道適配器, 它們之間是一個(gè)帶注解的ServiceActivator。關(guān)于這個(gè)ServiceActivator就是一個(gè)消息端點(diǎn)。

消息端點(diǎn)的主要作用是以非侵入性方式將應(yīng)用程序代碼連接到消息傳遞框架。換句話說,理想情況下,應(yīng)用程序代碼應(yīng)該不知道消息對象或消息管道。這類似于 MVC 范式中controller 的作用。正如controller 處理 HTTP 請求一樣,消息端點(diǎn)處理消息。以及controller 映射到 URL 模式一樣,消息端點(diǎn)映射到消息通道。這兩種情況的目標(biāo)是相同的。

ServiceActivator是用于將服務(wù)實(shí)例連接到消息傳遞系統(tǒng)的通用端點(diǎn)。必須配置輸入消息通道,如果要調(diào)用的服務(wù)方法能夠返回值,還可以提供輸出消息通道。

具體流程如下圖:

源碼解讀Spring-Integration執(zhí)行過程

上面的代碼比較簡單,但是或許會發(fā)現(xiàn)我們只定義了輸出通道oc,輸入通道ic竟然沒有定義也能正常應(yīng)用,是不是很奇怪?帶著疑問我們先看下ServiceActivator的源碼:

源碼解讀Spring-Integration執(zhí)行過程

注釋上寫的很清楚,如果輸入通道不存在,將在應(yīng)用程序上下文中注冊具有此名稱的DirectChannel 。具體在哪定義,我們后面會看到,現(xiàn)在不急,先一步步來看他的執(zhí)行過程。

我們?nèi)植檎襍erviceActivator,看他是哪邊進(jìn)行處理的,最后發(fā)現(xiàn)了MessagingAnnotationPostProcessor類,用來處理方法級消息注解的BeanPostProcessor實(shí)現(xiàn)。

源碼解讀Spring-Integration執(zhí)行過程

@Overridepublic void afterPropertiesSet() {Assert.notNull(this.beanFactory, 'BeanFactory must not be null');((BeanDefinitionRegistry) this.beanFactory).registerBeanDefinition(IntegrationContextUtils.DISPOSABLES_BEAN_NAME,BeanDefinitionBuilder.genericBeanDefinition(Disposables.class, Disposables::new).getRawBeanDefinition());this.postProcessors.put(Filter.class, new FilterAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(Router.class, new RouterAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(Transformer.class, new TransformerAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(ServiceActivator.class, new ServiceActivatorAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(Splitter.class, new SplitterAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(Aggregator.class, new AggregatorAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(InboundChannelAdapter.class,new InboundChannelAdapterAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(BridgeFrom.class, new BridgeFromAnnotationPostProcessor(this.beanFactory));this.postProcessors.put(BridgeTo.class, new BridgeToAnnotationPostProcessor(this.beanFactory));Map<Class<? extends Annotation>, MethodAnnotationPostProcessor<?>> customPostProcessors =setupCustomPostProcessors();if (!CollectionUtils.isEmpty(customPostProcessors)) {this.postProcessors.putAll(customPostProcessors);}}

在afterPropertiesSet方法中,我們看到定義了一個(gè)后處理器postProcessors,里面注冊了相關(guān)的注解處理類。包含各種消息端點(diǎn)處理,除了上面寫的ServiceActivator,還有過濾器,路由,轉(zhuǎn)換器等各種不同的端點(diǎn)方法。

接著往向下看,既然實(shí)現(xiàn)了BeanPostProcessor,那必然要用到postProcessAfterInitialization方法實(shí)現(xiàn),這里的流程大概就是遍歷出包含有@ServiceActivator的bean方法,用來做后續(xù)處理。我們直接看重點(diǎn)的代碼。

Object result = postProcessor.postProcess(bean, beanName, targetMethod, annotations);三,postProcess

在AbstractMethodAnnotationPostProcessor中有個(gè)共通方法postProcess用來生成對應(yīng)的端點(diǎn)信息。具體代碼:

@Overridepublic Object postProcess(Object bean, String beanName, Method method, List<Annotation> annotations) {Object sourceHandler = null;if (beanAnnotationAware() && AnnotatedElementUtils.isAnnotated(method, Bean.class.getName())) {if (!this.beanFactory.containsBeanDefinition(resolveTargetBeanName(method))) {this.logger.debug('Skipping endpoint creation; perhaps due to some ’@Conditional’ annotation.');return null;}else {sourceHandler = resolveTargetBeanFromMethodWithBeanAnnotation(method);}}//生成對應(yīng)的MessageHandler,用來執(zhí)行對應(yīng)的注解的方法MessageHandler handler = createHandler(bean, method, annotations);if (!(handler instanceof ReactiveMessageHandlerAdapter)) {orderable(method, handler);producerOrRouter(annotations, handler);if (!handler.equals(sourceHandler)) {handler = registerHandlerBean(beanName, method, handler);}handler = annotated(method, handler);handler = adviceChain(beanName, annotations, handler);}//將MessageHandler實(shí)現(xiàn)連接到消息端點(diǎn),生成對應(yīng)的endpoint。AbstractEndpoint endpoint = createEndpoint(handler, method, annotations);if (endpoint != null) {return endpoint;}else {return handler;}}

這里面主要是兩件事:

根據(jù)模板模式中不同的createHandler抽象方法實(shí)現(xiàn),生成對應(yīng)的MessageHandler。譬如說我們這邊的ServiceActivatorAnnotationPostProcessor 將MessageHandler實(shí)現(xiàn)連接到消息端點(diǎn),生成對應(yīng)的endpoint。

1.createHandler

@Overrideprotected MessageHandler createHandler(Object bean, Method method, List<Annotation> annotations) {AbstractReplyProducingMessageHandler serviceActivator;if (AnnotatedElementUtils.isAnnotated(method, Bean.class.getName())) {...else {serviceActivator = new ServiceActivatingHandler(bean, method);}String requiresReply = MessagingAnnotationUtils.resolveAttribute(annotations, 'requiresReply', String.class);if (StringUtils.hasText(requiresReply)) {serviceActivator.setRequiresReply(resolveAttributeToBoolean(requiresReply));}String isAsync = MessagingAnnotationUtils.resolveAttribute(annotations, 'async', String.class);if (StringUtils.hasText(isAsync)) {serviceActivator.setAsync(resolveAttributeToBoolean(isAsync));}//是否設(shè)置了輸出通道setOutputChannelIfPresent(annotations, serviceActivator);return serviceActivator;}

createHandler的代碼比較簡單,就是根據(jù)注解中的幾個(gè)屬性還有對應(yīng)的方法參數(shù),生成ServiceActivatingHandler。追溯下去ServiceActivatingHandler中最后會生成一個(gè)委托對象MessagingMethodInvokerHelper用來以反射的方式來執(zhí)行目標(biāo)方法。

2.createEndpoint

createEndpoint字面上都能知道是生成消息端點(diǎn),事實(shí)上也是,把生成的handler和對應(yīng)的管道進(jìn)行關(guān)聯(lián)。具體看下代碼體會:

protected AbstractEndpoint createEndpoint(MessageHandler handler, @SuppressWarnings('unused') Method method,List<Annotation> annotations) {AbstractEndpoint endpoint = null;//取得注解中inputChannelName String inputChannelName = MessagingAnnotationUtils.resolveAttribute(annotations, getInputChannelAttribute(),String.class);if (StringUtils.hasText(inputChannelName)) {MessageChannel inputChannel;try {//從beanFactory中取得對應(yīng)的通道beaninputChannel = this.channelResolver.resolveDestination(inputChannelName);}catch (DestinationResolutionException e) { //取不到,則自動注冊一個(gè)類型為DirectChannel的inputChannel if (e.getCause() instanceof NoSuchBeanDefinitionException) {inputChannel = new DirectChannel();this.beanFactory.registerSingleton(inputChannelName, inputChannel);inputChannel = (MessageChannel) this.beanFactory.initializeBean(inputChannel, inputChannelName);if (this.disposables != null) {this.disposables.add((DisposableBean) inputChannel);}}else {throw e;}}Assert.notNull(inputChannel, () -> 'failed to resolve inputChannel ’' + inputChannelName + '’');//生成endpoint endpoint = doCreateEndpoint(handler, inputChannel, annotations);}return endpoint;}

上面的代碼中,我們就能清楚的看到為什么我們在demo中沒有注冊輸入通道也能正常應(yīng)用的原因了,從而回答之前的疑問。

protected AbstractEndpoint doCreateEndpoint(MessageHandler handler, MessageChannel inputChannel,List<Annotation> annotations) {....else if (inputChannel instanceof SubscribableChannel) {//生成SubscribableChannel類型對應(yīng)的執(zhí)行端點(diǎn)return new EventDrivenConsumer((SubscribableChannel) inputChannel, handler);}else if (inputChannel instanceof PollableChannel) {return pollingConsumer(inputChannel, handler, pollers);}else {throw new IllegalArgumentException('Unsupported ’inputChannel’ type: ’'+ inputChannel.getClass().getName() + '’. ' +'Must be one of ’SubscribableChannel’, ’PollableChannel’ or ’ReactiveStreamsSubscribableChannel’');}}

通道類型一共有兩種,一種是發(fā)布訂閱,一種是可輪詢的,我們是默認(rèn)是走的第一種,因?yàn)镈irectChannel默認(rèn)就是個(gè)SubscribableChannel。所以最終我們生成了對應(yīng)的信息端點(diǎn)類EventDrivenConsumer。

我們先看下EventDrivenConsumer整體結(jié)構(gòu):

源碼解讀Spring-Integration執(zhí)行過程

EventDrivenConsumer上面有一個(gè)抽象類AbstractEndpoint,最上面實(shí)現(xiàn)了Lifecycle接口,所以生命周期跟著容器走,我們直接跳到star方法看:

@Overrideprotected void doStart() {this.logComponentSubscriptionEvent(true);//把handler和inputChannel進(jìn)行綁定this.inputChannel.subscribe(this.handler);if (this.handler instanceof Lifecycle) {((Lifecycle) this.handler).start();}}

@Overridepublic synchronized boolean addHandler(MessageHandler handler) {Assert.notNull(handler, 'handler must not be null');Assert.isTrue(this.handlers.size() < this.maxSubscribers, 'Maximum subscribers exceeded');boolean added = this.handlers.add(handler);if (this.handlers.size() == 1) {this.theOneHandler = handler;}else {this.theOneHandler = null;}return added;}

上面的代碼主要就是把handler注冊到inputChannel中,這樣只要inputChannel通道一收到信息,就會通知他注冊的handlers進(jìn)行處理。代碼中比較清楚的記錄了一切的操作,就不多解釋了。

四,發(fā)送信息

執(zhí)行完上面一系列的注冊,已經(jīng)把這一些的通道打通了,剩下的就是真正的發(fā)送操作了。下面分析下inputChannel.send(new GenericMessage<String>('World'));看看send操作:

/** * 在此頻道上發(fā)送消息。 如果通道已滿,則此方法將阻塞,直到發(fā)生超時(shí)或發(fā)送線程中斷。 如果指定的超時(shí)時(shí)間為 0,則該方法將立即返回。 如果小于零,它將無限期阻塞(請參閱send(Message) )。 * 參數(shù): * messageArg ? 要發(fā)送的消息 * timeout - 以毫秒為單位的超時(shí)時(shí)間 * 返回: * true如果消息發(fā)送成功, false如果消息無法在規(guī)定時(shí)間內(nèi)發(fā)送或發(fā)送線程被中斷 */@Override public boolean send(Message<?> messageArg, long timeout) {...try {//message是否需要轉(zhuǎn)換message = convertPayloadIfNecessary(message);//發(fā)送前攔截器if (interceptorList.getSize() > 0) {interceptorStack = new ArrayDeque<>();message = interceptorList.preSend(message, this, interceptorStack);if (message == null) {return false;}}if (this.metricsCaptor != null) {sample = this.metricsCaptor.start();}//發(fā)送操作sent = doSend(message, timeout);if (sample != null) {sample.stop(sendTimer(sent));}metricsProcessed = true;if (debugEnabled) {logger.debug('postSend (sent=' + sent + ') on channel ’' + this + '’, message: ' + message);}//發(fā)送后攔截器if (interceptorStack != null) {interceptorList.postSend(message, this, sent);interceptorList.afterSendCompletion(message, this, sent, null, interceptorStack);}return sent;}catch (Exception ex) {...}}

真正的send操作跟下去,會發(fā)現(xiàn)層次極深,礙于篇幅,我們直接跟到重點(diǎn)代碼:

@Overrideprotected final void handleMessageInternal(Message<?> message) {Object result;if (this.advisedRequestHandler == null) {//反射執(zhí)行對應(yīng)的端點(diǎn)方法result = handleRequestMessage(message);}else {result = doInvokeAdvisedRequestHandler(message);}if (result != null) {//往outputChannel發(fā)送執(zhí)行結(jié)果 sendOutputs(result, message);}...}

handleRequestMessage的操作就是用之前我們handler中的委托類MessagingMethodInvokerHelper去反射運(yùn)行對應(yīng)的端點(diǎn)方法,然后把執(zhí)行結(jié)果發(fā)送outputChannel。最后我們直接定位到具體的發(fā)送操作:

@Overrideprotected boolean doSend(Message<?> message, long timeout) {Assert.notNull(message, '’message’ must not be null');try {if (this.queue instanceof BlockingQueue) {BlockingQueue<Message<?>> blockingQueue = (BlockingQueue<Message<?>>) this.queue;if (timeout > 0) {return blockingQueue.offer(message, timeout, TimeUnit.MILLISECONDS);}if (timeout == 0) {return blockingQueue.offer(message);}blockingQueue.put(message);return true;}else {try {return this.queue.offer(message);}finally {this.queueSemaphore.release();}}}catch (InterruptedException e) {Thread.currentThread().interrupt();return false;}}

看到這,我們就明白了數(shù)據(jù)的去向,存儲在隊(duì)列里了,生產(chǎn)者產(chǎn)生的數(shù)據(jù)就已經(jīng)生成了,所以發(fā)送的操作基本上就告一段落了。

五,接收信息

數(shù)據(jù)已經(jīng)生成,后面就是看如何消費(fèi)操作了,下面分析下 outputChannel.receive(0).getPayload()操作:

/** * 從該通道接收第一條可用消息。 如果通道不包含任何消息,則此方法將阻塞,直到分配的超時(shí)時(shí)間過去。 如果指定的超時(shí)時(shí)間為 0,則該方法將立即返回。 如果小于零,它將無限期阻塞(參見receive() )。 * 參數(shù): * timeout - 以毫秒為單位的超時(shí)時(shí)間 * 返回: * 如果在分配的時(shí)間內(nèi)沒有可用的消息或接收線程被中斷,則為第一個(gè)可用消息或null 。 */@Override // NOSONAR complexity@Nullablepublic Message<?> receive(long timeout) {...try {//接受前攔截器操作if (interceptorList.getSize() > 0) {interceptorStack = new ArrayDeque<>();//一旦調(diào)用接收并在實(shí)際檢索消息之前調(diào)用if (!interceptorList.preReceive(this, interceptorStack)) {return null;}}//接收操作Message<?> message = doReceive(timeout);...//在檢索到 Message 之后但在將其返回給調(diào)用者之前立即調(diào)用。 必要時(shí)可以修改消息if (interceptorStack != null && message != null) {message = interceptorList.postReceive(message, this);}//在接收完成后調(diào)用,而不管已引發(fā)的任何異常,從而允許適當(dāng)?shù)馁Y源清理interceptorList.afterReceiveCompletion(message, this, null, interceptorStack);return message;}catch (RuntimeException ex) {...}}

最后的doReceive操作,其實(shí)大家都心知肚明了,就是從上面的隊(duì)列中直接讀取數(shù)據(jù),代碼比較簡單,就不注釋了:

@Override@Nullableprotected Message<?> doReceive(long timeout) {try {if (timeout > 0) {if (this.queue instanceof BlockingQueue) {return ((BlockingQueue<Message<?>>) this.queue).poll(timeout, TimeUnit.MILLISECONDS);}else {return pollNonBlockingQueue(timeout);}}if (timeout == 0) {return this.queue.poll();}if (this.queue instanceof BlockingQueue) {return ((BlockingQueue<Message<?>>) this.queue).take();}else {Message<?> message = this.queue.poll();while (message == null) {this.queueSemaphore.tryAcquire(50, TimeUnit.MILLISECONDS); // NOSONAR ok to ignore resultmessage = this.queue.poll();}return message;}}catch (InterruptedException e) {Thread.currentThread().interrupt();return null;}}六,結(jié)語

能堅(jiān)持看到這的,基本上都是勇士了。這一系列的執(zhí)行過程其實(shí)還是比較繞的,我估計(jì)有些人看得也是云里霧里。其實(shí)我已經(jīng)盡量精簡了許多,Spring-Integration其實(shí)涉及到的應(yīng)用分支更多,我這也只是十分基礎(chǔ)的東西,我只能把我自己知道的先記錄下來。如果讓你對Spring-Integration產(chǎn)生了興趣,那本文的目的就達(dá)到了。這需要你自己去實(shí)地操作研究下,總是有收獲的。

以上就是源碼簡析Spring-Integration執(zhí)行流程的詳細(xì)內(nèi)容,更多關(guān)于Spring Integration執(zhí)行的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 性一交一乱一色一情丿按摩 | 一区二区中文字幕在线 | 国产无遮挡又黄又爽免费软件 | 自拍偷在线精品自拍偷无码专区 | 国内自拍第23页 | 特大黑人娇小亚洲女mp4 | 天天操天天舔 | 国产a不卡 | 久久精品中文闷骚内射 | 国产精品二区一区二区aⅴ 国产精品粉嫩懂色av | 久久综合伊人77777麻豆 | jizz欧洲| 国产成a人亚洲精品无码樱花 | 男人的天堂久久 | 国产精品高潮呻吟久久久久久 | 五十路熟女丰满大屁股 | 在线a免费| 热久久美女精品天天吊色 | 男女做爰猛烈叫床无遮挡 | 色交视频 | 狠狠色噜噜狠狠色综合久 | 国产69久久精品成人看动漫 | 国产精品视频全国免费观看 | 久久99久国产精品黄毛片入口 | 国产天堂精品 | 午夜一区二区国产好的精华液 | 日韩一区二区三区国产 | 国产农村妇女精品一二区 | 国产理论片在线观看 | 免费黄网站在线观看 | 九九色精品 | 午夜免费福利视频 | 国产交换配乱淫视频a免费 国产精成人品免费观看 | 伊人狠狠色j香婷婷综合 | 无码人妻av一区二区三区波多野 | 大地资源中文第二页日本 | 激情偷乱人成视频在线观看 | 日本高清视频色wwwwww色 | 撕开奶罩揉吮奶头高潮av | 日本三级一区二区三区 | 亚洲一区二区三区四区五区xx | 九九在线观看高清免费 | 欧美日韩国产综合在线 | 精品自拍亚洲一区在线 | 一级黄色毛毛片 | 国产精品久久久久久婷婷动漫 | 日本被黑人强伦姧人妻完整版 | 91国产视频在线观看 | 麻豆久久久9性大片 | 少妇扒开双腿自慰出白浆 | 国产美女激情 | 51永久免费观看国产nbamba | 国产99久久久国产 | 又大又粗又爽18禁免费看 | 欧美日韩国产色 | 日韩欧美中文字幕精品 | 午夜爱精品免费视频一区二区 | 美女的奶胸大爽爽大片 | 男人疯狂高潮呻吟视频 | 精品国产免费久久久久久桃子图片 | 果冻传媒mv免费播放在线观看 | 免费人妻无码不卡中文字幕18禁 | 欧美精品第20页 | 精品久久久久久久中文字幕 | 欧美一区二区三区国产 | 免费无码又爽又刺激软件下载直播 | 福利二区视频 | 久久久久久逼 | 7878成人国产在线观看 | 亚洲日韩一区精品射精 | 亚洲色图偷窥自拍 | 深夜福利小视频在线观看 | 国精产品999国精产品蜜臀 | 中文字幕人妻第一区 | 午夜免费福利视频 | 天天草av| 欧美aaa大片| 亚洲日韩av一区二区三区中文 | 91精品国产综合久久小美女 | av中文字幕一区二区三区 | 日韩av爽爽爽久久久久久 | 涩里番在线观看 | 久久福利精品 | 国产中文一区二区三区 | 国产91区| 无码高潮少妇毛多水多水 | 青青操视频在线 | 亚洲国产果冻传媒av在线观看 | 男人天堂网址 | 日韩婷婷 | 娇妻被黑人粗大高潮白浆 | 亚洲男人第一av网站 | 国模冰莲自慰肥美胞极品人体图 | 少妇与公做了夜伦理 | 中国女人一级片 | 国产精品久久久久久久新郎 | 亚洲 精品 综合 精品 自拍 | 久久亚洲视频 | 日日干日日色 | 在线视频中文字幕 | 推油少妇久久99久久99久久 | 亚洲免费成人 | 日b影院| 国产美女在线精品免费观看网址 | 中文字幕av在线一二三区 | 极品粉嫩国产18尤物 | 欧美激情精品 | 成人日韩精品 | 成人性生交大片xbxb | 国产淫视频 | 一本一道久久 | 久久精品视频观看 | 18禁成人网站免费观看 | 精品国产一区二区三区麻豆仙踪林 | k频道国产在线观看 | 一级国产特黄bbbbb | 国产日产欧美一区二区 | 午夜肉伦伦影院 | 成人免费av | 成人小视频免费 | 亚洲s码欧洲m码吹潮 | 国产精品一区在线观看你懂的 | 女同 另类 激情 重口 | 全部免费的毛片在线看 | 乳孔很大能进去的av番号 | 日韩在线你懂的 | wwwyoujizzcom国产| 日韩成人免费在线观看 | 日本少妇久久久 | 国产66精品久久久久999小说 | 亚洲成人av免费在线观看 | 国产精品高跟丝袜一区 | 中文字幕综合 | 两个女人互添下身爱爱 | 羞羞视频靠逼视频大全 | 午夜伦理福利视频 | 三级av在线播放 | 国产91在线播放9色不卡 | 性免费视频| 亚洲色成人网一二三区 | 极品少妇一区二区三区 | 在线精品国产成人综合 | 91精品啪在线观看国产商店 | 青青草伊人 | 久久国产劲爆∧v内射-百度 | 啪啪免费网站 | 黄色成人在线网站 | 亚洲女同性ⅹxx关女同网站 | 伊人久久大香 | www黄色网址| 少妇高潮一区二区三区99女老板 | 图片区小说区另类春色 | 成人av图片 | 老湿机香蕉久久久久久 | 免费在线视频你懂的 | 亚韩天堂色总合 | 最新天堂资源在线 | 91欧美精品 | 99久久久 | 亚洲人成色777777老人头 | 日韩av视屏 | 国产女主播白浆在线观看 | 男人天堂成人网 | 狠狠干婷婷 | 欧美国产精品日韩在线 | 国产色视频网站 | 国产成人精品日本亚洲网站 | 亚洲精品无amm毛片 亚洲精品无码成人aaa片 | 爱情岛论坛亚洲品质有限公司18 | 国产成人一区在线观看 | 十八18禁国产精品www | 久久草草精品入口av | 天天拍天天干 | 男女交性全过程3d | 久久小草成人av免费观看 | 欧美精品一区二区三区蜜臀 | 日韩欧美视频在线免费观看 | 国产经典一区二区三区 | 欧美视频二区欧美影视 | 青青青国产在线 | 国产做爰全过程免费视频 | 亚洲日韩乱码一区二区三区四区 | 8x8ⅹ国产精品一区二区 | 四虎精品在线观看 | 国产精品国产自线拍免费软件 | 一个色av | 午夜免费视频 | av片在线观看 | 成人精品网 | 奇米777四色影视在线看 | av大帝在线 | 午夜视频网站 | 成人在线观看国产 | 欧美激情啪啪 | 色婷婷5月天 | 日韩欧美成人一区 | 日韩美女毛片 | 亚洲国产综合视频 | 国产精品扒开腿做爽爽爽视频 | 亚洲精品国精品久久99热 | 午夜在线成人 | 欧美又大又黄又粗高潮免费 | 国产精品美女久久久网av | 狠狠干狠狠艹 | 女人高潮a毛片在线看 | 日韩欧美在线观看一区二区三区 | 一级一片免费观看 | 国产明星精品一区二区刘亦菲 | 免费国产黄网站在线观看可以下载 | 日日操网站| 超碰人人超| 91插插插永久免费 | 国产美女免费无遮挡 | 欧美片免费网站 | 99久久国产露脸国语对白 | 国产老头与老太xxxxx看看吧 | 一级 黄 色 片69 | 午夜视频久久 | 无码国产69精品久久久久同性 | 日本高清视频www夜色资源 | 99久久久精品国产一区二区 | 草草视频在线播放 | 清清草在线视频 | www片香蕉内射在线88av8 | 日产精品久久久久久久 | 人妻美妇疯狂迎合系列视频 | 手机看片国产精品 | 欧美日韩一区二区三区在线 | 少妇富婆一区二区三区夜夜 | 香蕉在线影院 | 波多野结衣 黑人 | 亚洲女人天堂成人av在线 | 美女少妇av | 99精品视频在线观看免费播放 | 亚洲欧美视频 | 蜜桃狠狠色伊人亚洲综合网站 | 亚洲女同在线观看 | 97色偷偷色噜噜狠狠爱网站 | 国产精品77777 | 少妇激情av一区二区三区 | 天天干视频网站 | 2019日韩中文字幕 | 五级黄高潮片90分钟视频 | 精品国产乱码久久久久久闺蜜 | 欧产日产国产精品99 | 国产激情一区二区三区四区 | 国内精品写真在线观看 | 91蝌蚪色| 欧美永久免费 | 青青久久av| 黑人精品一区二区三区 | 日韩淫视频 | 少妇坐莲好爽91 | 久久久久国色av免费观看性色 | 中文字幕亚洲乱码熟女在线萌芽 | 国产av国片偷人妻麻豆 | www.在线观看麻豆 | 欧美三p | 1024久久| 国产精品一区视频 | 欧美成人aaa片一区国产精品 | 欧美福利一区 | 欧美三日本三级少妇99印度 | 丝袜一区二区三区 | 人体内射精一区二区三区 | 永久免费看啪啪的网站 | 日本午夜网 | 久久国产精品成人免费 | 无码视频一区二区三区在线观看 | av大片免费在线观看 | 成人乱码一区二区三区av66 | 国产资源精品 | 调教丰满的已婚少妇在线观看 | 午夜免费无码福利视频 | 伊人色综合久久天天五月婷 | 美女一级 | 国产日韩欧美精品在线观看 | 少妇激情一区二区三区视频小说 | 日本免费网站在线观看 | 甄宓高h荡肉呻吟np 正在播放国产老头老太色公园 | 一级国产片 | 少妇浴室愉情韩国理论 | 欧美在线日韩 | 成人必看www. | 女教师痴汉调教hd中字 | yy111122少妇光屁股影院 | 爱情岛亚洲论坛入口首页 | 国内精品视频一区 | 亚洲欧美日韩国产成人 | 日韩a级片| 欧美xxxx在线 | 91精品久久久久久久久青青 | 亚洲综合成人亚洲 | 久久久综合香蕉尹人综合网 | 色88久久久久高潮综合影院 | 国产成人免费网站 | 国产69精品久久久久久妇女迅雷 | 亚洲国产成人av毛片大全 | 日本xxxxxxxxxx天美 | 亚洲欧美日韩精品永久在线 | 亚洲精品久久夜色撩人男男小说 | 看片免费黄在线观看入口 | 欧美日韩1区 | 成人丝袜激情一区二区 | 天天舔天天射 | 国产黄色一级片视频 | 少妇仑乱a毛片 | 正在播放老肥熟妇露脸 | 亚洲欧洲综合av | 成人免费大片黄在线播放 | 国产激情无套内精对白视频 | 久久99影视 | 欧美精品v国产精品v日韩精品 | 亚洲黄v| 中文字幕日韩一区二区三区不卡 | 日批国产 | 亚洲 欧美 影音先锋 | 亚洲成人激情av | 美女黄色毛片视频 | 国产欧美精品国产国产专区 | 五月天婷婷视频 | 免费看男女做爰爽爽视频 | 国产123区| 韩国三级做爰楼梯在线 | k频道国产在线观看 | 吃奶揉捏奶头高潮视频在线观看 | 一本久久久久 | av在线资源网站 | 亚洲2022国产成人精品无码区 | 欧美体内谢she精2性欧美 | 极品蜜桃臀肥臀-x88av | 日本一级二级视频 | 在线无| 免费大香伊蕉在人线国产 | 国产寡妇亲子伦一区二区三区四区 | www.伊人网| 国产女爽爽精品视频天美传媒 | 91精品入口| 亚洲第一中文字幕 | 久草在线这里只有精品 | 成年18网站免费进入夜色 | 成人a在线观看 | 欧美无马| 亚洲精品中文字幕久久久久 | 亚洲精品456在线播放dvd | 国产精久久久 | 午夜亚洲| 日韩精品无码一区二区三区不卡 | 97国产精品视频人人做人人爱 | 在线不卡一区二区 | 精品欧美成人高清在线观看 | 亚洲美女精品视频 | 精品国产一区二区三区香蕉 | 日本免费黄色 | 奇米影视第4色 | 成人无码一区二区三区网站 | 中文字幕亚洲一区 | 天堂成人网 | 国产精品久久久久久久福利竹菊 | 日本sm极度另类视频 | 日韩免费中文字幕 | 欧美毛片免费看 | 亚洲精品12p | 日本高清免费毛片大全awaaa | 99精品众筹模特自拍视频 | 国产亚洲精品久久久久久无几年桃 | 色老板精品视频在线观看 | 日本老小玩hd老少配 | 800av在线播放 | 久久精品美乳 | 欧美日韩字幕 | 精品国产第一区二区三区的特点 | 日韩av成人 | 欧美bbw精品一区二区三区 | 制服丝袜在线第一页 | 国产精品视频免费播放 | 国产精品久久久久久久久久久久 | 国产999精品久久久久久 | 亚洲人午夜色婷婷 | 青青草一区二区三区 | 亚洲精品国产电影 | 国产高潮视频在线观看 | 人人草av | 成人香蕉视频 | 亚洲精品suv精品一区二区 | 日韩一级特黄 | 亚洲男人天堂网址 | 精品久久亚洲中文无码 | 永久精品视频 | 一区免费 | 99热九九这里只有精品10 | 男女裸体做爰爽爽全过程软件 | 在线高清av | 少妇又色又爽又刺激视频 | av网站亚洲 | 干一干操一操 | 国内精品久久久久久 | 亚洲美女一区 | 全部免费的毛片在线播放 | 亚洲蜜桃精久久久久久久久久久久 | yy6080私人伦理一级二级 | 大青草久久久蜜臀av久久 | 欧美成人秋霞久久aa片 | 欧美三日本三级少妇三级99观看视频 | 女同互添互慰av毛片观看 | 亚洲精品无码久久久久 | 国产无吗一区二区三区在线欢 | 与子敌伦刺激对白播放 | 午夜av导航 | av老司机福利 | 精品99视频 | 那里有毛片看 | 最新国产麻豆aⅴ精品无码 天天摸天天透天天添 | 亚洲天堂第一 | 亚洲中文字幕久久无码 | 亚洲精品乱码久久久久久花季 | 182tv在线观看免费午夜免费线路 | 加勒比色老久久综合网 | jizzzz成熟丰满韩国女视频 | 久久传媒| 欧美巨乳在线观看 | 欧美饥渴少妇 | 18成人在线观看 | 亚洲永久免费观看 | 免费看成人欧美片爱潮app | 成人高清免费观看 | 国内精品人妻久久毛片app | 瑟瑟视频在线观看 | 96成人爽a毛片一区二区 | 猎艳山村丰满少妇 | 伊人久久青青草 | 国产自国产自愉自愉免费24区 | 国产极品美女高潮无套在线观看 | 午夜网址| 亚洲成人动漫在线观看 | xxx久久久| 黄色一级大片在线观看 | 精品国产精品国产偷麻豆 | 无码国产精品一区二区免费式直播 | 岳奶大又白下面又肥又黑水多 | 国内露脸少妇精品视频 | 色婷婷婷婷 | 国产成人无码精品亚洲 | 超级黄色片 | 欧美不卡影院 | 日韩精品免费 | 少妇把腿扒开让我舔18 | 18禁无遮挡羞羞污污污污网站 | 亚洲va在线va天堂xxxx中文 | www.蜜臀| 人妻少妇精品视频二区 | 亚洲日本精品 | 成人一级影片 | 处破女处破av | 国产无遮挡又黄又爽免费视频 | 天天插av| 扒开双腿吃奶呻吟做受视频 | 区一区二区三区中文字幕 | 国产一级黄色av | 996久久国产精品线观看 | a∨色狠狠一区二区三区 | 日本高清www| 3d动漫精品一区二区三区 | 四虎在线视频 | 欧美精品一区二区三区在线 | 老鸭窝视频在线观看 | 午夜看片在线 | 国产热99 | 美女在线观看www | 午夜偷拍福利视频 | 天海翼一区二区三区高清在线观看 | 九九热精品在线 | 性视频网| 亚洲熟妇少妇任你躁在线观看无码 | 亚洲成人网在线播放 | 免费观看性生交大片3区 | 黄色国产免费 | 偷看少妇自慰xxxx | 东北老女人高潮大叫对白 | 色天使亚洲 | 超碰97av在线| 亚洲精品中文字幕一区二区三区 | 欧美亚韩一区二区三区 | 国产v日产∨综合v精品视频 | 精品黑人一区二区三区久久 | 久久久ww | 国产成人a在线观看视频 | 国产在线精品视频 | 99草草国产熟女视频在线 | 精区一品二品星空传媒 | 国产精品夜间视频香蕉 | 国产网站在线免费观看 | 日本三级免费 | 日本成人黄色片 | 国产精品入口免费视 | 亚洲一区二区a | 亚洲精品乱码久久久久久久久久久久 | 麻豆成人久久精品二区三区免费 | 日韩精品专区 | 91尤物在线 | 黄色毛毛片| 成人未满十八无毛片 | 免费国产女王调教在线视频 | 免费人成激情视频在线观看 | 亚洲经典久久 | 四虎影视永久地址www成人 | 亚洲一区二区国产 | 亚洲福利专区 | 欧美成人一区二免费视频 | 亚洲国产精品久久久久秋霞不卡 | 亚洲一本之道高清乱码 | 国产精品高潮视频 | 欧美男女激情 | 羞羞答答国产xxdd亚洲精品 | 超碰伊人久久 | 亚洲国产精品写真 | 日本人与黑人做爰视频 | 91丝袜呻吟高潮美腿白嫩在线观看 | 欧美群妇大交乱 | 精品久久久久久乱码天堂 | 青青草视频| 亚洲欧洲精品成人久久曰 | 91chinese video永久地址 | 国产xxxxx在线观看 | 欧美啪啪一区 | 天堂一码二码专区 | 成人午夜精品一区二区三区 | 无遮挡在线 | 国产精品女人特黄av片 | 亚洲国产一区二区a毛片 | 内射人妻无码色ab麻豆 | 亚洲欧美日韩精品久久亚洲区 | 先锋影音一区二区 | 中文毛片无遮挡高潮免费 | 97人人模人人爽人人喊网 | 亚洲三区在线观看无套内射 | 欧美特级特黄aaaaaa在线看 | jizz免费视频 | 在线日韩中文字幕 | 黑人一级| 亚洲欧美激情国产综合久久久 | 亚洲午夜1000理论片aa | 亚洲午夜免费福利视频 | 日韩av免费| av资源免费观看 | 国产精品天天看 | 精品人妻少妇一区二区 | 少妇无码av无码专区线 | swag国产精品一区二区 | 伊人网欧美 | 在线观看欧美国产 | 国语对白91 | 日本丰满的人妻hd高清在线 | 亚洲人久久久 | 亚色av| 国产深夜男女无套内射 | 国产精品午夜小视频观看 | 人妻少妇精品视频专区 | 日韩一卡二卡 | 国产日韩欧美一区二区久久精品 | 日本精品久久久久中文字幕 | 美女二区 | 久草a视频 | 宅女噜噜66国产精品观看免费 | 欧美专区在线视频 | 亚洲第一av| 欧美一区二区三区日韩 | 女同精品一区二区三区在线播放器 | 五月天婷婷网站 | 欧美性tv | 日韩手机看片 | 夜夜精品无码一区二区三区 | 真实偷拍激情啪啪对白 | 色婷婷久久久 | xxx在线播放xxx | a天堂资源 | 国产极品美女到高潮 | 一进一出下面喷白浆九瑶视频 | 国产裸体美女视频全黄 | 正在播放国产老头老太色公园 | 亚欧免费无码aⅴ在线观看 麻豆国产一区二区三区四区 | 国产传媒一区 | 成人午夜视频精品一区 | 国产资源站 | 嫩草影院wwwnyz五月天 | www.日日| 免费做a爰片久久毛片a片 | 无码欧精品亚洲日韩一区 | 国产精品秘 | 日韩精品久久久久久久电影蜜臀 | 男人天堂亚洲 | 青青视频免费看 | 日韩精品视频在线观看一区二区三区 | 精品国产乱码久久久久软件 | 色片免费看 | 欧美寡妇性猛交ⅹxxx | 日本特黄特刺激一级猛片 | 干干干日日日 | 一本大道道香蕉a又又又 | 一本大道伊人av久久乱码 | a国产一区二区免费入口 | 韩日午夜在线资源一区二区 | 李宗瑞91在线正在播放 | 乱码av麻豆丝袜熟女系列 | 欧美小视频在线观看 | 日本一级淫片色费放 | av网页在线观看 | 日韩在线观看免费 | 日本熟妇hdsex视频 | 亚洲免费区 | 午夜视频在线观看一区二区 | cao国产| 午夜家庭影院 | 色视频网站在线观看一=区 色视频网址 | 免费成人深夜夜行网站视频 |