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

最簡最快了解RPC核心流程

開發
本文主要以Dubbo為例介紹了RPC調用核心流程,同時,寫了個簡易的RPC調用代碼。

本文主要以最簡易最快速的方式介紹RPC調用核心流程,文中以Dubbo為例。同時,會寫一個簡易的RPC調用代碼,方便理解和記憶核心組件和核心流程。

一、核心思想

RPC調用過程中,最粗礦的核心組件3個:Registry、Provider、Consumer。最粗礦的流程4個:注冊、訂閱、通知、調用。最簡單的流程圖就1個:

本文會繼續細粒度地拆解以上流程,拆解之前,請牢記這段話:

RPC調用,不管中間流程多么復雜,不管代碼多么復雜,所有的努力也只為做2件事情:

  • 在Consumer端,將ReferenceConfig配置的類轉換成Proxy代理。
  • 在Provider端,將ServiceConfig配置的類轉換成Proxy代理。

二、核心組件

為了能在Consumer端和Provider端生成各自的Proxy代理,并且發起調用和響應,需要如下核心組件:

(1) Registry:注冊中心,主要是為了實現  Provider接口注冊、Consumer訂閱接口、接口變更通知、接口查找等功能。

(2) Proxy:服務代理,核心中的核心,一切的努力都是為了生成合適的Proxy服務代理。

  • Consumer的Proxy:Consumer端根據ReferenceConfig生成Proxy,此Proxy主要用于找到合適的Provider接口,然后發起網絡調用。
  • Provider的Proxy:Provider端根據ServiceConfig生成Proxy,此Proxy主要作用是通過類似反射的方法調用本地代碼,再將結果返回給Consumer。

(3) Protocol:服務協議,它相當于一個中間層,用于與注冊中心打交道 和 封裝 RPC 調用。它在初始化時會創建Client模塊 與 服務端建立連接,也會生成用于遠程調用的Invoker。

(4) Cluster:服務集群,主要用于路由、負載均衡、服務容錯等。

(5) Invoker:服務調用者。

  • Consumer的服務調用者主要是利用Client模塊發起遠程調用,然后等待Provider返回結果。
  • Provider的服務調用者主要是根據接收到的消息利用反射生成本地代理,然后執行方法,再將結果返回到Consumer。

(6) Client:客戶端模塊,默認是Netty實現,主要用于客戶端和服務端通訊(主要是服務調用),比如將請求的接口、參數、請求ID等封裝起來發給Server端。

(7) Server:服務端模擬,默認是Netty實現。主要是用于客戶端和服務端通訊。

三、核心流程

1.Consumer流程

(1) 流程

Consumer的流程實際上就是一個從ReferenceConfig 生成Proxy代理的過程。核心事情由Protocol完成。

  • 根據ReferenceConfig生成代理
  • 注冊到注冊中心、訂閱注冊中心事件
  • 建立NettyClient,并且與NettyServer建立連接
  • 生成客戶端的ClientInvoker
  • 選擇負載均衡和集群容錯
  • ClientInvoker發起網絡調用和等待結果

(2) 流程圖:

2.Provider流程

(1) 流程

Provider的流程實際上就是個從ServiceConfig生成Proxy代理的過程。核心事情由PorxyProtocol完成。

  • 根據ServiceConfig生成本地代理
  • 注冊到注冊中心
  • 啟動NettyServer等待客戶端連接
  • 生成服務端Invoker
  • Invoker監聽調用請求
  • 接收到請求后新建任務丟入到線程池去執行
  • 執行時會生成本地代理執行(比如通過反射去調用具體的方法),再將返回結果寫出去

(2) 流程圖:

3.整體流程圖

四、簡易代碼實現

1.核心代碼介紹

(1) 客戶端Proxy:

/**
 * 獲取代理Service
 */
