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

Nacos 服務注冊原理全解析

開發
筆者將以個人調試閱讀的角度帶讀者了解一下筆者如何完成nacos服務注冊模塊閱讀,希望對你有幫助。

本著引導性啟發的理念,筆者將以個人調試閱讀的角度帶讀者了解一下筆者如何完成nacos服務注冊模塊閱讀,希望對你有幫助。

一、從自動裝配入手

1. 基于配置定位裝配信息

一般來說我們服務進行注冊時都會引入nacos服務發現的starter:

<!-- nacos服務注冊 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${revision}</version>
        </dependency>

通過引入這個依賴,服務啟動時就會將自己的信息發送給nacos從而完成服務注冊,結合spring boot自動裝配的工作機制,我們不難猜出這個依賴的spring.factories文件肯定存在某個完成服務注冊的bean。

于是我們查看spring-cloud-starter-alibaba-nacos-discovery的spring.factories文件就看到了NacosServiceRegistryAutoConfiguration這個帶有服務自動注冊的bean:

2. NacosServiceRegistry注冊器的裝配

先來說說第一個裝配的bean即nacosServiceRegistry,通過對整個類的結構和內部邏輯我們可知曉,它會基于我們如下的服務啟動的配置參數完成初始化:

# 服務名稱
spring.application.name=nacos-provider
# 服務注冊地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

在spring boot啟動后并發布ServletWebServerInitializedEvent這個web初始化事件之后,spring cloud的AbstractAutoServiceRegistration就會調用register方法完成服務注冊,此時該方法內部就會走到我們的NacosAutoServiceRegistration的register從而完成服務注冊:

對此我們也給出NacosServiceRegistry 的初始化裝配函數,可以看到它的入參就是和服務注冊相關的屬性配置和管理類:

@Bean
 public NacosServiceRegistry nacosServiceRegistry(
   NacosServiceManager nacosServiceManager,
   NacosDiscoveryProperties nacosDiscoveryProperties) {
  //基于服務管理類和服務注冊屬性配置完成初始化 
  return new NacosServiceRegistry(nacosServiceManager, nacosDiscoveryProperties);
 }

查看其實現的register方法也可以看出,本質上NacosServiceRegistry就是基于namingService獲取注冊中心地址,然后拿著服務的id(serviceId)、分組(group )等信息通過通過注冊中心實例的registerInstance發起RPC調用完成服務注冊:

@Override
 public void register(Registration registration) {

 //......
  //解析出服務的id和服務使用的分組
  NamingService namingService = namingService();//獲取name server
  String serviceId = registration.getServiceId();
  String group = nacosDiscoveryProperties.getGroup();
  //基于注冊信息生成實例信息
  Instance instance = getNacosInstanceFromRegistration(registration);

  try {
   //向nacos發起服務注冊
   namingService.registerInstance(serviceId, group, instance);
   //......
  }
  catch (Exception e) {
   //......
  }
 }

3. NacosRegistration的裝配

隨后這個裝配會執行NacosRegistration 的初始化,這個類我們著重了解nacosDiscoveryProperties 和ApplicationContext 參數即可,所以我們大體可以推測出這個bean是基于spring上下文完成一些服務注冊的元信息的維護:

/**
  * 
  * @param registrationCustomizers
  * @param nacosDiscoveryProperties 服務發現屬性配置
  * @param context spring上下文
  * @return
  */
 @Bean
 @ConditionalOnBean(AutoServiceRegistrationProperties.class)
 public NacosRegistration nacosRegistration(
   ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers,
   NacosDiscoveryProperties nacosDiscoveryProperties,
   ApplicationContext context) {
  return new NacosRegistration(registrationCustomizers.getIfAvailable(),
    nacosDiscoveryProperties, context);
 }

這一點我們可直接通過該裝配bean的init方法查看其作用,可以看到這個類做了如下幾件事:

  • 通過nacosDiscoveryProperties拿到一些元信息配置存入metadata,這個bean默認情況下這些信息都是空,所以沒有做什么很核心的事情
  • 通過Spring context拿到環境變量配置

