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

Spring Cloud 遠程接口調用OpenFeign負載均衡實現原理詳解

開發 前端
容器在啟動過程中會找到所有@FeignClient的接口類,然后將這些類注冊為容器Bean,而每一個Feign客戶端對應的是FactoryBean對象FeignClientFactoryBean。

環境:Spring Cloud 2021.0.7 + Spring Boot 2.7.12

配置依賴

maven依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

開啟注解功能

@SpringBootApplication
// 開啟Feign功能,在該注解中你還可以配置,如下3個重要的信息:
// 1. 為所有的FeignClient提供統一默認的配置
// 2. 指定掃描那些包寫的類
// 3. 指定有哪些@FeignClient類
@EnableFeignClients
public class AppApplication {


  public static void main(String[] args) {
    SpringApplication.run(AppApplication.class, args);
  }


}

FeignClient生成Bean原理

容器在啟動過程中會找到所有@FeignClient的接口類,然后將這些類注冊為容器Bean,而每一個Feign客戶端對應的是FactoryBean對象FeignClientFactoryBean。

具體如何找這些帶有@FeignClient注解的接口類可以查看FeignClientsRegistrar該類就在@EnableFeignClients中被導入。

FeignClientFactoryBean

public class FeignClientFactoryBean implements FactoryBean {
  public Object getObject() {
    return getTarget();
  }
  <T> T getTarget() {
    FeignContext context = beanFactory != null ? beanFactory.getBean(FeignContext.class) : applicationContext.getBean(FeignContext.class);
    Feign.Builder builder = feign(context);
    if (!StringUtils.hasText(url)) {
      if (!name.startsWith("http")) {
        url = "http://" + name;
      }
      else {
        url = name;
      }
      url += cleanPath();
      // 負載均衡處理
      return (T) loadBalance(builder, context, new HardCodedTarget<>(type, name, url));
    }
    // ...
  }
  protected <T> T loadBalance(Feign.Builder builder, FeignContext context, HardCodedTarget<T> target) {
    // 在OpenFeign中核心實現負載均衡的類就是具體的Client類
    // Feign負載均衡能力實現通過具體Client實現,每一個FeignClient客戶端都會對應一個子容器AnnotationConfigApplicationContext
    // 根據@FeignClient配置的服務名name或value為key,從一個LoadBalancerClientFactory(父類)中的Map中查找該name對應的容器
    // 如果不存在則創建一個AnnotationConfigApplicationContext。每個子容器都設置了父容器,如果通過子容器查找不到Client的實現,那么會從父容器中查找
    Client client = getOptional(context, Client.class);
  }
}

Client實現

Client的具體實現可以有如下:

  1. apache httpclient
  2. okhttp
  3. default(jdk)

具體使用哪個是根據你環境引入了哪個依賴(httpclient,okhttp)

<!-- httpclient -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-httpclient</artifactId>
  <version>${version}</version>
</dependency>
<!-- okhttp -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
  <version>${version}</version>
</dependency>

具體選擇通過如下配置

@Import({ 
  HttpClientFeignLoadBalancerConfiguration.class, 
  OkHttpFeignLoadBalancerConfiguration.class, 
  HttpClient5FeignLoadBalancerConfiguration.class, 
  DefaultFeignLoadBalancerConfiguration.class })
public class FeignLoadBalancerAutoConfiguration {
}

如果你的環境有多個實現,那么這里會根據這里的導入順序加載。這里以最后一個DefaultFeignLoadBalancerConfiguration為例。

class DefaultFeignLoadBalancerConfiguration {


  @Bean
  @ConditionalOnMissingBean
  // 沒有啟用spring-retry重試功能
  @Conditional(OnRetryNotEnabledCondition.class)
  public Client feignClient(LoadBalancerClient loadBalancerClient, LoadBalancerClientFactory loadBalancerClientFactory) {
    // 這里構造函數第一個參數將會成為最終執行遠程接口調用的實現
    return new FeignBlockingLoadBalancerClient(new Client.Default(null, null), loadBalancerClient, loadBalancerClientFactory);
  }
}

在沒有導入httpclient或者okhttp情況下,使用的Client實現是FeignBlockingLoadBalancerClient。

負載均衡實現