@SuppressWarnings("unchecked")
public <T> T getService(Class clazz) throws Exception {

    return (T) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{clazz}, new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            String methodName = method.getName();

            if ("equals".equals(methodName) || "hashCode".equals(methodName)) {
                throw new IllegalAccessException("不能訪問" + methodName + "方法");
            }
            if ("toString".equals(methodName)) {
                return clazz.getName() + "#" + methodName;
            }

            List<RegistryInfo> registryInfoList = interfaceMethodsRegistryInfoMap.get(clazz);
            if (registryInfoList == null) {
                throw new RuntimeException("無法找到對應的服務提供者");
            }

            LoadBalancer loadBalancer = new RandomLoadBalancer();
            RegistryInfo registryInfo = loadBalancer.choose(registryInfoList);

            ChannelHandlerContext ctx = registryChannelMap.get(registryInfo);

            String identity = InvokeUtils.buildInterfaceMethodIdentify(clazz, method);
            String requestId;

            synchronized (ProxyProtocol.this) {
                requestIdWorker.increment();
                requestId = String.valueOf(requestIdWorker.longValue());
            }

            ClientInvoker clientInvoker = new DefaultClientInvoker(method.getReturnType(), ctx, requestId, identity);

            inProcessInvokerMap.put(identity + "#" + requestId, clientInvoker);

            return clientInvoker.invoke(args);
        }
    });
}

(2) 服務端Proxy

private class RpcInvokerTask implements Runnable {
    private RpcRequest rpcRequest;

    public RpcInvokerTask(RpcRequest rpcRequest) {
        this.rpcRequest = rpcRequest;
    }