對應NacosRegistration的init源碼如下,讀者可參考注釋了解:

@PostConstruct
 public void init() {

  Map<String, String> metadata = nacosDiscoveryProperties.getMetadata();
  //基于上下文拿到環境的配置
  Environment env = context.getEnvironment();
  //元信息存入 management.endpoints.web.base-path即actuator的基本路徑
  String endpointBasePath = env.getProperty(MANAGEMENT_ENDPOINT_BASE_PATH);
  if (StringUtils.hasLength(endpointBasePath)) {
   metadata.put(MANAGEMENT_ENDPOINT_BASE_PATH, endpointBasePath);
  }
  //基于spring上下文拿到管理端口號
  Integer managementPort = ManagementServerPortUtils.getPort(context);
  //......
  //完成一些心跳、超時、ip過期刪除等元信息的維護
  if (null != nacosDiscoveryProperties.getHeartBeatInterval()) {
   metadata.put(PreservedMetadataKeys.HEART_BEAT_INTERVAL,
     nacosDiscoveryProperties.getHeartBeatInterval().toString());
  }
  if (null != nacosDiscoveryProperties.getHeartBeatTimeout()) {
   metadata.put(PreservedMetadataKeys.HEART_BEAT_TIMEOUT,
     nacosDiscoveryProperties.getHeartBeatTimeout().toString());
  }
  if (null != nacosDiscoveryProperties.getIpDeleteTimeout()) {
   metadata.put(PreservedMetadataKeys.IP_DELETE_TIMEOUT,
     nacosDiscoveryProperties.getIpDeleteTimeout().toString());
  }
  //......
 }

4. 服務注冊執行者NacosAutoServiceRegistration的裝配

最后一個就是比較核心的bean了,也就是NacosAutoServiceRegistration,它從spring的容器中拿到上述兩個bean作為成員變量存入,同時繼承了AbstractAutoServiceRegistration完成register的調用。也就是說第一個bean是以成員變量的方式聚合在當前bean被調用從而完成服務注冊的:

我們首先看看這個bean的初始化邏輯:

/**
  * 用上述兩個bean作為入參,即NacosAutoServiceRegistration是服務注冊的核心bean
  * @param registry
  * @param autoServiceRegistrationProperties
  * @param registration
  * @return
  */
 @Bean
 @ConditionalOnBean(AutoServiceRegistrationProperties.class)
 public NacosAutoServiceRegistration nacosAutoServiceRegistration(
   NacosServiceRegistry registry,
   AutoServiceRegistrationProperties autoServiceRegistrationProperties,
   NacosRegistration registration) {
   //基于上述初始化的NacosServiceRegistry 和NacosRegistration完成初始化
  return new NacosAutoServiceRegistration(registry,
    autoServiceRegistrationProperties, registration);
 }

其內部在spring完成web容器初始化之后就會調用一個start方法,該方法內部就會調用register方法最終走到第一個bean的注冊邏輯:

public void start() {
  //......

  
  if (!this.running.get()) {
   this.context.publishEvent(new InstancePreRegisteredEvent(this, getRegistration()));
   //發起服務注冊
   register();
   //......
   this.context.publishEvent(new InstanceRegisteredEvent<>(this, getConfiguration()));
   this.running.compareAndSet(false, true);
  }

 }

二、服務注冊請求

1. 構建服務請求入參

基于上述步驟該register最終就會走到自動裝配的第一個bean即NacosServiceRegistry發起RPC服務注冊請求,如下圖所示,可以看到NacosServiceRegistry會拿著當前服務的id、組號以及實例信息通過NacosNamingService的registerInstance方法發起服務注冊:

2. 發起RPC調用

最終NacosNamingService的registerInstance的內部會通過服務初始化的RPC客戶端即clientProxy向nacos發起服務注冊請求:

@Override
    public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
        NamingUtils.checkInstanceIsLegal(instance);
        //基于初始化得到的RPC客戶端發起服務注冊請求
        clientProxy.registerService(serviceName, groupName, instance);
    }

順著這個代理的調用最終就會走到NamingGrpcClientProxy的doRegisterService方法,其內部的requestToServer就是實質發起請求的方法,該方法內部會組裝RPC請求頭并基于服務名稱等入參信息組裝RPC 請求頭向9848端口發起服務注冊請求:

public void doRegisterService(String serviceName, String groupName, Instance instance) throws NacosException {
  //基于服務名稱、組名、實例信息生成入參
        InstanceRequest request = new InstanceRequest(namespaceId, serviceName, groupName,
                NamingRemoteConstants.REGISTER_INSTANCE, instance);
         //調用requestToServer發起RPC調用       
        requestToServer(request, Response.class);
        redoService.instanceRegistered(serviceName, groupName);
    }


private <T extends Response> T requestToServer(AbstractNamingRequest request, Class<T> responseClass)
            throws NacosException {
        try {
         //基于服務名稱等入參信息組裝RPC header
            request.putAllHeader(
                    getSecurityHeaders(request.getNamespace(), request.getGroupName(), request.getServiceName()));
             // 發起RPC調用與獲得響應      
            Response response =
                    requestTimeout < 0 ? rpcClient.request(request) : rpcClient.request(request, requestTimeout);
           //......
        } catch (NacosException e) {
            //......
        }
       //......
    }

對此筆者也通過抓包工具tcp.dstport==9848 && tcp.srcport==50155捕獲到這個請求:

將data數據序列化解析之后即可看到這個請求的數據,很明顯就是我們上文源碼調試得到的入參:

{
  "headers": {},
  "namespace": "public",
  "serviceName": "nacos-provider",
  "groupName": "DEFAULT_GROUP",
  "type": "registerInstance",
  "instance": {
    "ip": "192.168.x.x",
    "port": 8080,
    "weight": 1.0,
    "healthy": true,
    "enabled": true,
    "ephemeral": true,
    "clusterName": "DEFAULT",
    "metadata": {
      "IPv6": "[240e:466:640:4adc:e06d:bf83:ef55:c3f]",
      "preserved.register.source": "SPRING_CLOUD"
    },
    "ipDeleteTimeout": 30000,
    "instanceHeartBeatInterval": 5000,
    "instanceHeartBeatTimeOut": 15000
  },
  "module": "naming"
}

三、服務端解析客戶端注冊請求

1. 請求處理器的初始化

為了能夠處理不同的RPC請求,nacos根據不同的請求創建了不同的請求處理器RequestHandler,啟動時,RequestHandlerRegistry在ContextRefreshedEvent即容器刷新完成后被調用并執行擴展點函數onApplicationEvent,獲取所有的RequestHandler并緩存,便于后續收到請求后直接基于這個緩存獲取處理器處理:

@Service
public class RequestHandlerRegistry implements ApplicationListener<ContextRefreshedEvent> {
 /**
     * 基于擴展點遍歷所有的 RequestHandler 包括注冊實例的方法包括 instanceRequestHandler
     * @param event
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
    //獲取所有的RequestHandler
        Map<String, RequestHandler> beansOfType = event.getApplicationContext().getBeansOfType(RequestHandler.class);
        Collection<RequestHandler> values = beansOfType.values();
        for (RequestHandler requestHandler : values) {
            
           //......
            
            try {
             //.......
            //將rpc對應的請求處理器直接丟到registryHandlers這個map中
            registryHandlers.putIfAbsent(tClass.getSimpleName(), requestHandler);
        }

 //......
}

2. 注冊服務注冊監聽回調

我們再來說說nacos服務端,nacos服務端在啟動初始化時就會初始化一個BaseGrpcServer來監聽RPC請求。 而BaseGrpcServer是繼承自BaseRpcServer,所以在啟動時也沿襲父類的start調用startServer執行RPC服務端啟動:

對應的BaseGrpcServer的startServer源碼如下:

@PostConstruct
    public void start() throws Exception {
        String serverName = getClass().getSimpleName();
        Loggers.REMOTE.info("Nacos {} Rpc server starting at port {}", serverName, getServicePort());
        //啟動服務
        startServer();
        
        //......
        
    }

而startServer內部執行如下步驟:

  • addServices啟動rpc請求處理器并存入緩存中
  • 完成rpcServer基礎構建
  • 啟動rpcServer
@Override
    public void startServer() throws Exception {
        final MutableHandlerRegistry handlerRegistry = new MutableHandlerRegistry();
        //handlerRegistry 記錄注冊服務的容器
        addServices(handlerRegistry, getSeverInterceptors().toArray(new ServerInterceptor[0]));
        //rpc 為nacos端口加上1000
        NettyServerBuilder builder = NettyServerBuilder.forPort(getServicePort()).executor(getRpcExecutor());
        
       //......
       //構建rpcserver
        server = builder.maxInboundMessageSize(getMaxInboundMessageSize()).fallbackHandlerRegistry(handlerRegistry)
                .compressorRegistry(CompressorRegistry.getDefaultInstance())
                .decompressorRegistry(DecompressorRegistry.getDefaultInstance())
                .keepAliveTime(getKeepAliveTime(), TimeUnit.MILLISECONDS)
                .keepAliveTimeout(getKeepAliveTimeout(), TimeUnit.MILLISECONDS)
                .permitKeepAliveTime(getPermitKeepAliveTime(), TimeUnit.MILLISECONDS).build();
        //啟動rpcserver
        server.start();
    }

我們著重查看addServices的調用,它會創建一個處理異步RPC調用的ServerCallHandler。當客戶端發起一個請求時,grpcCommonRequestAcceptor.request方法會被調用,從而解析請求并處理返回響應:

private void addServices(MutableHandlerRegistry handlerRegistry, ServerInterceptor... serverInterceptor) {
        
      //創建一個處理異步RPC調用的ServerCallHandler。當客戶端發起一個請求時,grpcCommonRequestAcceptor.request方法會被調用
        final ServerCallHandler<Payload, Payload> payloadHandler = ServerCalls.asyncUnaryCall(
                (request, responseObserver) -> grpcCommonRequestAcceptor.request(request, responseObserver));
        
        final ServerServiceDefinition serviceDefOfUnaryPayload = ServerServiceDefinition
                .builder(GrpcServerConstants.REQUEST_SERVICE_NAME).addMethod(unaryPayloadMethod, payloadHandler)
                .build();
        //將處理器存入緩存中
        handlerRegistry.addService(ServerInterceptors.intercept(serviceDefOfUnaryPayload, serverInterceptor));
       //...... 
    }

3. 以策略模式的姿態處理服務注冊請求

基于上述的鋪墊,當nacos收到客戶端的RPC請求時,grpcCommonRequestAcceptor的request就會收到這個請求并獲取其類型,處理器的獲取就以策略模式的姿態從requestHandlerRegistry底層的緩存registryHandlers(也就是我們上文說明的緩存處理器的容器)中獲取對應的requestHandler:

@Override
    public void request(Payload grpcRequest, StreamObserver<Payload> responseObserver) {
        
  //......
        //需要使用的服務器類型,例如服務注冊就是 InstanceRequest
        String type = grpcRequest.getMetadata().getType();
        long startTime = System.nanoTime();
        
       //......
        //基于type以策略模式的姿態到找到對應的請求處理器
        RequestHandler requestHandler = requestHandlerRegistry.getByRequestType(type);
        //......
        
        Request request = (Request) parseObj;
        try {
           //......
            //解析參數并處理該請求
            Response response = requestHandler.handleRequest(request, requestMeta);
          //......
        } catch (Throwable e) {
        //......
        }
        
    }

上述的解析最終會走到InstanceRequestHandler即實例請求處理器,同樣的基于報文的細節定位到這個是服務注冊請求,便直接調用registerInstance進行處理:

對應我們給出InstanceRequestHandler的handle方法解析和處理的邏輯,和上文說明一致,讀者可參考注釋了解一下:

@Override
    @TpsControl(pointName = "RemoteNamingInstanceRegisterDeregister", name = "RemoteNamingInstanceRegisterDeregister")
    @Secured(action = ActionTypes.WRITE)
    @ExtractorManager.Extractor(rpcExtractor = InstanceRequestParamExtractor.class)
    public InstanceResponse handle(InstanceRequest request, RequestMeta meta) throws NacosException {
        //基于請求元信息生成服務實例
        Service service = Service
                .newService(request.getNamespace(), request.getGroupName(), request.getServiceName(), true);
        //......
        switch (request.getType()) {
            case NamingRemoteConstants.REGISTER_INSTANCE: //執行服務端的服務注冊
                return registerInstance(service, request, meta);
            //......
        }
    }

4. 緩存并通知刷新

基于上一步的調用我們來到的registerInstance方法,其內部邏輯為:

  • 將注冊實例信息解析并緩存后
  • 發布服務注冊事件告知訂閱者服務更新
@Override
    public void registerInstance(Service service, Instance instance, String clientId) throws NacosException {
        NamingUtils.checkInstanceIsLegal(instance);
        //獲取單例的服務信息
        Service singleton = ServiceManager.getInstance().getSingleton(service);
        //......
        InstancePublishInfo instanceInfo = getPublishInfo(instance);
        //將服務信息緩存到publishers這個map中
        client.addServiceInstance(singleton, instanceInfo);
        client.setLastUpdatedTime();
        client.recalculateRevision();
        //發布服務注冊事件通知感興趣的客戶端服務上線
        NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, clientId));
        NotifyCenter
                .publishEvent(new MetadataEvent.InstanceMetadataEvent(singleton, instanceInfo.getMetadataId(), false));
    }

四、小結

自此我們從服務裝配、nacos服務端初始化以及客戶端自動服務注冊三個角度的源碼完成的Nacos服務注冊原理的全解析,希望對你有幫助。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2025-05-28 08:35:00

Nacos服務訂閱流程開發

2025-06-03 08:25:00

Nacos開發服務

2021-07-12 08:00:21

Nacos 服務注冊源碼分析

2023-01-16 18:32:15

架構APNacos

2021-09-13 09:40:35

Webpack 前端HMR 原理

2021-07-16 06:56:50

Nacos注冊源碼

2022-05-06 07:52:06

Nacos服務注冊

2020-06-29 07:58:18

ZooKeeperConsul 注冊中心

2010-02-06 09:38:42

Android調用服務

2021-08-27 07:47:07

Nacos灰度源碼

2010-10-08 13:53:02

Silverlight

2022-02-07 07:10:32

服務注冊功能

2024-11-11 09:51:46

Nginx部署負載

2023-03-01 08:15:10

NginxNacos

2022-02-09 07:03:01

SpringNacos服務注冊

2022-04-13 18:24:22

Nacos客戶端存儲

2024-01-02 22:47:47

Nacos注冊中心節點

2021-08-04 11:54:25

Nacos注冊中心設計

2025-01-23 00:00:01

2025-06-03 04:10:00

點贊
收藏

51CTO技術棧公眾號

日韩电影中文 亚洲精品乱码 | 99re资源| 日韩 欧美 亚洲| 伊人精品一区| 91麻豆精品国产91久久久更新时间 | 懂色av一区二区三区四区| 国产九九精品| yw.139尤物在线精品视频| 亚洲综合自拍网| 四虎精品在线观看| 欧美日韩国产综合新一区| 亚洲日本精品国产第一区| xxxx18国产| 肉肉av福利一精品导航| 亚洲人av在线影院| 成年人看片网站| 欧美大片免费观看网址| 中文字幕在线一区免费| 国产另类自拍| 在线观看国产区| 狠狠爱综合网| 一区国产精品视频| 影音先锋资源av| 亚洲成人va| 亚洲一区二区美女| 亚洲激情电影在线| 免费看黄网站在线观看| 美腿丝袜一区二区三区| 欧美精品videossex88| 亚洲精品国产精品国自产网站| 国产乱码精品一区二区三区亚洲人| 午夜成人免费电影| 成人手机视频在线| 香蕉视频网站在线| 国产精品自拍网站| 国产精品小说在线| 中文字幕第15页| 最新欧美人z0oozo0| 亚洲免费电影一区| 性一交一黄一片| 成人深夜福利| 欧美日韩中文字幕日韩欧美| 经典三级在线视频| 看电影就来5566av视频在线播放| 懂色av中文字幕一区二区三区| 国产成人综合亚洲| 久久草视频在线| 永久91嫩草亚洲精品人人| 一本色道久久88综合日韩精品| 日本黄色大片在线观看| 国产精品久久久久久吹潮| 午夜精彩视频在线观看不卡| 色婷婷777777仙踪林| aaa在线观看| 久久午夜电影网| 国产精品免费一区二区三区| 国产精品欧美激情在线| 天堂成人免费av电影一区| 国内伊人久久久久久网站视频| 多男操一女视频| 色爱综合网欧美| 亚洲欧洲激情在线| 短视频在线观看| 欧美偷窥清纯综合图区| 精品国一区二区三区| 亚洲男人天堂2021| 9999精品视频| 欧美精品乱码久久久久久按摩| 欧美成人黑人猛交| 热色播在线视频| 亚洲第一av色| 国产妇女馒头高清泬20p多| 国产www视频在线观看| 亚洲精品国产无天堂网2021| 三年中国中文在线观看免费播放 | 久久久精品一区| 日韩av片在线免费观看| 日韩国产一区二区三区| 在线成人激情视频| 羞羞在线观看视频| 亚洲精品网址| 欧美激情网站在线观看| 免费中文字幕在线观看| 国内精品福利| 91国在线精品国内播放| 国产专区第一页| 日韩国产在线一| 欧美一级电影免费在线观看| 东京热一区二区三区四区| 鲁大师成人一区二区三区| 日韩美女视频中文字幕| 波多野结衣绝顶大高潮| 六月丁香婷婷色狠狠久久| 成人h猎奇视频网站| 国产日韩在线观看一区| 成人自拍视频在线观看| 久久久久久艹| 国产51人人成人人人人爽色哟哟 | 无码人妻精品一区二区三应用大全| 亚洲国产网址| 在线成人免费网站| 九九热只有精品| 野花国产精品入口| 欧美影院在线播放| 国产精品第6页| 高清成人在线观看| 欧美日韩精品久久久免费观看| 国产精品免费观看| 中文字幕成人av| 国产精品视频一二三四区| 国产精品25p| 欧美性极品少妇| 香蕉久久久久久av成人| 深爱激情综合| 欧美极品美女电影一区| 中文字幕在线日本| 国产乱子轮精品视频| 精品欧美一区二区久久久伦| 成人高清在线| 亚洲成av人影院| 久久人人爽av| 亚洲三级网页| 九九热r在线视频精品| 一级一片免费看| 福利一区在线观看| 日韩久久久久久久| 91超碰在线播放| 欧美日韩精品欧美日韩精品| 97精品人人妻人人| 色偷偷综合网| 欧美中文字幕在线播放| 国产黄a三级三级三级| 日本一区二区三区dvd视频在线| 欧美日韩中文字幕在线播放 | 久久人体视频| 91精品国产网站| 国产福利免费视频| 亚洲国产精品精华液ab| 无码专区aaaaaa免费视频| 日韩美女在线| 一个色综合导航| 日韩特黄一级片| 成人免费毛片片v| 亚洲一区 在线播放| 丰满少妇一区| 国产一区二区三区欧美| 亚洲精品男人天堂| 成人aa视频在线观看| 国产精品啪啪啪视频| 四虎精品在线观看| 这里只有精品视频在线| 无码人妻精品一区二区蜜桃色欲| 成人毛片视频在线观看| 久久久成人精品一区二区三区| 另类激情视频| 国产婷婷成人久久av免费高清| 国产精品99精品无码视| 国产91精品精华液一区二区三区| 妞干网这里只有精品| 四虎视频在线精品免费网址| 亚洲色无码播放| 影音先锋在线国产| 国产视频一区在线播放| 大肉大捧一进一出好爽视频| 精品欠久久久中文字幕加勒比| 欧美极品少妇xxxxⅹ免费视频 | 91高清视频在线观看| 精品免费日韩av| 精品在线免费观看视频| 成人av在线一区二区三区| 欧美一级免费播放| 久久99国产精品久久99大师| 午夜免费在线观看精品视频| 日本黄视频在线观看| 亚洲国产另类av| 91九色蝌蚪porny| 日韩午夜黄色| 国产精品一区二区三区四区五区| 日本www在线| 欧美日韩一级片在线观看| 乱老熟女一区二区三区| 久久99热这里只有精品| 日本一二三区视频在线| 成人在线视频你懂的| 性色av一区二区三区免费| 午夜视频在线播放| 色综合久久天天综合网| 永久免费av无码网站性色av| 精油按摩中文字幕久久| 路边理发店露脸熟妇泻火| 国产精品三p一区二区| 7m精品福利视频导航| 久久精品蜜桃| 欧美美女一区二区在线观看| 欧美丰满熟妇bbbbbb| 粉嫩av亚洲一区二区图片| 国产成人无码精品久久久性色| 天堂日韩电影| 成人福利网站在线观看11| 日本高清在线观看视频| 日韩av一卡二卡| 国产91av在线播放| 亚洲综合丝袜美腿| 无码人妻aⅴ一区二区三区| 国产日韩欧美三区| 天堂av一区二区| 国产伦精品一区二区三区免费优势| 国产91|九色| 麻豆av在线免费看| 日韩精品黄色网| 国产精品久久久久久69| 亚洲二区在线观看| 天天干天天舔天天操| 国产成人精品影视| 成人黄色一区二区| 好看的亚洲午夜视频在线| 日韩妆和欧美的一区二区| 深夜福利一区二区三区| 欧美一级在线播放| 一区二区三区伦理| 亚洲区中文字幕| 亚洲奶汁xxxx哺乳期| 色视频一区二区| 亚洲不卡在线播放| 日本一区免费视频| 亚洲精品乱码久久久久久久久久久久| 国产做a爰片久久毛片| 欧美日韩亚洲一| 国产精品hd| 亚洲乱码一区二区三区三上悠亚 | 91成人看片片| 日本少妇吞精囗交| 综合激情成人伊人| 中文字字幕码一二三区| 成人妖精视频yjsp地址| 在线观看日本一区二区| 美女精品网站| 成人网站免费观看入口| 亚洲一区在线| 在线视频精品一区| 精品精品久久| 久久久久久99| 加勒比视频一区| 高清日韩一区| 日韩成人综合网| 国产精品中文久久久久久久| 香蕉视频亚洲一级| 国产91成人video| 超碰在线cao| 久久久久久久999| av大片在线| 久久久999精品免费| 午夜免费视频在线国产| 亚洲欧美中文在线视频| 日本不卡视频一区二区| 亚洲高清久久网| 亚洲va欧美va| 欧美成人三级在线| 亚洲第一成年人网站| 欧美一区二区三区免费大片| 中文字幕日韩国产| 色老综合老女人久久久| 在线观看日韩一区二区| 欧美日韩精品电影| 亚洲图片小说视频| 欧美福利视频导航| 91亚洲欧美激情| 制服丝袜中文字幕亚洲| 国产女同91疯狂高潮互磨| 欧美男女性生活在线直播观看 | 一本色道久久综合狠狠躁的推荐| 国产精品999在线观看| 欧美日韩国产一区在线| 日韩成人一区二区三区| 精品欧美国产一区二区三区| 日韩精品视频免费播放| 天天综合色天天综合色h| 天海翼一区二区| 午夜精品爽啪视频| 亚洲午夜无码久久久久| 欧美精品乱人伦久久久久久| 99久久国产免费| 亚洲精美色品网站| 欧美孕妇孕交| 一区二区三区亚洲| 国产视频在线播放| 欧美激情中文网| 欧美xxxhd| 国产精品久久久久av| 色999久久久精品人人澡69| 亚洲va电影大全| 精品少妇一区| 日本一区二区三区四区高清视频| 一区三区在线欧| 亚洲精品一区二区三| 综合久久久久| 久久久噜噜噜www成人网| 久久激情五月激情| 69xxx免费视频| 久久精品一区二区三区不卡| 国产三级在线观看完整版| 一区二区在线免费观看| 久久99精品波多结衣一区| 欧美片在线播放| 成人精品在线播放| 亚洲人成在线播放| 精品视频在线一区二区| 91精品国产乱码久久久久久久久 | 中文字幕一区不卡| 国产精品suv一区二区| 精品国产户外野外| 91麻豆一区二区| 亚洲国产天堂久久综合| 四虎影视精品成人| 精品国产区一区二区三区在线观看| 国产福利电影在线播放| 成人免费福利在线| 日韩有码一区| 一二三在线视频| 日av在线不卡| 一级做a爰片毛片| 亚洲精品网站在线观看| 无码日韩精品一区二区| 欧美电影精品一区二区| 北条麻妃在线| 国内精品久久久| 国产精品一区二区精品| 欧美精品一区二区三区在线看午夜| 久久国产亚洲精品| 久久久久久www| 精品一区二区三区蜜桃| 在线免费观看污视频| 一区二区三区四区高清精品免费观看| www.com亚洲| 欧美xxxx在线观看| 午夜在线视频| 国产精品丝袜高跟| 亚洲精品3区| 轻点好疼好大好爽视频| 国产在线观看一区二区| 色噜噜噜噜噜噜| 日本精品一级二级| 日韩av免费观影| 5278欧美一区二区三区| 999国产精品一区| 国产性生活免费视频| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩视频二区| 精品国产午夜福利在线观看| 国产精品伦一区二区三级视频| 久久夜色精品国产噜噜亚洲av| 精品va天堂亚洲国产| 日本电影在线观看| 成人免费视频在线观看超级碰| 欧美综合视频| 99视频精品免费| 国产午夜精品一区二区三区四区| 激情五月色婷婷| 亚洲黄色成人网| a天堂资源在线| 国产尤物99| 一区二区毛片| 91精品人妻一区二区三区蜜桃欧美| 午夜视频在线观看一区| 日韩一区二区三区在线观看视频 | 欧美黑人性猛交xxx| 制服视频三区第一页精品| 免费在线观看av片| 国产啪精品视频| 亚洲精品成人无限看| 在线播放免费视频| 一区二区高清在线| 亚洲国产精品久久久久爰性色| 久久激情视频久久| 国产综合色激情| 欧美这里只有精品| av影院午夜一区| 男人天堂av在线播放| 亚洲一级黄色片| 国产精品天堂蜜av在线播放| 一区二区成人国产精品 | 亚洲欧洲日韩一区二区三区| 国产一区二区自拍视频| 精品中文字幕在线观看| 亚洲国产aⅴ精品一区二区| 成年女人18级毛片毛片免费| 97se亚洲国产综合在线| 国产情侣小视频| 日韩在线高清视频| 日韩不卡在线视频| 免费黄色日本网站| 国产女同性恋一区二区| 国产又爽又黄又嫩又猛又粗| xxx欧美精品| 深夜福利一区| 国产a视频免费观看| 中文字幕一区三区| 精品久久久免费视频| 国产91|九色| 91精品国产91久久久久久密臀|