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

從0 開始手寫一個 RPC 框架,大多數都不清楚的技術

開發 架構
RPC 框架底層到底什么原理得知了RPC(遠程過程調用)簡單來說就是調用遠程的服務就像調用本地方法一樣,其中用到的知識有序列化和反序列化、動態代理、網絡傳輸、動態加載、反射這些知識點。

[[312360]]

RPC 框架底層到底什么原理得知了RPC(遠程過程調用)簡單來說就是調用遠程的服務就像調用本地方法一樣,其中用到的知識有序列化和反序列化、動態代理、網絡傳輸、動態加載、反射這些知識點。

 

從0 開始手寫一個 RPC 框架,大多數都不清楚的技術

 

發現這些知識都了解一些。所以就想著試試自己實現一個簡單的RPC框架,即鞏固了基礎的知識,也能更加深入的了解RPC原理。

當然一個完整的RPC框架包含了許多的功能,例如服務的發現與治理,網關等等,本篇只是簡單的實現了一個調用的過程。

傳參出參分析

一個簡單請求可以抽象為兩步

 

從0 開始手寫一個 RPC 框架,大多數都不清楚的技術

 

那么就根據這兩步進行分析,在請求之前我們應該發送給服務端什么信息?而服務端處理完以后應該返回客戶端什么信息?

在請求之前我們應該發送給服務端什么信息?

由于我們在客戶端調用的是服務端提供的接口,所以我們需要將客戶端調用的信息傳輸過去,那么我們可以將要傳輸的信息分為兩類

第一類是服務端可以根據這個信息找到相應的接口實現類和方法

第二類是調用此方法傳輸的參數信息

那么我們就根據要傳輸的兩類信息進行分析,什么信息能夠找到相應的實現類的相應的方法?要找到方法必須要先找到類,這里我們可以簡單的用Spring提供的Bean實例管理ApplicationContext進行類的尋找。

所以要找到類的實例只需要知道此類的名字就行,找到了類的實例,那么如何找到方法呢?

