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

一不小心成了知名開源項(xiàng)目的貢獻(xiàn)者?!

開源
以前一直想著要參與一下開源項(xiàng)目,沒想到這次也算是實(shí)現(xiàn)了一個(gè)小小的目標(biāo),其實(shí)這次純屬是一個(gè)意外之喜,原本只是在自己學(xué)習(xí)和研究 canal? 的數(shù)據(jù)同步,然后發(fā)現(xiàn)了這個(gè)問題,最后就修復(fù)了一下,順手提了一個(gè) PR,沒想到還真的被合并了,想想還是很激動(dòng)的。

真是一個(gè)意外之喜,之前寫的 18 張圖手把手教你使用 Canal Adapter 同步 MySQL 數(shù)據(jù)到 ES8,建議收藏!寫了怎么使用 Canal Adapter 進(jìn)行 MySQL 數(shù)據(jù)同步到 ES8。

在這個(gè)文章中我提到了這么一個(gè)內(nèi)容,官方自帶的 ES8 Adapter 同步類不支持 ES8 的 TLS 認(rèn)證,所以導(dǎo)致我們?cè)诓渴?nbsp;ES8 集群的時(shí)候需要關(guān)閉這個(gè)安全功能。

但是作為技術(shù)人員就是見不得功能被閹割,所以就拉取了源碼,在原有的基礎(chǔ)上進(jìn)行改造支持了 TLS 認(rèn)證。

圖片圖片

改完過后本地重新打包實(shí)現(xiàn)了功能,本著獨(dú)樂樂不如眾樂樂,就順手提了一個(gè) PR,結(jié)果萬萬沒想到,最近發(fā)現(xiàn)這個(gè) PR 被合并到主干了?。?!

圖片圖片

就這樣一不小心成了一個(gè)幾萬星的知名開源項(xiàng)目貢獻(xiàn)者,大佬還在 PR 下面回復(fù)了一個(gè) tks,突然發(fā)現(xiàn)自己和大佬也可以靠的這么近。

圖片圖片

問題描述

在沒有修復(fù)的時(shí)候,啟動(dòng)了 canal 適配器過后,在進(jìn)行 MySQL 數(shù)據(jù)同步到 ES8 的時(shí)候,出現(xiàn)下面的錯(cuò)誤,這個(gè)錯(cuò)誤的原因是因?yàn)?ES8 默認(rèn)開啟了安全認(rèn)證,并且自帶了簽名證書。Canal Adapter 在適配 ES8 的時(shí)候并沒有支持這個(gè)功能,因此報(bào)錯(cuò)了。

2024-04-13 20:55:39.368 [pool-3-thread-1] ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - ElasticsearchException[java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: General SSLEngine problem]; nested: ExecutionException[javax.net.ssl.SSLHandshakeException: General SSLEngine problem]; nested: SSLHandshakeException[General SSLEngine problem]; nested: SSLHandshakeException[General SSLEngine problem]; nested: ValidatorException[PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]; nested: SunCertPathBuilderException[unable to find valid certification path to requested target];
java.lang.RuntimeException: ElasticsearchException[java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: General SSLEngine problem]; nested: ExecutionException[javax.net.ssl.SSLHandshakeException: General SSLEngine problem]; nested: SSLHandshakeException[General SSLEngine problem]; nested: SSLHandshakeException[General SSLEngine problem]; nested: ValidatorException[PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]; nested: SunCertPathBuilderException[unable to find valid certification path to requested target];
 at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:112)
 at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:60)
 at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.sync(ESAdapter.java:104)
 at com.alibaba.otter.canal.client.adapter.es.core.ESAdapter.sync(ESAdapter.java:83)
 at com.alibaba.otter.canal.client.adapter.ProxyOuterAdapter.sync(ProxyOuterAdapter.java:42)
 at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.batchSync(AdapterProcessor.java:139)
 at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.lambda$null$1(AdapterProcessor.java:97)
 at java.util.concurrent.CopyOnWriteArrayList.forEach(CopyOnWriteArrayList.java:890)
 at com.alibaba.otter.canal.adapter.launcher.loader.AdapterProcessor.lambda$null$2(AdapterProcessor.java:94)
 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 at java.lang.Thread.run(Thread.java:745)