構造FeignBlockingLoadBalancerClient傳入了負載均衡客戶端LoadBalancerClient及負載均衡客戶端工廠LoadBalancerClientFactory該工廠是用來創建每一個Feign客戶端對應的子容器AnnotationConfigApplicationContext及從對應子容器獲取相應的Bean實例對象,如:Client,Request.Options,Logger.Level等。

public class FeignBlockingLoadBalancerClient implements Client {
  // 此Client代理對象是上面的new Client.Default(null, null)
  private final Client delegate;
  private final LoadBalancerClient loadBalancerClient;
  private final LoadBalancerClientFactory loadBalancerClientFactory;
  public FeignBlockingLoadBalancerClient(Client delegate, LoadBalancerClient loadBalancerClient, LoadBalancerClientFactory loadBalancerClientFactory) {
    this.delegate = delegate;
    this.loadBalancerClient = loadBalancerClient;
    this.loadBalancerClientFactory = loadBalancerClientFactory;
  }
  @Override
  public Response execute(Request request, Request.Options options) throws IOException {
    final URI originalUri = URI.create(request.url());
    // 獲取服務名serviceId
    String serviceId = originalUri.getHost();
    String hint = getHint(serviceId);
    DefaultRequest<RequestDataContext> lbRequest = new DefaultRequest<>(new RequestDataContext(buildRequestData(request), hint));
    // ...
    // 通過負載均衡客戶端獲取指定serviceId的服務實例
    ServiceInstance instance = loadBalancerClient.choose(serviceId, lbRequest);
    // ...
    // 通過獲取到的ServiceInstance實例,重新構造請求地址
    String reconstructedUrl = loadBalancerClient.reconstructURI(instance, originalUri).toString();
    // 重新構建一個新的請求
    Request newRequest = buildRequest(request, reconstructedUrl);
    LoadBalancerProperties loadBalancerProperties = loadBalancerClientFactory.getProperties(serviceId);
    return executeWithLoadBalancerLifecycleProcessing(delegate, options, newRequest, lbRequest, lbResponse, supportedLifecycleProcessors, loadBalancerProperties.isUseRawStatusCodeInResponseData());
  }


  protected Request buildRequest(Request request, String reconstructedUrl) {
    return Request.create(request.httpMethod(), reconstructedUrl, request.headers(), request.body(),
      request.charset(), request.requestTemplate());
  }
}

LoadBalancerClient具體實現:

public class BlockingLoadBalancerClientAutoConfiguration {


  @Bean
  @ConditionalOnBean(LoadBalancerClientFactory.class)
  @ConditionalOnMissingBean
  public LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory) {
    return new BlockingLoadBalancerClient(loadBalancerClientFactory);
  }
}

BlockingLoadBalancerClient

public class BlockingLoadBalancerClient implements LoadBalancerClient {


  private final ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerClientFactory;


  public BlockingLoadBalancerClient(ReactiveLoadBalancer.Factory<ServiceInstance> loadBalancerClientFactory) {
    this.loadBalancerClientFactory = loadBalancerClientFactory;
  }


  public <T> ServiceInstance choose(String serviceId, Request<T> request) {
    // 獲取一個負載均衡器,默認是輪詢策略
    ReactiveLoadBalancer<ServiceInstance> loadBalancer = loadBalancerClientFactory.getInstance(serviceId);
    if (loadBalancer == null) {
      return null;
    }
    Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose(request)).block();
    if (loadBalancerResponse == null) {
      return null;
    }
    return loadBalancerResponse.getServer();
  }
  // 重新構造請求的uri
  public URI reconstructURI(ServiceInstance serviceInstance, URI original) {
    return LoadBalancerUriTools.reconstructURI(serviceInstance, original);
  }
}
public final class LoadBalancerUriTools {
  public static URI reconstructURI(ServiceInstance serviceInstance, URI original) {
    // ...
    return doReconstructURI(serviceInstance, original);
  }
  private static URI doReconstructURI(ServiceInstance serviceInstance, URI original) {
    String host = serviceInstance.getHost();
    String scheme = Optional.ofNullable(serviceInstance.getScheme()).orElse(computeScheme(original, serviceInstance));
    int port = computePort(serviceInstance.getPort(), scheme);


    if (Objects.equals(host, original.getHost()) && port == original.getPort() && Objects.equals(scheme, original.getScheme())) {
      return original;
    }
    boolean encoded = containsEncodedParts(original);
    return UriComponentsBuilder.fromUri(original).scheme(scheme).host(host).port(port).build(encoded).toUri();
  }
}