在反射中通過反射能夠根據方法名和參數類型從而找到這個方法。那么此時第一類的信息我們就明了了,那么就建立相應的是實體類存儲這些信息。

  1. @Data 
  2. public class Request implements Serializable { 
  3.  private static final long serialVersionUID = 3933918042687238629L; 
  4.  private String className; 
  5.  private String methodName; 
  6.  private Class<?> [] parameTypes; 
  7.  private Object [] parameters; 

服務端處理完以后應該返回客戶端什么信息?

上面我們分析了客戶端應該傳輸什么信息給服務端,那么服務端處理完以后應該傳什么樣的返回值呢?

這里我們只考慮最簡單的情況,客戶端請求的線程也會一直在等著,不會有異步處理這一說,所以這么分析的話就簡單了,直接將得到的處理結果返回就行了。

  1. @Data 
  2. public class Response implements Serializable { 
  3.  private static final long serialVersionUID = -2393333111247658778L; 
  4.  private Object result; 

由于都涉及到了網絡傳輸,所以都要實現序列化的接口

如何獲得傳參信息并執行?-客戶端

上面我們分析了客戶端向服務端發送的信息都有哪些?那么我們如何獲得這些信息呢?

首先我們調用的是接口,所以我們需要寫自定義注解然后在程序啟動的時候將這些信息加載在Spring容器中。

有了這些信息那么我們就需要傳輸了,調用接口但是實際上執行的確實網絡傳輸的過程,所以我們需要動態代理。那么就可以分為以下兩步

  • 初始化信息階段:將key為接口名,value為動態接口類注冊進Spring容器中
  • 執行階段:通過動態代理,實際執行網絡傳輸

初始化信息階段

由于我們使用Spring作為Bean的管理,所以要將接口和對應的代理類注冊進Spring容器中。而我們如何找到我們想要調用的接口類呢?我們可以自定義注解進行掃描。將想要調用的接口全部注冊進容器中。

創建一個注解類,用于標注哪些接口是可以進行Rpc的。

  1. @Target({ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. public @interface RpcClient { 

然后創建對于@RpcClient注解的掃描類RpcInitConfig,將其注冊進Spring容器中。

  1. public class RpcInitConfig implements ImportBeanDefinitionRegistrar{ 
  2.  @Override 
  3.  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { 
  4.  ClassPathScanningCandidateComponentProvider provider = getScanner(); 
  5.  //設置掃描器 
  6.  provider.addIncludeFilter(new AnnotationTypeFilter(RpcClient.class)); 
  7.  //掃描此包下的所有帶有@RpcClient的注解的類 
  8.  Set<BeanDefinition> beanDefinitionSet = provider.findCandidateComponents("com.example.rpcclient.client"); 
  9.  for (BeanDefinition beanDefinition : beanDefinitionSet){ 
  10.  if (beanDefinition instanceof AnnotatedBeanDefinition){ 
  11.  //獲得注解上的參數信息 
  12.  AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanDefinition; 
  13.  String beanClassAllName = beanDefinition.getBeanClassName(); 
  14.  Map<String, Object> paraMap = annotatedBeanDefinition.getMetadata() 
  15.  .getAnnotationAttributes(RpcClient.class.getCanonicalName()); 
  16.  //將RpcClient的工廠類注冊進去 
  17.  BeanDefinitionBuilder builder = BeanDefinitionBuilder 
  18.  .genericBeanDefinition(RpcClinetFactoryBean.class); 
  19.  //設置RpcClinetFactoryBean工廠類中的構造函數的值 
  20.  builder.addConstructorArgValue(beanClassAllName); 
  21.  builder.getBeanDefinition().setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); 
  22.  //將其注冊進容器中 
  23.  registry.registerBeanDefinition( 
  24.  beanClassAllName , 
  25.  builder.getBeanDefinition()); 
  26.  } 
  27.  } 
  28.  } 
  29.  //允許Spring掃描接口上的注解 
  30.  protected ClassPathScanningCandidateComponentProvider getScanner() { 
  31.  return new ClassPathScanningCandidateComponentProvider(false) { 
  32.  @Override 
  33.  protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) { 
  34.  return beanDefinition.getMetadata().isInterface() && beanDefinition.getMetadata().isIndependent(); 
  35.  } 
  36.  }; 
  37.  } 

由于上面注冊的是工廠類,所以我們建立一個工廠類RpcClinetFactoryBean繼承Spring中的FactoryBean類,由其統一創建@RpcClient注解的代理類。推薦閱讀:Spring零配置之@Configuration注解詳解。

  1. @Data 
  2. public class RpcClinetFactoryBean implements FactoryBean { 
  3.  @Autowired 
  4.  private RpcDynamicPro rpcDynamicPro; 
  5.  private Class<?> classType; 
  6.  public RpcClinetFactoryBean(Class<?> classType) { 
  7.  this.classType = classType; 
  8.  } 
  9.  @Override 
  10.  public Object getObject(){ 
  11.  ClassLoader classLoader = classType.getClassLoader(); 
  12.  Object object = Proxy.newProxyInstance(classLoader,new Class<?>[]{classType},rpcDynamicPro); 
  13.  return object; 
  14.  } 
  15.  @Override 
  16.  public Class<?> getObjectType() { 
  17.  return this.classType; 
  18.  } 
  19.  @Override 
  20.  public boolean isSingleton() { 
  21.  return false
  22.  } 

注意此處的getObjectType方法,在將工廠類注入到容器中的時候,這個方法返回的是什么Class類型那么注冊進容器中就是什么Class類型。

然后看一下我們創建的代理類RpcDynamicPro。

  1. @Component 
  2. @Slf4j 
  3. public class RpcDynamicPro implements InvocationHandler { 
  4.  @Override 
  5.  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  6.  String requestJson = objectToJson(method,args); 
  7.  Socket client = new Socket("127.0.0.1", 20006); 
  8.  client.setSoTimeout(10000); 
  9.  //獲取Socket的輸出流,用來發送數據到服務端 
  10.  PrintStream out = new PrintStream(client.getOutputStream()); 
  11.  //獲取Socket的輸入流,用來接收從服務端發送過來的數據 
  12.  BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream())); 
  13.  //發送數據到服務端 
  14.  out.println(requestJson); 
  15.  Response response = new Response(); 
  16.  Gson gson =new Gson(); 
  17.  try{ 
  18.  //從服務器端接收數據有個時間限制(系統自設,也可以自己設置),超過了這個時間,便會拋出該異常 
  19.  String responsJson = buf.readLine(); 
  20.  response = gson.fromJson(responsJson, Response.class); 
  21.  }catch(SocketTimeoutException e){ 
  22.  log.info("Time out, No response"); 
  23.  } 
  24.  if(client != null){ 
  25.  //如果構造函數建立起了連接,則關閉套接字,如果沒有建立起連接,自然不用關閉 
  26.  client.close(); //只關閉socket,其關聯的輸入輸出流也會被關閉 
  27.  } 
  28.  return response.getResult(); 
  29.  } 
  30.  public String objectToJson(Method method,Object [] args){ 
  31.  Request request = new Request(); 
  32.  String methodName = method.getName(); 
  33.  Class<?>[] parameterTypes = method.getParameterTypes(); 
  34.  String className = method.getDeclaringClass().getName(); 
  35.  request.setMethodName(methodName); 
  36.  request.setParameTypes(parameterTypes); 
  37.  request.setParameters(args); 
  38.  request.setClassName(getClassName(className)); 
  39.  GsonBuilder gsonBuilder = new GsonBuilder(); 
  40.  gsonBuilder.registerTypeAdapterFactory(new ClassTypeAdapterFactory()); 
  41.  Gson gson = gsonBuilder.create(); 
  42.  return gson.toJson(request); 
  43.  } 
  44.  private String getClassName(String beanClassName){ 
  45.  String className = beanClassName.substring(beanClassName.lastIndexOf(".")+1); 
  46.  className = className.substring(0,1).toLowerCase() + className.substring(1); 
  47.  return className; 
  48.  } 

我們的客戶端已經寫完了,傳給服務端的信息我們也已經拼裝完畢了。剩下的工作就簡單了,開始編寫服務端的代碼。

服務端處理完以后應該返回客戶端什么信息?-服務端

服務端的代碼相比較客戶端來說要簡單一些。可以簡單分為下面三步

  • 拿到接口名以后,通過接口名找到實現類
  • 通過反射進行對應方法的執行
  • 返回執行完的信息

那么我們就根據這三步進行編寫代碼

拿到接口名以后,通過接口名找到實現類

如何通過接口名拿到對應接口的實現類呢?這就需要我們在服務端啟動的時候將其對應信息加載進去。

  1. @Component 
  2. @Log4j 
  3. public class InitRpcConfig implements CommandLineRunner { 
  4.  @Autowired 
  5.  private ApplicationContext applicationContext; 
  6.  public static Map<String,Object> rpcServiceMap = new HashMap<>(); 
  7.  @Override 
  8.  public void run(String... args) throws Exception { 
  9.  Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(Service.class); 
  10.  for (Object bean: beansWithAnnotation.values()){ 
  11.  Class<?> clazz = bean.getClass(); 
  12.  Class<?>[] interfaces = clazz.getInterfaces(); 
  13.  for (Class<?> inter : interfaces){ 
  14.  rpcServiceMap.put(getClassName(inter.getName()),bean); 
  15.  log.info("已經加載的服務:"+inter.getName()); 
  16.  } 
  17.  } 
  18.  } 
  19.  private String getClassName(String beanClassName){ 
  20.  String className = beanClassName.substring(beanClassName.lastIndexOf(".")+1); 
  21.  className = className.substring(0,1).toLowerCase() + className.substring(1); 
  22.  return className; 
  23.  } 

此時rpcServiceMap存儲的就是接口名和其對應的實現類的對應關系。

通過反射進行對應方法的執行

此時拿到了對應關系以后就能根據客戶端傳過來的信息找到相應的實現類中的方法。然后進行執行并返回信息就行。

  1. public Response invokeMethod(Request request){ 
  2.  String className = request.getClassName(); 
  3.  String methodName = request.getMethodName(); 
  4.  Object[] parameters = request.getParameters(); 
  5.  Class<?>[] parameTypes = request.getParameTypes(); 
  6.  Object o = InitRpcConfig.rpcServiceMap.get(className); 
  7.  Response response = new Response(); 
  8.  try { 
  9.  Method method = o.getClass().getDeclaredMethod(methodName, parameTypes); 
  10.  Object invokeMethod = method.invoke(o, parameters); 
  11.  response.setResult(invokeMethod); 
  12.  } catch (NoSuchMethodException e) { 
  13.  log.info("沒有找到"+methodName); 
  14.  } catch (IllegalAccessException e) { 
  15.  log.info("執行錯誤"+parameters); 
  16.  } catch (InvocationTargetException e) { 
  17.  log.info("執行錯誤"+parameters); 
  18.  } 
  19.  return response; 

現在我們兩個服務都啟動起來并且在客戶端進行調用就發現只是調用接口就能調用過來了。

總結

到現在一個簡單的RPC就完成了,但是其中還有很多的功能需要完善,例如一個完整RPC框架肯定還需要服務注冊與發現,而且雙方通信肯定也不能是直接開啟一個線程一直在等著,肯定需要是異步的等等的各種功能。

后面隨著學習的深入,這個框架也會慢慢增加一些東西。不僅是對所學知識的一個應用,更是一個總結。有時候學一個東西學起來覺得很簡單,但是真正應用的時候就會發現各種各樣的小問題。

比如在寫這個例子的時候碰到一個問題就是@Autowired的時候一直找不到SendMessage的類型,最后才發現是工廠類

  1. public Class<?> getObjectType() { 
  2.  return this.getClass();; 

這樣的話注冊進容器的就是RpcClinetFactoryBean類型的而不是SendMessage的類型。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2020-11-25 09:49:05

Hibernate

2018-08-15 10:51:01

JavaSpring MVC框架

2020-11-02 08:19:18

RPC框架Java

2021-03-01 19:13:45

YAML程序員數據

2020-08-18 08:22:46

歸并排序

2009-07-14 15:39:34

Swing大多數控件

2025-07-07 00:00:00

MCPA2AAPI

2019-05-13 15:05:34

TomcatWeb Server協議

2019-12-13 17:29:50

物聯網大數據安全

2021-11-09 06:01:35

前端JITAOT

2017-05-08 14:27:49

PHP框架函數框架

2011-05-26 10:50:31

2024-07-04 15:47:28

2014-01-02 10:34:54

設計設計師

2021-03-10 08:56:37

Zookeeper

2021-02-20 09:45:02

RPC框架Java

2016-10-26 09:42:13

2021-07-27 07:31:16

JavaArrayList數組

2022-05-15 21:52:04

typeTypeScriptinterface

2020-11-26 09:52:03

禁用43個APP
點贊
收藏

51CTO技術棧公眾號

免费观看在线午夜影视| aaa在线视频| 哺乳一区二区三区中文视频| 五月激情综合色| 欧美亚洲国产免费| 国产精品视频在线观看免费| 尤物在线精品| 在线看日韩欧美| 国产又黄又嫩又滑又白| 亚洲欧洲自拍| 亚洲欧美乱综合| 久久久久久精| 国产美女永久免费| 在线一区欧美| 久久综合伊人77777尤物| 日本护士做爰视频| 色成人综合网| 色琪琪一区二区三区亚洲区| 国产在线无码精品| 激情小说 在线视频| 国产成人在线免费| 国产91免费看片| 国产在线成人精品午夜| 日韩久久精品| 日韩精品黄色网| 在线观看av免费观看| 成人美女大片| 午夜欧美在线一二页| 日韩第一页在线观看| 青青草视频免费在线观看| 国产精品一区不卡| 欧洲一区二区三区免费视频| 一级特黄妇女高潮| 国产福利在线视频| 不卡的av在线| 亚洲综合大片69999| 亚洲精品毛片一区二区三区| 一区二区三区四区五区精品视频| 久久这里只有精品99| 99久久久无码国产精品衣服| 欧洲亚洲视频| 亚洲电影av在线| 91成人在线观看喷潮蘑菇| 日韩国产大片| 欧美日韩国产免费| 精品久久久久久久无码| 亚洲最新无码中文字幕久久| 亚洲成人一二三| 成人午夜免费在线视频| av中文字幕在线观看| 亚洲天天做日日做天天谢日日欢| 日韩片电影在线免费观看| 日韩a在线看| 久久综合成人精品亚洲另类欧美| 国模精品娜娜一二三区| 亚洲av综合色区无码一二三区 | 日本肉体xxxx裸体xxx免费| 涩涩视频在线播放| 五月激情综合网| 精品久久久久久久久久中文字幕| 国产在线拍揄自揄拍视频 | 成人一级视频在线观看| 成人免费在线一区二区三区| 亚洲国产福利视频| 成人免费视频国产在线观看| 国产精品视频入口| 视频在线观看你懂的| 91视频www| 日本精品一区二区三区视频 | 国产在线播放精品| 亚洲精品第一页| 中国av免费看| 国产中文精品久高清在线不| 在线日韩第一页| 北条麻妃在线观看视频| 欧美国产精品| 性欧美办公室18xxxxhd| 九九九在线观看| 日本亚洲欧美天堂免费| 国产中文欧美精品| www.亚洲黄色| 91麻豆精品视频| 视频一区国产精品| av在线网址观看| 亚洲h动漫在线| 成年人小视频网站| 国产成人免费av一区二区午夜| 日韩一区二区精品葵司在线| 老熟妇精品一区二区三区| 你懂的一区二区三区| 中文字幕日韩高清| 欧洲猛交xxxx乱大交3| 亚洲日本久久| 国产精品视频区1| 高潮一区二区三区乱码| 国产亚洲综合av| 五月天激情图片| japanese23hdxxxx日韩| 91精品视频网| www.自拍偷拍| 综合在线视频| 日韩美女在线播放| 国产乱码一区二区| 久久女同精品一区二区| 欧美 国产 精品| 校园春色亚洲色图| 日韩欧美另类在线| 欧美精品日韩在线| 日韩午夜一区| 亚洲综合色激情五月| 三区在线视频| 亚洲综合激情小说| 欧美美女一级片| 亚洲区小说区图片区qvod按摩| 久久久黄色av| 久操视频在线免费观看| 成人av电影在线网| 992tv成人免费观看| 免费电影日韩网站| 亚洲第一精品久久忘忧草社区| 欧美福利在线视频| 裸体素人女欧美日韩| 国产传媒欧美日韩| 激情在线小视频| 欧美主播一区二区三区美女| 你懂得在线视频| 欧美日本三区| 91久久久久久久久久久| 成人在线免费观看| 欧美午夜性色大片在线观看| 美女扒开腿免费视频| 精品少妇一二三区| 日本道不卡免费一区| 91精品国产乱码久久久久久久久 | 卡一卡二国产精品| 美女被啪啪一区二区| 国产偷倩在线播放| 欧美一卡二卡在线| 欧美另类videoxo高潮| 日本不卡一区二区三区| 日本免费高清一区二区| 黄在线观看免费网站ktv| 日韩精品资源二区在线| 欧美黑人性猛交xxx| 久久se精品一区二区| 色综合电影网| 国产经典一区| 亚洲亚裔videos黑人hd| 好吊妞视频一区二区三区| 成人免费的视频| 妞干网在线观看视频| 91大神精品| 久久久久久亚洲| 特级丰满少妇一级aaaa爱毛片| 亚洲一二三专区| 亚洲中文字幕无码一区| 99精品免费网| 久久资源av| 欧美日韩视频网站| 亚洲色图50p| 国产成人av免费| 国产精品五月天| 中文字幕日韩综合| 一本一道久久a久久精品蜜桃| 91在线视频导航| 欧洲精品二区| 亚洲精品国产精品国产自| 日韩色图在线观看| 欧美国产乱子伦| 中文字幕亚洲影院| 国产精品vip| 精品蜜桃一区二区三区| 偷拍视频一区二区三区| 中文字幕亚洲在线| 99久久亚洲精品日本无码 | 亚洲黄色三级视频| 久久久久久久久久看片| www.激情小说.com| 亚洲精品91| 久久精品国产69国产精品亚洲| 怡春院在线视频| 亚洲精品国久久99热| 日本一级片在线播放| 久久九九99| 日本三级福利片| 欧美a级网站| 国产区亚洲区欧美区| 91高清在线观看视频| 亚洲国产美女精品久久久久∴| 日韩熟女精品一区二区三区| 国产日产精品1区| 乳色吐息在线观看| 亚洲欧美久久| av不卡在线免费观看| 香蕉久久夜色精品国产更新时间| 国产精品一二区| 大黄网站在线观看| 伊人久久大香线蕉av一区二区| 国内老熟妇对白hdxxxx| 色哟哟国产精品| 欧美成人精品欧美一| 久久久久国产一区二区三区四区 | 国产亚洲高清一区| 欧美综合一区第一页| 蜜桃av在线免费观看| 亚洲精品91美女久久久久久久| 中文字幕一区二区在线视频| 亚洲夂夂婷婷色拍ww47| av永久免费观看| 成人av资源站| 欧美一级特黄aaa| 美女诱惑一区| 青青青青草视频| 香蕉av一区二区| 欧美日韩国产精品一区二区| 视频二区欧美| 国产欧美日韩精品在线观看| 欧美13videosex性极品| 欧美国产日本高清在线 | 国产小视频精品| 国产视频一区欧美| 国产91在线亚洲| 视频在线不卡免费观看| 女女同性女同一区二区三区91| 视频欧美一区| 91亚洲精品久久久久久久久久久久| 中文字幕一区久| 久久久中文字幕| 在线观看三级视频| www.久久久久| 中文字幕在线观看日本| 亚洲男人的天堂在线| 欧美一级免费片| 日韩欧美视频一区| 国产视频第一页| 91 com成人网| 亚洲中文字幕在线观看| 在线亚洲免费视频| 激情视频网站在线观看| 欧美日韩国产一区二区三区| 国产无遮挡裸体免费视频| 亚洲精品视频在线观看免费| 久久久久久久久久97| 亚洲国产精品成人综合色在线婷婷| 中文字幕一区二区三区人妻| 99riav一区二区三区| 毛茸茸free性熟hd| 99麻豆久久久国产精品免费优播| 扒开伸进免费视频| 成人不卡免费av| 搡老熟女老女人一区二区| av一区二区三区黑人| 黄色在线免费播放| 99精品视频免费在线观看| 7788色淫网站小说| 久久亚洲精华国产精华液| 午夜不卡久久精品无码免费| 91视频在线看| 中文字幕人妻一区二区| 欧美激情在线看| 任你操精品视频| 亚洲欧美国产三级| 久久精品一级片| 黄色一区二区三区| 国产午夜精品久久久久| 色94色欧美sute亚洲线路一ni| 日本视频免费观看| 欧美日韩一区二区在线观看| 国产精品视频无码| 亚洲精品一区二区三区精华液| 四虎免费在线观看| 国产一区二区三区四区福利| 天天在线视频色| 美女福利视频一区| xxxx在线视频| 国产成人精品综合| 亚州欧美在线| 国产亚洲情侣一区二区无| 免费一区二区三区视频导航| www.午夜色| 伊人久久大香线蕉综合热线| av天堂永久资源网| 久久超碰97中文字幕| 亚洲av成人精品一区二区三区| 久久女同精品一区二区| 极品色av影院| 精品久久中文字幕久久av| 五月激情丁香网| 日韩精品在线一区| 久久米奇亚洲| 欧美日韩成人在线播放| 国产精品专区免费| 亚洲一区二区久久久久久| 欧洲vs亚洲vs国产| 日韩不卡一二区| 欧美亚洲免费| 超碰人人cao| 欧美国产在线观看| 精品无码av在线| 欧美无砖专区一中文字| 国产 日韩 欧美 综合| 中文字幕不卡av| av资源新版天堂在线| 国产精品无码专区在线观看| 国产精品三p一区二区| 亚洲午夜精品久久久久久浪潮| 激情综合网址| 污污的网站免费| 91免费观看在线| 91精品国产高清一区二区三蜜臀| 欧美视频国产精品| 国产av一区二区三区| 国产亚洲福利一区| 98色花堂精品视频在线观看| 国产在线精品一区免费香蕉 | 国产午夜精品理论片a级探花| 黄色在线免费| 国产精品欧美激情| 久久精品国产亚洲blacked| 亚洲精品无人区| 亚洲人成在线影院| 好吊操视频这里只有精品| 国产精品无人区| 亚洲中文无码av在线| 日韩精品在线影院| √天堂8资源中文在线| 91成人免费在线观看| 国产第一亚洲| 国产精品香蕉国产| 亚洲伊人春色| 自拍日韩亚洲一区在线| 国产高清视频一区| 亚洲人做受高潮| 欧美性猛交xxxx黑人交| 黄色在线观看网| 欧美在线一级视频| 女人抽搐喷水高潮国产精品| 欧美久久久久久久久久久久久久| 国产资源在线一区| 免费三级在线观看| 欧美美女一区二区| 欧美尤物美女在线| 国产精品视频在线观看| av中文一区| 黄色手机在线视频| 欧美激情一区二区三区蜜桃视频| 国产伦精品一区二区三区视频我| 亚洲精品视频网上网址在线观看| 国产污视频在线播放| 精品无码久久久久久久动漫| 在线视频免费在线观看一区二区| 老熟妇精品一区二区三区| 欧美三级免费观看| 九色在线播放| 国产精品久久色| 国产精品久久久久蜜臀| 欧美国产日韩在线视频| 依依成人精品视频| www.av导航| 性色av香蕉一区二区| 先锋影音国产精品| 日本人视频jizz页码69| 国产精品嫩草99a| 国产又黄又大又爽| 欧美成人亚洲成人| 久9re热视频这里只有精品| 人妻熟妇乱又伦精品视频| 久久尤物电影视频在线观看| 亚洲大尺度在线观看| y97精品国产97久久久久久| 国产精品毛片无码| 搞av.com| 久久女同性恋中文字幕| 亚洲天堂网视频| 欧美乱大交xxxxx另类电影| 日韩欧美美女在线观看| 国产天堂在线播放| 亚洲欧美激情视频在线观看一区二区三区| 亚洲AV无码精品国产| 欧美亚洲国产视频小说| 欧美亚洲精品在线| 初高中福利视频网站| 精品成人在线视频| 永久免费av在线| 粉嫩精品一区二区三区在线观看 | 欧美69精品久久久久久不卡| 午夜视频在线观看一区二区| 在线免费看av| 国产精品区二区三区日本| 首页综合国产亚洲丝袜| 永久免费看黄网站| 亚洲欧美中文字幕| 国产日韩在线观看视频 | 久久激情五月婷婷| 久久精品久久国产| 一区二区三区在线播放欧美| 国产精品巨作av| 中文字幕第22页| 在线影院国内精品| heyzo高清国产精品|