Caused by: org.elasticsearch.ElasticsearchException: java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
 at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2695)
 at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:2171)
 at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:2154)
 at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:2118)
 at org.elasticsearch.client.IndicesClient.getMapping(IndicesClient.java:538)
 at com.alibaba.otter.canal.client.adapter.es8x.support.ESConnection.getMapping(ESConnection.java:132)
 at com.alibaba.otter.canal.client.adapter.es8x.support.ES8xTemplate.getEsType(ES8xTemplate.java:392)
 at com.alibaba.otter.canal.client.adapter.es8x.support.ES8xTemplate.getValFromData(ES8xTemplate.java:269)
 at com.alibaba.otter.canal.client.adapter.es8x.support.ES8xTemplate.getESDataFromDmlData(ES8xTemplate.java:324)
 at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.singleTableSimpleFiledUpdate(ESSyncService.java:814)
 at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.update(ESSyncService.java:208)
 at com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService.sync(ESSyncService.java:97)
 ... 12 common frames omitted
Caused by: java.util.concurrent.ExecutionException: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
 at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.getValue(BaseFuture.java:257)
 at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.get(BaseFuture.java:244)
 at org.elasticsearch.common.util.concurrent.BaseFuture.get(BaseFuture.java:75)
 at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2692)
 ... 23 common frames omitted
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
 at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1431)
 at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535)
 at sun.security.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1214)
 at sun.security.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1186)
 at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:469)
 at org.apache.http.nio.reactor.ssl.SSLIOSession.doWrap(SSLIOSession.java:270)
 at org.apache.http.nio.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java:316)
 at org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:537)
 at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:120)
 at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
 at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
 at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
 at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
 at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
 at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
 ... 1 common frames omitted
Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
 at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
 at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1728)
 at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:304)
 at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
 at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
 at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
 at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
 at sun.security.ssl.Handshaker$1.run(Handshaker.java:919)
 at sun.security.ssl.Handshaker$1.run(Handshaker.java:916)
 at java.security.AccessController.doPrivileged(Native Method)
 at sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1369)
 at org.apache.http.nio.reactor.ssl.SSLIOSession.doRunTask(SSLIOSession.java:288)
 at org.apache.http.nio.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java:356)
 ... 9 common frames omitted
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
 at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
 at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
 at sun.security.validator.Validator.validate(Validator.java:260)
 at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
 at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281)
 at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136)
 at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
 ... 17 common frames omitted
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
 at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
 at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
 at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
 at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
 ... 23 common frames omitted
2024-04-13 20:55:39.370 [Thread-4] ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - Outer adapter sync failed!  Error sync and rollback, execute times: 13

解決方案

解決方案有兩個(gè):

  1. 部署搭建 ES 集群的時(shí)候,關(guān)閉這個(gè)安全證書的功能,對(duì)應(yīng) ES 的配置是在 elasticsearch.yml 里面的 xpack.security.enabled 為 false,docker 部署的 ES 需要進(jìn)入的容器里面去進(jìn)行修改,或者在容器啟動(dòng)的時(shí)候就配置。
  2. 修改 canal adapter 的源碼,兼容證書;

這里主要講一下方案 2,因?yàn)閷?duì)于方案 1 需要取消 ES8 的安全功能,不推薦。

修改源碼,兼容 ES8 安全配置

拷貝證書

在使用 docker 安裝和部署 ES8 的時(shí)候,默認(rèn)已經(jīng)創(chuàng)建好了一個(gè)證書,我們需要將證書從容器中拷貝出來,命令如下

docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .

這里的 es01 是容器名稱,根據(jù)自己的進(jìn)行替換即可,拷貝出來的路徑可以自行替換,記住在哪就行,后面會(huì)用到。

修改代碼

在 canal adapter 的源碼中,找到下面這類,com.alibaba.otter.canal.client.adapter.es8x.support.ESConnection#ESConnection

圖片圖片

將其中的構(gòu)造方法改成下面這段

public ESConnection(String[] hosts, Map<String, String> properties) throws UnknownHostException {
    String caPath = properties.get("security.ca.path");
    if (StringUtils.isNotEmpty(caPath)) {
        connectEsWithCa(hosts, properties, caPath);
    } else {
        connectEsWithoutCa(hosts, properties);
    }
}
private void connectEsWithCa(String[] hosts, Map<String, String> properties, String caPath) {
    Path caCertificatePath = Paths.get(caPath);
    try (InputStream is = Files.newInputStream(caCertificatePath)) {
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        Certificate trustedCa = factory.generateCertificate(is);
        KeyStore trustStore = KeyStore.getInstance("pkcs12");
        trustStore.load(null, null);
        trustStore.setCertificateEntry("ca", trustedCa);
        SSLContextBuilder sslContextBuilder = SSLContexts.custom()
        .loadTrustMaterial(trustStore, null);
        final SSLContext sslContext = sslContextBuilder.build();

        HttpHost[] httpHosts = Arrays.stream(hosts).map(this::createHttpHost).toArray(HttpHost[]::new);
        RestClientBuilder restClientBuilder = RestClient.builder(httpHosts);
        String nameAndPwd = properties.get("security.auth");
        if (StringUtils.isNotEmpty(nameAndPwd) && nameAndPwd.contains(":")) {
            String[] nameAndPwdArr = nameAndPwd.split(":");
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY,
                                               new UsernamePasswordCredentials(nameAndPwdArr[0], nameAndPwdArr[1]));
            restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> {
                httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                return httpClientBuilder.setSSLContext(sslContext);
                });
            }
            restHighLevelClient = new RestHighLevelClientBuilder(restClientBuilder.build()).setApiCompatibilityMode(true).build();
        } catch (Exception e) {
            throw new RuntimeException(e);
    }
}

private void connectEsWithoutCa(String[] hosts, Map<String, String> properties) {
    HttpHost[] httpHosts = Arrays.stream(hosts).map(this::createHttpHost).toArray(HttpHost[]::new);
    RestClientBuilder restClientBuilder = RestClient.builder(httpHosts);
    String nameAndPwd = properties.get("security.auth");
    if (StringUtils.isNotEmpty(nameAndPwd) && nameAndPwd.contains(":")) {
        String[] nameAndPwdArr = nameAndPwd.split(":");
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(nameAndPwdArr[0], nameAndPwdArr[1]));
        restClientBuilder.setHttpClientConfigCallback(
                httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
    }
    restHighLevelClient = new RestHighLevelClientBuilder(restClientBuilder.build()).setApiCompatibilityMode(true)
            .build();
}

簡(jiǎn)單說明

  1. 其中 connectEsWithoutCa 方法為原來的構(gòu)造方法的實(shí)現(xiàn);
  2. connectEsWithCa 方法為兼容了安全認(rèn)證的方法構(gòu)造方法實(shí)現(xiàn);
  3. 這兩個(gè)方法的使用根據(jù)是否配置了 security.ca.path 屬性來判斷;
  4. 而 security.ca.path 這個(gè)配置是在啟動(dòng)器的 outerAdapters 的 ES8 的 properties 下,與 security.auth 同級(jí);

代碼修改到這里就結(jié)束了,下面看下如何使用

重新打包

修改好了代碼過后,通過 maven 重新打包,打包出對(duì)應(yīng)的 es8 的 jar 包即可。

圖片圖片