輪詢算法

public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer {
  public Mono<Response<ServiceInstance>> choose(Request request) {
    ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
      .getIfAvailable(NoopServiceInstanceListSupplier::new);
    return supplier.get(request).next()
      .map(serviceInstances -> processInstanceResponse(supplier, serviceInstances));
  }


  private Response<ServiceInstance> processInstanceResponse(ServiceInstanceListSupplier supplier, List<ServiceInstance> serviceInstances) {
    Response<ServiceInstance> serviceInstanceResponse = getInstanceResponse(serviceInstances);
    if (supplier instanceof SelectedInstanceCallback && serviceInstanceResponse.hasServer()) {
      ((SelectedInstanceCallback) supplier).selectedServiceInstance(serviceInstanceResponse.getServer());
    }
    return serviceInstanceResponse;
  }


  private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances) {
    // ...
    // 如果只有一個實例
    if (instances.size() == 1) {
      return new DefaultResponse(instances.get(0));
    }


    // Ignore the sign bit, this allows pos to loop sequentially from 0 to
    // Integer.MAX_VALUE
    int pos = this.position.incrementAndGet() & Integer.MAX_VALUE;


    ServiceInstance instance = instances.get(pos % instances.size());


    return new DefaultResponse(instance);
  }
}

執行遠程調用

接著上面FeignBlockingLoadBalancerClient#execute方法最終的返回方法執行

final class LoadBalancerUtils {
  static Response executeWithLoadBalancerLifecycleProcessing(Client feignClient, Request.Options options,
    Request feignRequest, org.springframework.cloud.client.loadbalancer.Request lbRequest,
    org.springframework.cloud.client.loadbalancer.Response<ServiceInstance> lbResponse,
    Set<LoadBalancerLifecycle> supportedLifecycleProcessors, boolean useRawStatusCodes) throws IOException {
    return executeWithLoadBalancerLifecycleProcessing(feignClient, options, feignRequest, lbRequest, lbResponse, supportedLifecycleProcessors, true, useRawStatusCodes);
  }
  static Response executeWithLoadBalancerLifecycleProcessing(Client feignClient, Request.Options options,
    Request feignRequest, org.springframework.cloud.client.loadbalancer.Request lbRequest,
    org.springframework.cloud.client.loadbalancer.Response<ServiceInstance> lbResponse,
    Set<LoadBalancerLifecycle> supportedLifecycleProcessors, boolean loadBalanced, boolean useRawStatusCodes) throws IOException {
    // 這里執行生命周期實際調用前動作
    try {
      // 執行時間的調用,而這里的feignClient就是在FeignBlockingLoadBalancerClient傳遞過來的,new Client.Default(null, null)
      Response response = feignClient.execute(feignRequest, options);
      // 這里執行生命周期回調,省略
      return response;
    }
    // ...
  }
}

Client.Default

public interface Client {
  public Response execute(Request request, Options options) throws IOException {
    // 通過JDK自帶的網絡連接進行處理
    HttpURLConnection connection = convertAndSend(request, options);
    return convertResponse(connection, request);
  }
}

責任編輯:武曉燕 來源: 實戰案例錦集
相關推薦

2024-05-13 18:35:06

負載均衡主機端口

2024-03-28 13:10:20

負載均衡LVSHaproxy

2023-10-13 08:52:19

遠程Bean類型

2023-08-29 17:51:22

Ribbon客戶端均衡器

2023-11-09 09:08:38

RibbonSpring

2015-09-25 09:56:37

負載均衡

2023-02-14 08:32:41

Ribbon負載均衡

2024-08-30 10:29:21

2024-06-18 08:14:21

2010-05-06 12:18:34

IP負載均衡

2023-02-20 10:13:00

灰度發布實現

2020-04-27 10:00:53

負載均衡互聯網架構

2022-03-22 07:37:04

FeignSpringRibbon

2012-05-07 10:20:12

LVS集群

2010-05-05 18:58:34

STP負載均衡

2018-07-27 08:39:44

負載均衡算法實現

2019-08-26 08:36:09