    @Override
    public void run() {
        try {
            ChannelHandlerContext ctx = rpcRequest.getCtx();
            String interfaceIdentity = rpcRequest.getInterfaceIdentity();
            String requestId = rpcRequest.getRequestId();
            Map<String, Object> parameterMap = rpcRequest.getParameterMap();

            //interfaceIdentity組成:接口類+方法+參數類型
            Map<String, String> interfaceIdentityMap = string2Map(interfaceIdentity);

            //拿出是哪個類
            String interfaceName = interfaceIdentityMap.get("interface");
            Class interfaceClass = Class.forName(interfaceName);
            Object o = interfaceInstanceMap.get(interfaceClass);

            //拿出是哪個方法
            Method method = interfaceMethodMap.get(interfaceIdentity);

            //反射執行
            Object result = null;
            String parameterStr = interfaceIdentityMap.get("parameter");
            if (parameterStr != null && parameterStr.length() > 0) {
                String[] parameterTypeClasses = parameterStr.split(",");//接口方法參數參數可能有多個,用,號隔開
                Object[] parameterInstance = new Object[parameterTypeClasses.length];
                for (int i = 0; i < parameterTypeClasses.length; i++) {
                    parameterInstance[i] = parameterMap.get(parameterTypeClasses[i]);
                }
                result = method.invoke(o, parameterInstance);
            } else {
                result = method.invoke(o);
            }

            //將結果封裝成rcpResponse
            RpcResponse rpcResponse = RpcResponse.create(JSONObject.toJSONString(result), interfaceIdentity, requestId);

            //ctx返回執行結果
            String resultStr = JSONObject.toJSONString(rpcResponse) + DELIMITER_STR;

            ByteBuf byteBuf = Unpooled.copiedBuffer(resultStr.getBytes());
            ctx.writeAndFlush(byteBuf);

            System.out.println("響應給客戶端:" + resultStr);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

(3) Protocol

public ProxyProtocol(String registryUrl, List<ServiceConfig> serviceConfigList, List<ReferenceConfig> referenceConfigList, int port) throws Exception {
    this.serviceConfigList = serviceConfigList == null ? new ArrayList<>() : serviceConfigList;
    this.registryUrl = registryUrl;
    this.port = port;
    this.referenceConfigList = referenceConfigList == null ? new ArrayList<>() : referenceConfigList;

    //1、初始化注冊中心
    initRegistry(this.registryUrl);

    //2、將服務注冊到注冊中心
    InetAddress addr = InetAddress.getLocalHost();
    String hostName = addr.getHostName();
    String hostAddr = addr.getHostAddress();
    registryInfo = new RegistryInfo(hostName, hostAddr, this.port);
    doRegistry(registryInfo);

    //3、初始化nettyServer,啟動nettyServer
    if (!this.serviceConfigList.isEmpty()) {
        nettyServer = new NettyServer(this.serviceConfigList, this.interfaceMethodMap);
        nettyServer.init(this.port);
    }

    //如果是客戶端引用啟動,則初始化處理線程
    if (!this.referenceConfigList.isEmpty()) {
        initProcessor();
    }
}

(4) 客戶端Invoker

@Override
public T invoke(Object[] args) {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("interfaces", identity);

    JSONObject param = new JSONObject();
    if (args != null) {
        for (Object obj : args) {
            param.put(obj.getClass().getName(), obj);
        }
    }
    jsonObject.put("parameter", param);
    jsonObject.put("requestId", requestId);
    String msg = jsonObject.toJSONString() + Constants.DELIMITER_STR;
    System.out.println("發送給服務端JSON為:" + msg);

    ByteBuf byteBuf = Unpooled.copiedBuffer(msg.getBytes());
    ctx.writeAndFlush(byteBuf);

    wait4Result();

    return result;
}

private void wait4Result() {
    synchronized (this) {
        try {
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void setResult(String result) {
    synchronized (this) {
        this.result = (T) JSONObject.parseObject(result, returnType);
        notifyAll();
    }
}

(5) 服務端Invoker

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    String message = (String) msg;
    System.out.println("提供者收到消息:" + message);
    //解析消費者發來的消息
    RpcRequest rpcRequest = RpcRequest.parse(message, ctx);
    //接受到消息,啟動線程池處理消費者發過來的請求
    threadPoolExecutor.execute(new RpcInvokerTask(rpcRequest));
}

/**
 * 處理消費者發過來的請求
 */
private class RpcInvokerTask implements Runnable {
    private RpcRequest rpcRequest;

    public RpcInvokerTask(RpcRequest rpcRequest) {
        this.rpcRequest = rpcRequest;
    }

    @Override
    public void run() {
        try {
            ChannelHandlerContext ctx = rpcRequest.getCtx();
            String interfaceIdentity = rpcRequest.getInterfaceIdentity();
            String requestId = rpcRequest.getRequestId();
            Map<String, Object> parameterMap = rpcRequest.getParameterMap();

            //interfaceIdentity組成:接口類+方法+參數類型
            Map<String, String> interfaceIdentityMap = string2Map(interfaceIdentity);

            //拿出是哪個類
            String interfaceName = interfaceIdentityMap.get("interface");
            Class interfaceClass = Class.forName(interfaceName);
            Object o = interfaceInstanceMap.get(interfaceClass);

            //拿出是哪個方法
            Method method = interfaceMethodMap.get(interfaceIdentity);

            //反射執行
            Object result = null;
            String parameterStr = interfaceIdentityMap.get("parameter");
            if (parameterStr != null && parameterStr.length() > 0) {
                String[] parameterTypeClasses = parameterStr.split(",");//接口方法參數參數可能有多個,用,號隔開
                Object[] parameterInstance = new Object[parameterTypeClasses.length];
                for (int i = 0; i < parameterTypeClasses.length; i++) {
                    parameterInstance[i] = parameterMap.get(parameterTypeClasses[i]);
                }
                result = method.invoke(o, parameterInstance);
            } else {
                result = method.invoke(o);
            }

            //將結果封裝成rcpResponse
            RpcResponse rpcResponse = RpcResponse.create(JSONObject.toJSONString(result), interfaceIdentity, requestId);

            //ctx返回執行結果
            String resultStr = JSONObject.toJSONString(rpcResponse) + DELIMITER_STR;

            ByteBuf byteBuf = Unpooled.copiedBuffer(resultStr.getBytes());
            ctx.writeAndFlush(byteBuf);

            System.out.println("響應給客戶端:" + resultStr);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

(6) Client

EventLoopGroup group = new NioEventLoopGroup();
try {
    Bootstrap bootstrap = new Bootstrap();
    bootstrap.group(group)
            .channel(NioSocketChannel.class)
            .option(ChannelOption.TCP_NODELAY, true)
            .handler(new ChannelInitializer() {
                @Override
                protected void initChannel(Channel ch) throws Exception {
                    ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024 * 1024, Constants.DELIMITER));
                    ch.pipeline().addLast(new StringDecoder());
                    ch.pipeline().addLast(new NettyClientHandler());

                    System.out.println("initChannel - " + Thread.currentThread().getName());
                }
            });
    ChannelFuture cf = bootstrap.connect(ip, port).sync();
//            cf.channel().closeFuture().sync();
    System.out.println("客戶端啟動成功");
} catch (Exception e) {
    e.printStackTrace();
    group.shutdownGracefully();
}

(7) Server

public NettyServer(List<ServiceConfig> serviceConfigList, Map<String, Method> interfaceMethodMap) {
    this.serviceConfigList = serviceConfigList;
    this.interfaceMethodMap = interfaceMethodMap;
}

public int init(int port) throws InterruptedException {
    EventLoopGroup bossGroup = new NioEventLoopGroup();
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    ServerBootstrap bootstrap = new ServerBootstrap();
    bootstrap.group(bossGroup, workerGroup)
            .channel(NioServerSocketChannel.class)
            .option(ChannelOption.SO_BACKLOG, 1024)
            .childHandler(new ChannelInitializer() {
                @Override
                protected void initChannel(Channel channel) throws Exception {
                    channel.pipeline().addLast(new DelimiterBasedFrameDecoder(1024 * 1024, DELIMITER));
                    channel.pipeline().addLast(new StringDecoder());
                    channel.pipeline().addLast(new RpcInvokeHandler(serviceConfigList, interfaceMethodMap));
                }
            });
    ChannelFuture cf = bootstrap.bind(port).sync();
    System.out.println("啟動NettyServer,端口為:" + port);
    return port;
}

2.項目地址

https://github.com/yclxiao/rpc-demo.git

五、總結

本文主要以Dubbo為例介紹了RPC調用核心流程,同時,寫了個簡易的RPC調用代碼。

記住以上的流程圖即可搞明白整個調用流程。然后再記住最核心的2句話:

所有的努力都是為了能在Consumer端和Provider端生成功能豐富的Proxy。核心事情由Protocol完成。

核心的5個部件:Registry、Proxy、Protocol、Invoker、Client、Server。

責任編輯:趙寧寧 來源: 不焦躁程序員
相關推薦

2021-07-08 12:32:58

2021-07-12 12:03:32

EPaxos分布式協議流程

2011-01-04 11:02:08

程序員

2009-07-16 17:42:47

WebWork配置

2020-12-31 12:16:49

SAP云計算SAP產品

2021-02-03 16:22:43

新基建SAP

2024-07-08 23:03:13

2021-04-28 10:13:58

zookeeperZNode核心原理

2011-11-25 14:01:05

VPNVPN設置IPsec VPN

2024-04-25 12:59:31

2011-11-11 10:00:41

NVIDIATegra 3

2012-05-14 17:22:38

ibmdw

2010-06-18 14:06:03

AMF協議

2021-04-06 09:22:47

云計算云計算產業云應用

2025-05-13 01:45:00

MCP技術Java

2022-02-09 23:02:53

Vuex開發管理模式

2010-03-31 09:20:28

Windows 7網絡互訪

2020-11-19 15:12:56

程序員技能開發者

2013-02-22 13:55:37

CSSWeb

2020-04-15 17:10:58

VirtualBoxKali LinuxLinux
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久久久久久久久久久久久 | 香蕉国产精品偷在线观看不卡| 亚洲精品99久久久久| 女人和拘做爰正片视频| 幼a在线观看| 国产乱理伦片在线观看夜一区| 欧美激情亚洲视频| 国产精品成人一区二区三区电影毛片| 91国产精品| 欧美性猛交xxxx| 国产又爽又黄ai换脸| 青青久草在线| 国产精品一区免费在线观看| 日韩av不卡在线| 久久久久久久久久久久久久久久久| 九九热精品视频在线观看| 在线播放日韩导航| 欧美私人情侣网站| www555久久| 老司机2019福利精品视频导航| 亚洲一区二区三区中文字幕在线观看 | 久久99国产精品自在自在app| 国产精品无码在线| 久久久久久久久久久久国产| 国产精品tv| 欧美日韩成人综合在线一区二区| 国产精品999视频| 成人片在线看| 中文一区一区三区高中清不卡| 国产精品9999久久久久仙踪林| 一区二区三区免费观看视频| 久久婷婷丁香| 91黑丝在线观看| 久草视频手机在线观看| 久久精品影视| 色av中文字幕一区| 成年人在线观看av| 蜜臀av一区| 亚洲第一福利网| 绯色av蜜臀vs少妇| 蜜桃在线一区| 91麻豆精品国产自产在线观看一区| 日本老熟妇毛茸茸| 欧美成人精品一区二区男人小说| 精品福利在线观看| 无码中文字幕色专区| 欧美xxxx做受欧美88bbw| 亚洲欧美国产77777| 亚洲最新在线| 国产丝袜在线| 亚洲激情五月婷婷| 青青在线视频免费观看| 亚洲综合影视| 亚洲一区在线观看免费观看电影高清 | 日韩免费av片在线观看| 黄色片免费观看视频| 国产一区二区三区的电影| 91国产精品视频在线| 欧美在线观看不卡| 日韩国产精品久久| 国产欧亚日韩视频| 99在线精品视频免费观看软件| 精品一区二区三区在线观看 | 91网址在线播放| 成人全视频免费观看在线看| 欧美乱熟臀69xxxxxx| 国内av免费观看| 成人自拍在线| 亚洲精品视频久久| 农村老熟妇乱子伦视频| 亚洲激情中文在线| 久久免费国产视频| 男人日女人网站| 日日噜噜夜夜狠狠视频欧美人| 国产精品美女主播| 午夜精品久久久久久久爽| caoporen国产精品视频| 日本成人三级| 99久久精品免费观看国产| 亚洲电影一区二区| 中文字幕在线导航| 日韩精品中文字幕一区二区| 日韩精品电影网| 农村老熟妇乱子伦视频| 欧美特黄一级| 国产精品网站视频| 六月婷婷综合网| 国产偷国产偷精品高清尤物| 在线观看三级网站| 色偷偷色偷偷色偷偷在线视频| 欧美日韩综合在线| 亚洲一区二区在线免费| 国产探花在线精品一区二区| 精品中文字幕在线| 日本黄色中文字幕| 成人亚洲精品久久久久软件| 青青草国产精品| 欧美卡一卡二| 欧美日韩一区国产| 国产精品嫩草av| 国产精品精品| 欧美亚洲在线观看| 99精品免费观看| 久久久久久久综合| 成人免费看片'免费看| 日本综合字幕| 亚洲精品一区二区三区四区高清| 女女互磨互喷水高潮les呻吟| 综合一区二区三区| 国产精品激情自拍| 午夜av免费观看| 亚洲视频香蕉人妖| 爱情岛论坛亚洲首页入口章节| 大桥未久女教师av一区二区| 久久精品国产欧美亚洲人人爽| 天天干天天干天天干天天| 国产精品一区二区久激情瑜伽| 欧美成人在线免费观看| 女人天堂av在线播放| 欧美日韩在线三级| 欧美丰满少妇人妻精品| 国产一区欧美| 亚洲一区二区三| 精品麻豆一区二区三区| 在线视频欧美精品| 久久精品老司机| 亚洲青涩在线| av资源站久久亚洲| www.久久ai| 在线播放中文字幕一区| 免费看日本黄色片| 日韩高清国产一区在线| 噜噜噜噜噜久久久久久91| av毛片午夜不卡高**水| 欧美成人video| 欧美日韩精品亚洲精品| 国产资源在线一区| 中文字幕在线观看一区二区三区| 国产综合色在线观看| 在线日韩欧美视频| 探花国产精品一区二区| 国产亚洲欧美一级| 黄色国产小视频| 亚洲调教一区| 国产精品久久久久久久av电影| 男人的天堂在线免费视频| 精品久久中文字幕| 久久久精品人妻无码专区| 午夜在线一区二区| 欧美一卡2卡3卡4卡无卡免费观看水多多| 午夜伦理福利在线| 亚洲性猛交xxxxwww| 男人天堂视频在线| 国产婷婷色一区二区三区四区 | 播放一区二区| 最近2019中文字幕一页二页| 亚洲一级视频在线观看| 国产精品久久久久久亚洲毛片| 亚洲美女爱爱视频| 91精品久久久久久久久久不卡| 91在线视频一区| 日本aa在线| 国产视频丨精品|在线观看| 亚洲 欧美 成人| 国产无人区一区二区三区| 婷婷激情四射五月天| 97精品视频| 99精品国产一区二区| 欧美少妇精品| 在线播放日韩av| 国产高清不卡视频| 亚洲mv大片欧洲mv大片精品| 日韩精品电影一区二区| 裸体一区二区三区| 91精品一区二区三区四区| 成人爽a毛片| 日本久久久久久| 久久日韩视频| 日韩福利在线播放| 在线观看毛片视频| 亚洲图片有声小说| 久久久视频6r| 国产精品综合二区| 精品中文字幕av| 国产精品成人av| 国产伦理一区二区三区| 日韩中文在线播放| 久久久欧美精品| 国产黄色免费在线观看| 欧美一级搡bbbb搡bbbb| 国产免费观看av| 中文字幕亚洲不卡| 玖草视频在线观看| 国产一区二区在线免费观看| 欧美国产激情视频| 综合国产精品| 日韩影视精品| 女同一区二区三区| 成人日韩av在线| 日韩av大片站长工具| 欧美激情在线有限公司| 888av在线| 日韩精品丝袜在线| 国产成人三级在线播放| 欧洲中文字幕精品| 日本三级2019| 自拍av一区二区三区| 国产成人福利在线| 成人美女视频在线观看18| 777一区二区| 日韩影院免费视频| 国产黄色一级网站| 影音先锋在线一区| 手机看片日韩国产| 日韩aaaa| 日韩中文字幕av在线| 私拍精品福利视频在线一区| 91亚洲精品视频| www.久久爱.com| 国产精品视频在线播放| 粉嫩一区二区| 91av视频导航| 岛国av在线播放| 久久久久久久av| 1024在线播放| 久久av资源网站| 黄网址在线观看| 日韩在线国产精品| 北条麻妃在线| 一区二区三区视频在线| 国产主播福利在线| 亚洲欧美三级伦理| 四虎在线视频| 国产亚洲精品va在线观看| 网站一区二区三区| 亚洲一区图片| 欧美视频在线播放一区| 99国内精品| 成人在线观看你懂的| 亚洲国产三级| 日韩视频免费播放| 99国产精品私拍| 国产男女无遮挡| 性娇小13――14欧美| 国产成人久久婷婷精品流白浆| 亚洲中午字幕| 成人黄色一区二区| 日本少妇一区二区| 男生操女生视频在线观看| 麻豆精品国产传媒mv男同| 伊人网在线综合| 精品无人区卡一卡二卡三乱码免费卡 | 日本泡妞xxxx免费视频软件| 国产成人小视频| www.啪啪.com| 91免费视频网| 国产午夜福利一区| 中文字幕日本不卡| 久草免费新视频| 狠狠久久五月精品中文字幕| 欧美成人一区二区三区四区| 欧美色综合影院| 国产免费黄色网址| 亚洲大胆人体视频| 成人18在线| 欧美成人免费大片| 91超碰国产在线| 日本高清久久天堂| 欧美日韩卡一| 成人区精品一区二区| 亚洲激情77| 一级黄色录像免费看| 黄色成人精品网站| 国产精品无码专区av在线播放| 久久99热国产| 亚洲少妇18p| 国产日韩一级二级三级| 日韩成人毛片视频| 都市激情亚洲色图| 91麻豆视频在线观看| 亚洲精品999| 久操视频在线观看| 欧日韩不卡在线视频| 91视频成人| 免费精品视频一区| 女人香蕉久久**毛片精品| 9久久9毛片又大又硬又粗| 麻豆精品一区二区三区| 在线观看一区二区三区视频| 久久噜噜亚洲综合| 国产盗摄x88av| 91黄色免费网站| 亚洲av综合色区无码一区爱av| 亚洲视频综合网| 黑人另类精品××××性爽| 国产精品久久久久久婷婷天堂 | 亚洲成人a**址| 国一区二区在线观看| 亚洲高清免费在线观看| 99r国产精品| 欧美日韩在线观看成人| 欧美这里有精品| 天天干天天摸天天操| 超碰91人人草人人干| 最新欧美电影| 精品国产免费久久久久久尖叫| 久久电影院7| 超碰影院在线观看| www.日韩精品| 欧美成人三级视频| 欧美日韩国产一二三| 91丨九色丨黑人外教| 日本 片 成人 在线| 99免费精品视频| 亚洲欧美小视频| 欧美午夜精品一区二区三区| 天天干天天插天天操| 欧美国产日韩免费| 999久久久国产999久久久| 热re99久久精品国99热蜜月| 亚洲伦理一区| 中国黄色片视频| 亚洲黄色av一区| 99精品在线视频观看| 日韩一区二区三区在线播放| 成人精品高清在线视频| 欧美中日韩一区二区三区| 亚洲深夜av| av网页在线观看| 午夜视频在线观看一区| 亚洲免费成人网| 欧美激情视频网| av综合网站| 久草视频这里只有精品| 国产成人av一区| 免费视频一二三区| 日韩欧美中文一区| 日本高清在线观看| 成人在线看片| 国产精品hd| 97精品人妻一区二区三区蜜桃| 一区二区三区美女| 成人午夜精品福利免费| 欧美激情精品久久久久久大尺度| 欧美三级一区| 久久久久久久9| 成人国产在线观看| 亚洲免费观看在线视频| 日韩av大片在线观看| 亚洲黄色在线看| 91黄页在线观看| 九色综合婷婷综合| 美女诱惑一区| 级毛片内射视频| 欧美人妖巨大在线| 99福利在线| 国产精品区二区三区日本| 国产一区二区三区久久久久久久久| 大地资源二中文在线影视观看| 欧美日韩一区二区精品| www黄在线观看| 91久久久久久久久| 精品福利av| 91国模少妇一区二区三区| 欧美三级一区二区| 在线中文字幕视频观看| 狠狠色噜噜狠狠狠狠色吗综合| 三级欧美在线一区| 午夜精品一区二区三级视频| 日韩亚洲欧美一区二区三区| 成人黄色动漫| 亚洲成色最大综合在线| 国产精品18久久久久久久网站| 久久露脸国语精品国产91| 在线看日韩欧美| 成人三级毛片| 91欧美视频在线| 亚洲图片欧美视频| 国产高清一级毛片在线不卡| 91亚洲国产精品| 久久五月激情| 九九热最新地址| 亚洲美女又黄又爽在线观看| 外国成人毛片| 5月婷婷6月丁香| 最新国产成人在线观看| 天堂av一区二区三区| 国产精品自拍偷拍| 亚洲激情一区| 国产3级在线观看| 国产视频丨精品|在线观看| 国产精品一区二区三区四区在线观看| 欧美日韩在线一| 亚洲素人一区二区| 黄色片视频在线观看| 91文字幕巨乱亚洲香蕉| 奇米精品一区二区三区四区| 日本高清www免费视频| www.色综合| 你懂的视频欧美|