將編譯打包后的 jar 重新復(fù)制到 canal 適配器的 plugin 目錄下面,并且修改一下對(duì)應(yīng)的名稱跟下載下來的版本一致即可,比如我這邊之前下載的 1.1.7 版本。

圖片圖片

其中 client-adapter.es8x-1.1.7-jar-with-dependencies.jar.7 是原來下載下來攜帶的 jar,client-adapter.es8x-1.1.7-jar-with-dependencies.jar 是我重新打包編譯后的 jar。

修改啟動(dòng)器的配置

前面講到兼容代碼的時(shí)候,我們使用了一個(gè)叫 security.ca.path 的配置,所以我們需要將前面拷貝的 ca 證書路徑,配置在這個(gè)屬性上,即 security.ca.path: /opt/canal/http_ca.crt

完整的配置如下所示

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null

canal.conf:
  mode: tcp #tcp kafka rocketMQ rabbitMQ
  flatMessage: true
  zookeeperHosts:
  syncBatchSize: 1000
  retries: -1
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    canal.tcp.server.host: 127.0.0.1:11111
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
    # kafka consumer
    # kafka.bootstrap.servers: 127.0.0.1:9092
    # kafka.enable.auto.commit: false
    # kafka.auto.commit.interval.ms: 1000
    # kafka.auto.offset.reset: latest
    # kafka.request.timeout.ms: 40000
    # kafka.session.timeout.ms: 30000
    # kafka.isolation.level: read_committed
    # kafka.max.poll.records: 1000
    # rocketMQ consumer
    # rocketmq.namespace:
    # rocketmq.namesrv.addr: 127.0.0.1:9876
    # rocketmq.batch.size: 1000
    # rocketmq.enable.message.trace: false
    # rocketmq.customized.trace.topic:
    # rocketmq.access.channel:
    # rocketmq.subscribe.filter:
    # rabbitMQ consumer
    # rabbitmq.host:
    # rabbitmq.virtual.host:
    # rabbitmq.username:
    # rabbitmq.password:
    # rabbitmq.resource.ownerId:

  srcDataSources:
    defaultDS:
      url: jdbc:mysql://127.0.0.1:3306/database?useUnicode=true
      username: root
      password: 123456
  canalAdapters:
  - instance: example # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
        - name: es8
          key: es-key
          hosts: https://127.0.0.1:9200 # 127.0.0.1:9200 for rest mode
          properties:
            mode: rest # transport or rest
            security.auth: elastic:password
            security.ca.path: /opt/canal/http_ca.crt
            cluster.name: docker-cluster
        - name: logger
#      - name: rdb
#        key: mysql1
#        properties:
#          jdbc.driverClassName: com.mysql.jdbc.Driver
#          jdbc.url: jdbc:mysql://127.0.0.1:3306/mytest2?useUnicode=true
#          jdbc.username: root
#          jdbc.password: 121212
#          druid.stat.enable: false
#          druid.stat.slowSqlMillis: 1000
#      - name: rdb
#        key: oracle1
#        properties:
#          jdbc.driverClassName: oracle.jdbc.OracleDriver
#          jdbc.url: jdbc:oracle:thin:@localhost:49161:XE
#          jdbc.username: mytest
#          jdbc.password: m121212
#      - name: rdb
#        key: postgres1
#        properties:
#          jdbc.driverClassName: org.postgresql.Driver
#          jdbc.url: jdbc:postgresql://localhost:5432/postgres
#          jdbc.username: postgres
#          jdbc.password: 121212
#          threads: 1
#          commitSize: 3000
#      - name: hbase
#        properties:
#          hbase.zookeeper.quorum: 127.0.0.1
#          hbase.zookeeper.property.clientPort: 2181
#          zookeeper.znode.parent: /hbase