負載均衡高可用Nginx

2025-10-15 02:15:00

SpringHTTP客戶端

2022-05-24 14:07:53

OpenFeignSpring開源

2023-02-26 02:00:36

OpenFeign接口實現類
點贊
收藏

51CTO技術棧公眾號

亚洲综合精品视频| 九九九视频在线观看| 69av成人| 欧美国产日本韩| 成人有码在线播放| 国产精品自拍视频一区| 永久免费av无码网站性色av| 婷婷在线免费视频| 石原莉奈在线亚洲二区| 久久久国产视频91| 大乳护士喂奶hd| 日韩成人综合网| 午夜精品久久久| 亚洲砖区区免费| 精品美女www爽爽爽视频| 亚洲免费综合| 欧美大奶子在线| 一级片视频免费看| 亚洲一级大片| 欧美妇女性影城| 日本黄网站免费| 成人在线网址| 中文字幕成人av| 精品午夜一区二区| 999精品国产| 日本欧美一区二区三区| 97久久久久久| 美女视频黄免费| 日韩精品首页| 亚洲亚裔videos黑人hd| 国产精品久久久久久在线观看| 精品九九久久| 欧美影视一区在线| 18禁网站免费无遮挡无码中文| 欧美videos极品另类| 久久综合中文字幕| 国产主播一区二区三区四区| 国产特级aaaaaa大片| 卡一卡二国产精品 | 欧美日韩在线播放一区二区| 黄色片一区二区| 国产精品99久久久久久似苏梦涵| 国产精品久久久久久久午夜| 日韩在线 中文字幕| 欧美日韩国产欧| 欧美另类极品videosbest最新版本| 国产欧美小视频| gogogo高清在线观看一区二区| 日韩极品精品视频免费观看| 国产激情视频网站| 麻豆一区一区三区四区| 精品久久一区二区| 99久久久无码国产精品性波多 | 日韩一区二区三区高清免费看看| 亚洲欧美久久久久| 国产麻豆一区| 欧美日韩成人综合| 第一区免费在线观看| 日韩一区二区三区四区五区| 欧美日韩激情一区二区三区| 182午夜在线观看| 色8久久久久| 制服丝袜亚洲色图| 中文字幕一二三| 亚洲综合影院| 亚洲国产精品va在线| 在线精品一区二区三区| 日韩伦理一区二区三区| 亚洲嫩模很污视频| 免费黄在线观看| 99精品综合| 欧美片一区二区三区| 久久久国产精华液| 午夜在线播放视频欧美| 国产精品久久久久aaaa九色| 国产在成人精品线拍偷自揄拍| 国产一区二区电影| 国产精品三区在线| 猫咪在线永久网站| 国产精品电影院| 久久综合亚洲精品| 精精国产xxxx视频在线野外| 一本色道a无线码一区v| 欧美成年人视频在线观看| 日韩区一区二| 日韩大片免费观看视频播放| 在线视频第一页| 91精品二区| 91超碰中文字幕久久精品| 免费黄色小视频在线观看| 麻豆成人91精品二区三区| 99国产视频| 国产主播福利在线| 亚洲精选视频免费看| 奇米精品一区二区三区| 日韩有码欧美| 日韩av综合中文字幕| 殴美一级黄色片| 亚洲欧洲午夜| 国产在线98福利播放视频| 午夜精品久久久久久久99热黄桃 | 91麻豆精品| 精品视频在线播放免| 国精产品一区一区二区三区mba| 亚洲电影在线| 91久久久久久久久久| 头脑特工队2免费完整版在线观看| 欧美国产日韩一二三区| a级黄色小视频| av在线精品| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 懂色av中文字幕一区二区三区| 久久国产手机看片| 在线观看免费网站黄| 亚洲欧美色一区| 国产精品wwwww| 伊人精品综合| 亚洲天堂av电影| 精品99久久久久成人网站免费| 老鸭窝毛片一区二区三区| 国产精品igao视频| 天天操天天干天天舔| 亚洲欧洲av一区二区三区久久| 国产黄色片免费在线观看| 粉嫩91精品久久久久久久99蜜桃| 亚洲精品在线观看视频| 东方伊人免费在线观看| 97久久夜色精品国产| 国产精品福利在线| 殴美一级特黄aaaaaa| 亚洲欧洲在线观看av| 久久美女福利视频| 2023国产精华国产精品| 色偷偷av亚洲男人的天堂| 国产一级在线播放| 国产一区二区三区四区五区入口| 欧美精品一区在线| 懂色av一区| 91精品免费观看| 日韩片在线观看| 亚洲午夜激情在线| 成人福利网站在线观看| 久久电影中文字幕| 欧美中文一区二区三区| 日韩片在线观看| 亚洲激情偷拍| 成人高清在线观看| 污网站在线免费看| 日韩欧美在线综合网| 久草资源在线视频| 国产美女视频91| 影音先锋欧美资源| 成人av色网站| 在线日韩日本国产亚洲| 国产第一页在线观看| 国产亚洲一区二区三区在线观看 | 亚洲男人天堂av| 一本色道久久亚洲综合精品蜜桃 | 日韩精品视频在线播放| 国产一级中文字幕| 成人激情免费电影网址| 97久久国产亚洲精品超碰热| 国产精品白浆| 午夜伦理精品一区| 天天插天天干天天操| 精品久久久久久中文字幕一区奶水 | 亚洲第一精品福利| 日韩黄色a级片| 91丨porny丨蝌蚪视频| 夫妻免费无码v看片| 欧美精品中文字幕亚洲专区| 国产成人精品免费久久久久| 伦理片一区二区三区| 欧美综合色免费| 一二三四在线观看视频| 久久99深爱久久99精品| 四虎免费在线观看视频| 麻豆一区二区麻豆免费观看| 欧美中文字幕视频在线观看| 你懂得网站在线| 欧美亚男人的天堂| 日韩激情小视频| 丰满放荡岳乱妇91ww| 国产二区视频在线播放| 菠萝蜜一区二区| 97久久天天综合色天天综合色hd | 亚洲男人的天堂网| 国产伦理在线观看| 国产精品毛片在线| 一区二区三区久久网| 日本精品视频| 97精品视频在线播放| 国产私拍精品| 欧美一区在线视频| 久久久久久久黄色片| 国产精品人妖ts系列视频| 亚洲无在线观看| 亚洲成人中文| 日本一区二区三区免费看| 色成人综合网| 97超级碰碰碰久久久| 欧美一区二区少妇| 日韩精品在线一区| 69视频免费看| 樱花影视一区二区| 91视频免费观看网站| 国产在线精品不卡| 日本在线xxx| 亚洲国产一成人久久精品| 久久综合毛片| 综合欧美亚洲| 国产精品亚洲精品| 日韩激情电影免费看| 美女av一区二区三区| 国产综合在线观看| 亚洲黄色在线看| 国产一区二区波多野结衣| 欧美日韩国产综合视频在线观看中文| av片在线免费看| 北条麻妃一区二区三区| 精品久久久久久久无码| 好吊一区二区三区| 咪咪色在线视频| 亚洲天堂日韩在线| 成人高清在线观看| 欧美激情三级| 成人h片在线播放免费网站| 中文字幕乱码在线播放| 欧美极品少妇xxxxx| 日本视频在线播放| 亚洲欧美日韩国产中文专区| 亚洲黄色在线免费观看| 欧美日韩不卡视频| 成人毛片一区二区三区| 欧美日韩美女在线观看| 久久久久香蕉视频| 依依成人精品视频| 国产免费一区二区三区四区| 国产精品视频在线看| 亚洲国产无码精品| 成人福利电影精品一区二区在线观看 | 中文字幕av观看| 成人毛片老司机大片| 在线观看欧美一区二区| 国产成人精品一区二| 中文字幕日韩久久| 精品一区二区三区香蕉蜜桃 | 国产一级特黄a高潮片| 亚洲视频中文字幕| 色哟哟一一国产精品| 国产精品国产成人国产三级| 国产成人免费观看网站| 国产精品初高中害羞小美女文| 中文字幕在线观看免费高清| 久久五月婷婷丁香社区| 国产又粗又猛又爽又黄av| 久久久久久久久伊人| 中文字幕第20页| 国产香蕉久久精品综合网| 亚洲做受高潮无遮挡| 久久久噜噜噜久久人人看| 日韩人妻无码一区二区三区| 成人av网在线| 亚洲熟妇一区二区三区| 国产欧美一区二区精品性| 国产精品久久久久久久av| 国产精品进线69影院| 久久高清内射无套| 亚洲国产成人高清精品| 好吊妞视频一区二区三区| 日韩欧美在线免费| 国产在线观看第一页| 欧美四级电影在线观看| 国产老妇伦国产熟女老妇视频| 777色狠狠一区二区三区| 精品国自产拍在线观看| 亚洲黄色av网站| www.午夜激情| 日韩精品中文字幕在线播放| 黄网在线观看| 久久精品一区中文字幕| 青青青国内视频在线观看软件| 91高清视频免费| 成人在线中文| 成人自拍爱视频| 宅男在线一区| 樱花www成人免费视频| 亚洲日本黄色| 久久久精品麻豆| 国产精品资源站在线| 国产女人18毛片水真多18| 国产午夜三级一区二区三| 青春草免费视频| 色哟哟国产精品免费观看| 亚洲天堂自拍偷拍| 欧美成人伊人久久综合网| 欧美伦理影视网| 在线丨暗呦小u女国产精品| 最新国产在线拍揄自揄视频| 国产91精品高潮白浆喷水| 天堂综合在线播放| 韩国成人动漫在线观看| 91亚洲人成网污www| 日本a在线免费观看| 青青草精品视频| 免费不卡的av| 国产日韩欧美综合一区| 日韩免费不卡视频| 欧美日韩另类国产亚洲欧美一级| 亚洲国产福利视频| 在线丨暗呦小u女国产精品| 日韩电影免费看| 91免费看网站| 日韩成人精品一区二区| 久青草视频在线播放| 爽好多水快深点欧美视频| 国模私拍在线观看| 最新欧美精品一区二区三区| 欧美亚洲精品天堂| 91精品国产乱| 午夜在线视频播放| 人人澡人人澡人人看欧美| 中文在线综合| 潘金莲一级淫片aaaaa免费看| 久久激情久久| xxxx日本免费| 午夜av电影一区| 国产999久久久| 丝袜亚洲另类欧美重口| 欧亚av在线| 亚洲一区二区日本| 欧美aaaaaaaaaaaa| 在线视频日韩一区| 91美女蜜桃在线| 国产一级特黄毛片| 欧美不卡激情三级在线观看| 超碰在线caoporen| 国产拍精品一二三| 欧美色女视频| 国产精品网站免费| 成人国产精品视频| 国产无套内射又大又猛又粗又爽| 制服丝袜成人动漫| 久热av在线| 欧美影院久久久| 天堂资源在线亚洲| 日韩精品―中文字幕| 成人国产一区二区三区精品| 好吊操这里只有精品| 日韩欧美不卡一区| 少女频道在线观看免费播放电视剧| 国产日韩在线精品av| 99视频精品视频高清免费| 黄大色黄女片18第一次| 国产精品黄色在线观看| 在线观看日韩一区二区| 日韩中文字幕免费视频| 日本免费成人| 免费看啪啪网站| 国产在线播精品第三| 久草成人在线视频| 精品国产一区二区三区不卡| 97天天综合网| 精品综合在线| 欧美一级网站| 摸摸摸bbb毛毛毛片| 欧美日韩精品一区二区天天拍小说| 午夜免费播放观看在线视频| 1卡2卡3卡精品视频| 国产一区视频在线观看免费| 国产精品熟妇一区二区三区四区| 亚洲一二三四在线| 午夜久久久久久久久久| 97久久精品国产| 狠狠做六月爱婷婷综合aⅴ| 亚洲一级免费在线观看| 中文字幕一区二区三区在线不卡| 国产成人精品无码高潮| 午夜精品久久久久久99热软件| 欧美一区自拍| 在线视频日韩一区| 亚洲精品国产a| 视频午夜在线| 国产精品永久免费观看| 综合av在线| 一二三不卡视频| 在线成人免费观看| av3级在线| 先锋影音日韩| 国产suv精品一区二区三区| 一级一片免费看| 精品国偷自产在线视频| 国产精品45p| 99视频在线视频| 亚洲成a天堂v人片| www.在线视频.com| 99一区二区| 激情久久久久久久久久久久久久久久| 动漫精品一区一码二码三码四码| 亚洲天堂第一页|