#      - name: kudu
#        key: kudu
#        properties:
#          kudu.master.address: 127.0.0.1 # ',' split multi address
#      - name: phoenix
#        key: phoenix
#        properties:
#          jdbc.driverClassName: org.apache.phoenix.jdbc.PhoenixDriver
#          jdbc.url: jdbc:phoenix:127.0.0.1:2181:/hbase/db
#          jdbc.username:
#          jdbc.password:

配置好了證書路徑過后,就可以正常啟動(dòng)和同步數(shù)據(jù)了,具體的實(shí)操也可以看對(duì)應(yīng)的公眾號(hào)文章 18 張圖手把手教你使用 Canal Adapter 同步 MySQL 數(shù)據(jù)到 ES8,建議收藏!,這里就不重復(fù)演示了。

總結(jié)

以前一直想著要參與一下開源項(xiàng)目,沒想到這次也算是實(shí)現(xiàn)了一個(gè)小小的目標(biāo),其實(shí)這次純屬是一個(gè)意外之喜,原本只是在自己學(xué)習(xí)和研究 canal 的數(shù)據(jù)同步,然后發(fā)現(xiàn)了這個(gè)問題,最后就修復(fù)了一下,順手提了一個(gè) PR,沒想到還真的被合并了,想想還是很激動(dòng)的。

這個(gè)事情告訴我們只要真正的去參與和使用并了解一個(gè)開源項(xiàng)目了過后,還是有機(jī)會(huì)貢獻(xiàn)自己的代碼的,哪怕只是一個(gè)很小的一部分,也算是為開源項(xiàng)目貢獻(xiàn)了一份自己的綿薄之力。

另外最近也發(fā)現(xiàn)了另一個(gè)開源項(xiàng)目的一些小 bug,回頭再提交一下 PR,向著開源的道路繼續(xù)前行。

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2020-10-26 08:56:32

技術(shù)總監(jiān)程序員

2021-01-05 22:49:37

Python編程語言Java

2019-01-21 08:00:00

谷歌開源數(shù)據(jù)

2023-03-10 08:27:07

for循環(huán)項(xiàng)目線性結(jié)構(gòu)

2021-07-28 05:01:29

Lombok前端測(cè)試

2021-04-30 08:21:22

Linux管道設(shè)計(jì)

2021-10-07 16:45:06

MySQL數(shù)據(jù)庫

2018-01-18 22:26:30

2021-01-30 09:50:54

MySQL密碼服務(wù)器

2019-09-19 20:47:29

刷臉支付人臉識(shí)別人工智能

2020-10-28 15:07:01

Arthas

2025-03-05 00:27:00

2021-03-29 18:47:53

APP服務(wù)端通信安全數(shù)據(jù)安全

2020-04-30 09:45:41

安卓App小米

2022-09-27 18:19:32

Java數(shù)據(jù)結(jié)構(gòu)

2021-01-08 09:36:23

程序員比特幣黑客

2020-06-18 11:14:53

微軟谷歌開源

2019-07-29 14:38:35

服務(wù)器開發(fā)工具

2020-09-29 07:44:20

跨域前后端分離插件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

缅甸午夜性猛交xxxx| 激情小说网站亚洲综合网| 18精品爽国产三级网站| 高清久久精品| 欧美日韩美女在线| 中文字幕欧美日韩一区二区三区| 国产成人精品一区二三区四区五区| 1024成人| 久久久国产视频91| 自拍偷拍亚洲天堂| 香港久久久电影| 色欧美88888久久久久久影院| 中文字幕精品一区日韩| 亚洲欧美日韩动漫| 国产美女娇喘av呻吟久久| 国外成人性视频| 天天看天天摸天天操| 神马香蕉久久| 日韩欧美国产一二三区| 久久久久久香蕉| 波多野结衣久久| 中文字幕在线一区免费| 久久综合久久综合这里只有精品| a在线观看免费| 蜜臀av一区二区在线免费观看| 国内伊人久久久久久网站视频 | 91色视频在线| 51国偷自产一区二区三区| 亚洲综合成人av| 日韩午夜av在线| 欧美猛交免费看| www.xx日本| 国产一区二区精品久| 亚洲第一页中文字幕| 亚洲女人在线观看| 欧洲亚洲精品| 欧美日韩一区不卡| 天天碰免费视频| 综合毛片免费视频| 午夜久久久久久| 久久这里只有精品18| 黄av在线播放| 最新热久久免费视频| 日韩av一区二区三区在线观看 | 在线精品自拍| 日韩一区二区不卡| 在线一区二区不卡| 9999在线精品视频| 69久久99精品久久久久婷婷| 69久久久久久| 国产精品久久久久77777丨| 欧美色videos| 成年人在线看片| 日韩一区二区三区在线免费观看| 色综合久久综合| 欧美牲交a欧美牲交aⅴ免费下载| 手机av在线| 一本到高清视频免费精品| 国产中文字幕免费观看| 中文字幕在线视频久| 日韩欧美国产网站| 久久久久免费精品| 国产精品成人国产| 欧美精品18+| 久久人人爽人人片| 亚洲小说春色综合另类电影| 日韩视频一区在线观看| 国模无码视频一区| 色爱综合av| 亚洲人成人99网站| 三级黄色免费观看| 国内自拍一区| 69av视频在线播放| 成人一级免费视频| 精品中文字幕一区二区小辣椒 | 国产精品-色哟哟| 国产美女在线精品| 国产女人水真多18毛片18精品| 欧美在线精品一区二区三区| 久久久国际精品| 一区二区三区四区免费视频| а√天堂在线官网| 黄色成人在线播放| 波多野结衣天堂| 国产精品麻豆| 亚洲精品国精品久久99热| 国产真实乱人偷精品人妻| 999精品视频| 久久久久久久一区二区| 中文字幕高清在线免费播放| 精品一区二区免费在线观看| 国产精品久久久对白| 久久久久国产精品嫩草影院| 日韩一区中文字幕| cao在线观看| 九七影院97影院理论片久久| 欧美成人一级视频| 亚洲第一综合网| 午夜精品av| 国产精品99久久99久久久二8| 国产精品女同一区二区| 96av麻豆蜜桃一区二区| 成人手机视频在线| 九色porny丨入口在线| 欧美日韩一级二级三级| 亚洲av成人精品一区二区三区| 精品国产一区二区三区噜噜噜| 免费99精品国产自在在线| www.国产一区二区| 国产精品夜夜爽| 品久久久久久久久久96高清| 欧美色图天堂| 欧美日韩一二三| 法国伦理少妇愉情| 欧美日韩一视频区二区| 国产精品一区二区久久| 亚洲人午夜射精精品日韩| 夜夜亚洲天天久久| 色乱码一区二区三区在线| 色天天色综合| 欧美精品久久久久| 国产精品久久久久久69| 久久久.com| 91猫先生在线| 国产精品17p| 欧美巨乳在线观看| 91无套直看片红桃| 国产精品入口麻豆原神| 久久久免费视频网站| 都市激情久久| 欧美极品美女视频网站在线观看免费| 又骚又黄的视频| 国产欧美一区二区精品性| 日韩免费一级视频| 99国产精品久久一区二区三区| 中文字幕日韩高清| 这里只有精品999| 国产女主播视频一区二区| 欧美 国产 日本| 红杏视频成人| 久久人人爽国产| 国产 日韩 欧美 精品| 18成人在线观看| 亚洲一区日韩精品| 91tv精品福利国产在线观看| 国产欧美日韩中文字幕| 91精品国产91久久久久游泳池| 色综合中文字幕| 91av在线免费| 亚洲男女自偷自拍| 免费观看成人高| 日韩影片中文字幕| 亚洲天堂av在线免费| 国产成人自拍偷拍| 国产精品对白交换视频| 欧美特黄aaa| 欧美~级网站不卡| 粉嫩av免费一区二区三区| 男男gaygays亚洲| 精品sm在线观看| 久久久国产精品成人免费| 91蜜桃婷婷狠狠久久综合9色| 那种视频在线观看| 91日韩欧美| 亚洲一区二区日本| 丁香花在线影院| 亚洲欧美日韩天堂一区二区| 日本中文字幕在线观看视频| 国产精品美女久久久久久 | 成人自拍视频| 欧美精品激情在线观看| 日本大片在线观看| 欧美日韩中文字幕一区| 懂色av懂色av粉嫩av| 成人美女视频在线看| 青青草原成人网| 日韩欧美在线中字| 成人国产1314www色视频| 国产不卡人人| 色偷偷偷亚洲综合网另类| 国产日韩精品suv| 精品久久久久久久久久久久 | 亚洲人成网站影音先锋播放| 欧美激情一区二区三区p站| 亚洲专区免费| 老司机av福利| 天海翼精品一区二区三区| 国产精品欧美日韩一区二区| 中文字幕在线播放网址| 亚洲美女激情视频| av中文字幕第一页| 色噜噜狠狠色综合中国| 国产suv一区二区三区| 91啪九色porn原创视频在线观看| 国产又黄又猛又粗| 亚洲国产电影| 中文字幕人成一区| 亚洲色图丝袜| 亚洲va国产va天堂va久久| 日本黄色免费在线| 久久av.com| 可以在线观看的黄色| 欧美mv日韩mv亚洲| 亚洲中文字幕在线一区| 亚洲国产精品久久久男人的天堂| 1024在线看片| 久久综合久久鬼色| 精品久久久久久无码人妻| 麻豆精品精品国产自在97香蕉| 免费av手机在线观看| 亚洲国产不卡| 日韩福利影院| 全国精品免费看| 5566中文字幕一区二区| 国产亚洲精彩久久| 国产a级全部精品| 国产va在线视频| 色综合天天狠天天透天天伊人| avtt亚洲| 亚洲性av在线| 日韩av地址| 亚洲国产精品成人一区二区| 99久久久久成人国产免费| 欧美日韩中文精品| 免费在线不卡av| 欧美午夜美女看片| 91av在线免费视频| 亚洲第一在线综合网站| 国产高清在线免费观看| 一区二区中文字幕在线| www.涩涩爱| 欧美国产国产综合| 免费在线观看a视频| 久久久99精品久久| 在线免费观看麻豆| 91麻豆免费在线观看| 日批在线观看视频| av在线不卡电影| 星空大象在线观看免费播放| 丁香五精品蜜臀久久久久99网站| gogo亚洲国模私拍人体| 国产一区在线观看麻豆| 成年网站免费在线观看| 美女久久久精品| 日本xxxx黄色| 免费av成人在线| 亚洲精品成人在线播放| 老司机午夜精品| caoporm在线视频| 国产呦萝稀缺另类资源| 欧美特黄aaa| 国产精一品亚洲二区在线视频| 俄罗斯女人裸体性做爰| 粉嫩在线一区二区三区视频| 中文字幕 日本| 久久综合精品国产一区二区三区| 精品无码一区二区三区| 日本一区二区免费在线| 少妇视频一区二区| 亚洲精品一二三区| 日本一区二区三区四区五区| 欧美日韩国产一中文字不卡| 免费污污视频在线观看| 欧美日韩一区成人| 国产成人精品一区二三区四区五区| 日韩精品一区二区三区视频在线观看| 国产高清在线观看视频| 精品福利一区二区三区| 欧美日韩视频精品二区| 中文字幕亚洲欧美一区二区三区| 成人国产免费电影| 欧美国产日韩一区二区| 亚洲一区资源| 成人福利在线视频| 九色丨蝌蚪丨成人| 亚洲精品高清视频| 国产精品激情| 日本女优爱爱视频| 国产河南妇女毛片精品久久久| 人妻体内射精一区二区三区| 久久久精品tv| 久草免费在线观看视频| 日韩欧美中文字幕在线观看 | 国产一区二区三区免费看| 国产xxx在线观看| 国产亚洲欧美激情| 免费无码毛片一区二区app| 色婷婷一区二区三区四区| 国产高清视频免费观看| 亚洲人成网在线播放| 黄色免费网站在线| 欧美一级大片视频| 国产一区二区三区亚洲综合| 久久日韩精品| 欧美国产精品| 污污视频网站免费观看| 福利一区福利二区| 国产性猛交xx乱| 亚洲va欧美va国产va天堂影院| 在线观看视频中文字幕| 亚洲国产欧美一区| 久操视频在线观看| 国产精品久久久久久久app| av综合网站| 老司机av福利| 免费精品视频在线| 成人性生活免费看| 成人欧美一区二区三区视频网页 | 欧美bbbbb| 国产成人精品无码片区在线| 亚洲女同ⅹxx女同tv| 色老头在线视频| 亚洲精品按摩视频| 日韩三级电影视频| 91在线视频导航| 青青草原综合久久大伊人精品| 黄色www网站| 国产激情一区二区三区| 黑人狂躁日本娇小| 色素色在线综合| 婷婷国产在线| 91精品国产色综合| 动漫视频在线一区| www.九色.com| 国产精品亚洲综合一区在线观看| 婷婷丁香综合网| 在线视频国内自拍亚洲视频| 三级在线电影| 91sa在线看| 国产美女撒尿一区二区| 女人被男人躁得好爽免费视频| 国产麻豆精品95视频| 国产美女久久久久久| 欧美日韩一区二区三区四区| 91精品大全| 国产女人18毛片水18精品| 精品国产一区二区三区| 国产av人人夜夜澡人人爽| 久久网这里都是精品| 精品国产xxx| 亚洲天堂男人天堂| 成人黄页网站视频| 亚洲开发第一视频在线播放| 日本91福利区| 日韩一区二区三区四区视频| 欧美日韩视频在线第一区| 在线免费观看黄色网址| 国产精品久久久久久久久久久不卡| 狠狠做六月爱婷婷综合aⅴ| 人妻无码视频一区二区三区| 国产女同性恋一区二区| 亚洲天堂中文在线| 欧美成人四级hd版| 狠狠久久伊人| 国产精品免费观看久久| 欧美国产日本韩| 国产精品无码一区二区桃花视频| 久久久成人精品视频| 青青在线精品| 欧洲金发美女大战黑人| 成人av网站在线| 久久久精品福利| 中文字幕精品在线视频| 成人在线视频www| 一本久道高清无码视频| 99国产精品久久久久久久久久| 亚洲AV无码成人精品区东京热| 一区二区成人av| 电影一区中文字幕| 国产3p露脸普通话对白| 久久久久99精品一区| 国产一区二区在线不卡| 欧美极品美女电影一区| 黑人操亚洲人| 丰满人妻一区二区三区53视频| 亚洲成人av一区二区三区| 九色在线播放| **亚洲第一综合导航网站| 亚洲一级在线| 久久久久久久久久97| 亚洲国产精品电影在线观看| 成人国产一区| 亚洲理论电影在线观看| 欧美经典一区二区| 丰满人妻一区二区三区免费视频| 国产91精品久| 伊人久久大香线蕉综合四虎小说| 色呦呦一区二区| 制服丝袜亚洲播放| 另类专区亚洲| 国产精品三级一区二区| 久久久久成人黄色影片| 狠狠人妻久久久久久综合麻豆| 国产精品国产福利国产秒拍 | 免费视频国产一区| 亚洲欧美日本一区二区| 日本精品免费观看高清观看| 青草在线视频| 91免费网站视频| 久久久www成人免费毛片麻豆 |