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

一個簡單的案例入門 gRPC

開發 項目管理
小伙伴們看到,這里首先需要和服務端建立連接,給出服務端的地址和端口號即可,usePlaintext() 方法表示不使用 TLS 對連接進行加密(默認情況下會使用 TLS 對連接進行加密),生產環境建議使用加密連接。

這篇文章本來要在年前和小伙伴們見面,但是因為我之前的 Mac 系統版本是 10.13.6,這個版本比較老,時至今天在運行一些新鮮玩意的時候有時候會有一些 BUG(例如運行最新版的 Nacos 等),運行 gRPC 的插件也有 BUG,代碼總是生成有問題,但是因為系統升級是一個大事,所以一直等到過年放假,在家才慢慢折騰將 Mac 升級到目前的 13.1 版本,之前這些問題現在都沒有了,gRPC 的案例現在也可以順利跑起來了。

所以今天就來和小伙伴們簡單聊一聊 gRPC。

1. 緣起

我為什么想寫一篇 gRPC 的文章呢?其實本來我是想和小伙伴們梳理一下在微服務中都有哪些跨進城調用的方式,在梳理的過程中想到了 gRPC,發現還沒寫文章和小伙伴們聊過 gRPC,因此打算先來幾篇文章和小伙伴們詳細介紹一下 gRPC,然后再梳理微服務中的跨進程方案。

2. 什么是 gRPC

了解 gRPC 之前先來看看什么是 RPC。

RPC 全稱是 Remote Procedure Call,中文一般譯作遠程過程調用。RPC 是一種進程間的通信模式,程序分布在不同的地址空間里。簡單來說,就是兩個進程之間互相調用的一種方式。

gRPC 則是一個由 Google 發起的開源的 RPC 框架,它是一個高性能遠程過程調用 (RPC) 框架,可以在任何環境中運行。gRPC 通過對負載均衡、跟蹤、健康檢查和身份驗證的可插拔支持,有效地連接數據中心內和數據中心之間的服務。

在 gRPC 中,客戶端應用程序可以直接調用部署在不同機器上的服務端應用程序中的方法,就好像它是本地對象一樣,使用 gRPC 可以更容易地創建分布式應用程序和服務。與許多 RPC 系統一樣,gRPC 基于定義服務的思想,指定基于參數和返回類型遠程調用的方法。在服務端側,服務端實現接口,運行 gRPC 服務,處理客戶端調用。在客戶端側,客戶端擁有存根(Stub,在某些語言中稱為客戶端),它提供與服務端相同的方法。

圖片

gRPC 客戶端和服務端可以在各種環境中運行和相互通信 – 從 Google 內部的服務器到你自己的桌面 – 并且可以使用 gRPC 支持的任何語言編寫。因此,你可以輕松地用 Java 創建 gRPC 服務端,使用 Go、Python 或 Ruby 創建客戶端。此外,最新的 Google API 將包含 gRPC 版本的接口,使你輕松地將 Google 功能構建到你的應用程序中。

gRPC 支持的語言版本:

圖片

說了這么多,還是得整兩個小案例小伙伴們可能才會清晰,所以我們也不廢話了,上案例。

3. 實踐

先來看下我們的項目結構:

├── grpc-api
│ ├── pom.xml
│ ├── src
├── grpc-client
│ ├── pom.xml
│ ├── src
├── grpc-server
│ ├── pom.xml
│ ├── src
└── pom.xml

大家看下,這里首先有一個 grpc-api,這個模塊用來放我們的公共代碼;grpc-server 是我們的服務端,grpc-client 則是我們的客戶端,這些都是普通的 maven 項目。

3.1 grpc-api

在 grpc-api 中,我們首先引入項目依賴,如下:

<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.52.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.52.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.52.1</version>
</dependency>
<dependency> <!-- necessary for Java 9+ -->
<groupId>org.apache.tomcat</groupId>
<artifactId>annotations-api</artifactId>
<version>6.0.53</version>
<scope>provided</scope>
</dependency>
</dependencies>

除了這些常規的依賴之外,還需要一個插件:

<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.2</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.51.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

我來說一下這個插件的作用。

默認情況下,gRPC 使用 Protocol Buffers,這是 Google 提供的一個成熟的開源的跨平臺的序列化數據結構的協議,我們編寫對應的 proto 文件,通過上面這個插件可以將我們編寫的 proto 文件自動轉為對應的 Java 類。

多說一句,使用 Protocol Buffers 并不是必須的,也可以使用 JSON 等,但是目前來說這個場景更常用的還是 Portal Buffers。

接下來我們在 main 目錄下新建 proto 文件夾,如下:

圖片

注意,這個文件夾位置是默認的。如果我們的 proto 文件不是放在 src/main/proto 位置,那么在配置插件的時候需要指定 proto 文件的位置,咱們本篇文章主要是入門,我這里就使用默認的位置。

在 proto 文件夾中,我們新建一個 product.proto 文件,內容如下:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "org.javaboy.grpc.demo";
option java_outer_classname = "ProductProto";

package product;

service ProductInfo {
rpc addProduct (Product) returns (ProductId);
rpc getProduct(ProductId) returns(Product);
}

message Product {
string id = 1;
string name=2;
string descriptinotallow=3;
float price=4;
}

message ProductId {
string value = 1;
}

這段配置算是一個比較核心的配置了,這里主要說明了負責進程傳輸的類、方法等到底是個啥樣子:

  1. syntax = "proto3";:這個是 protocol buffers 的版本。
  2. option java_multiple_files = true;:這個字段是可選的,如果設置為 true,表示每一個 message 文件都會有一個單獨的 class 文件;否則,message 全部定義在 outerclass 文件里。
  3. option java_package = "org.javaboy.grpc.demo";:這個字段是可選的,用于標識生成的 java 文件的 package。如果沒有指定,則使用 proto 里定義的 package,如果package 也沒有指定,那就會生成在根目錄下。
  4. option java_outer_classname = "ProductProto";:這個字段是可選的,用于指定 proto 文件生成的 java 類的 outerclass 類名。什么是 outerclass?簡單來說就是用一個 class 文件來定義所有的 message 對應的 Java 類,這個 class 就是 outerclass;如果沒有指定,默認是 proto 文件的駝峰式;
  5. package product;:這個屬性用來定義 message 的包名。包名的含義與平臺語言無關,這個 package 僅僅被用在 proto 文件中用于區分同名的 message 類型??梢岳斫鉃?message 全名的前綴,和 message 名稱合起來唯一標識一個 message 類型。當我們在 proto 文件中導入其他 proto 文件的 message,需要加上 package 前綴才行。所以包名是用來唯一標識 message 的。
  6. service:我們定義的跨平臺方法都寫在 service 中,上面的案例中我們定義了兩個方法:addProduct 表示添加一件商品,參數是一個 Product 對象,返回值則是剛剛添加成功的商品的 ID;getProduct 則表示根據 ID 查詢一個商品,參數是一個商品 ID,返回值則是查詢到的商品對象。這里的定義相當于一個接口,將來我們要在 Java 代碼中實現這個接口。
  7. message:這里有點像我們在 Java 中定義類,上文中我們定義了兩個類,分別是 Product 和 ProductId 兩個類。這兩個類在 service 中被使用。

message 中定義的有點像我們 Java 中定義的類,但是不能直接使用 Java 中的數據類型,畢竟這是 Protocol buffers,這個是和語言無關的,將來可以據此生成不同語言的代碼,這里我們可以使用的類型和我們 Java 類型之間的對應關系如下:

圖片

另外我們在 message 中定義的屬性的時候,都會給一個數字,例如 id=1,name=2 等,這個數字將來會在二進制消息中標識我們的字段,并且一旦我們的消息類型被使用就不應更改,這個有點像序列化的感覺。

實際上,這個 message 編譯后的字節內容大概像下面這樣:

圖片

這里的標簽中的內容包含兩部分,字段索引和字段類型,字段索引其實就是我們上面定義的數字。

定義完成之后,接下來我們就需要使用插件來生成對應的 Java 代碼了,插件我們在前面已經引入了,現在只需要執行了,如下圖:

圖片

注意,compile 和 compile-custom 兩個指令都需要執行。其中 compile 用來編譯消息對象,compile-custom 則依賴消息對象,生成接口服務。

首先我們點擊 compile 看看生成的代碼,如下:

圖片

再看 compile-custom 生成的代碼,如下:

圖片

好了,這樣我們的準備工作就算完成了。

有的小伙伴生成的代碼文件夾顏色不對勁,此時有兩種解決辦法:1.選中目標文件夾,右鍵單擊,選擇 Mark Directory as-> Generated Sources root;2.選中工程,右鍵單擊,選擇 Maven->Reload project。推薦使用第二種方案。

3.2 grpc-server

接下來我們創建 grpc-server 項目,并使該項目依賴 grpc-api,然后在 grpc-server 中,提供 ProductInfo 的具體實現:

public class ProductInfoImpl extends ProductInfoGrpc.ProductInfoImplBase {
@Override
public void addProduct(Product request, StreamObserver<ProductId> responseObserver) {
System.out.println("request.toString() = " + request.toString());
responseObserver.onNext(ProductId.newBuilder().setValue(request.getId()).build());
responseObserver.onCompleted();
}

@Override
public void getProduct(ProductId request, StreamObserver<Product> responseObserver) {
responseObserver.onNext(Product.newBuilder().setId(request.getValue()).setName("三國演義").build());
responseObserver.onCompleted();
}
}

ProductInfoGrpc.ProductInfoImplBase 是根據我們在 proto 文件中定義的 service 自動生成的,我們的 ProductInfoImpl 繼承自該類,并且提供了我們給出的方法的具體實現。

以 addProduct 方法為例,參數 request 就是將來客戶端調用的時候傳來的 Product 對象,返回結果則通過 responseObserver 來完成。我們的方法邏輯很簡單,我就把參數傳來的 Product 對象打印出來,然后構建一個 ProductId 對象并返回,最后調用 responseObserver.onCompleted(); 表示數據返回完畢。

剩下的 getProduct 方法邏輯就很好懂了,我這里就不再贅述了。

最后,我們再把這個 grpc-server 項目啟動起來:

public class ProductInfoServer {
Server server;

public static void main(String[] args) throws IOException, InterruptedException {
ProductInfoServer server = new ProductInfoServer();
server.start();
server.blockUntilShutdown();
}

public void start() throws IOException {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new ProductInfoImpl())
.build()
.start();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
ProductInfoServer.this.stop();
}));
}

private void stop() {
if (server != null) {
server.shutdown();
}
}

private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
}

由于我們這里是一個 JavaSE 項目,為了避免項目啟動之后就停止,我們這里調用了 server.awaitTermination(); 方法,就是讓服務啟動成功之后不要停止。

3.3 grpc-client

最后再來看看客戶端的調用。首先 grpc-client 項目也是需要依賴 grpc-api 的,然后直接進行方法調用,如下:

public class ProductClient {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
ProductInfoGrpc.ProductInfoBlockingStub stub = ProductInfoGrpc.newBlockingStub(channel);
Product p = Product.newBuilder().setId("1")
.setPrice(399.0f)
.setName("TienChin項目")
.setDescription("SpringBoot+Vue3實戰視頻")
.build();
ProductId productId = stub.addProduct(p);
System.out.println("productId.getValue() = " + productId.getValue());
Product product = stub.getProduct(ProductId.newBuilder().setValue("99999").build());
System.out.println("product.toString() = " + product.toString());
}
}

小伙伴們看到,這里首先需要和服務端建立連接,給出服務端的地址和端口號即可,usePlaintext() 方法表示不使用 TLS 對連接進行加密(默認情況下會使用 TLS 對連接進行加密),生產環境建議使用加密連接。

剩下的代碼就比較好懂了,創建 Product 對象,調用 addProduct 方法進行添加;創建 ProductId 對象,調用 getProduct。Product 對象和 ProductId 對象都是根據我們在 proto 中定義的 message 自動生成的。

4. 總結

好啦,一個簡單的例子,小伙伴們先對 gRPC 入個門,后面松哥會再整幾篇文章跟大家介紹這里邊的一些細節。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2021-06-10 07:49:26

RPCgRPC模式

2015-03-24 19:48:24

2019-11-13 15:14:31

MySQL事務數據庫

2011-03-24 09:34:41

SPRING

2009-08-19 04:14:00

線性鏈表

2018-11-22 14:09:45

iOS架構組件開發

2009-07-14 16:02:42

JDBC例子

2020-11-09 06:38:00

ninja構建方式構建系統

2010-09-16 15:57:00

PPPoA配置

2016-03-03 14:29:15

2011-09-08 13:41:53

Widget

2019-11-07 14:00:36

MySQL數據庫SQL

2017-08-17 16:37:59

MySQL數據遷移

2016-11-08 18:53:08

編譯器

2013-04-25 09:55:21

進程線程

2022-10-31 08:27:53

Database數據數據庫

2021-11-04 10:29:01

CSS前端

2011-04-12 14:58:23

加密解密類

2016-09-21 12:54:10

CAAS系統鏡像

2021-07-20 10:30:46

Golanghttp語言
點贊
收藏

51CTO技術棧公眾號

无码一区二区三区| 中文字幕一区二区人妻在线不卡| 黄网站在线播放| 国产精品1024| 91爱视频在线| 特黄一区二区三区| 成功精品影院| 欧美在线|欧美| 成人性做爰片免费视频| 五月天婷婷社区| 蜜桃免费网站一区二区三区| 欧美成人免费大片| 性高潮久久久久久久| 粉嫩一区二区三区在线观看| 午夜精品久久久| 夜夜爽www精品| 亚洲欧洲综合在线| 国产一区二区视频在线| 欧美做爰性生交视频| 国产suv精品一区二区68| 全国精品免费看| 777久久久精品| 日韩av黄色网址| 八戒八戒神马在线电影| 久久精品视频一区二区三区| 亚洲综合第一页| 国产suv精品一区二区33| 欧美~级网站不卡| 在线视频欧美日韩精品| 97人妻精品一区二区三区免费| 日本在线中文字幕一区二区三区| 亚洲成人福利片| 国产又黄又爽免费视频| 欧美91精品久久久久国产性生爱| 国产毛片精品国产一区二区三区| 国产成人福利网站| 欧美福利视频一区二区| 一区二区不卡| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 精品众筹模特私拍视频| 中文字幕av资源一区| 精品亚洲一区二区三区四区五区高| a级片免费视频| 美女爽到高潮91| 国产精品久久精品| 免费看日批视频| 中文亚洲字幕| 国产做受69高潮| 精品无码久久久久久久久| 欧美一区亚洲| yellow中文字幕久久| 成年人免费视频播放| 精品久久久久久久| 亚洲欧美中文字幕| 国产免费看av| 精品一区三区| 亚洲全黄一级网站| 日韩人妻无码精品综合区| 亚洲精品合集| 亚洲午夜女主播在线直播| 久久精品国产亚洲av麻豆| 美女一区二区在线观看| 亚洲精品乱码久久久久久按摩观| 国内精品免费视频| 欧美wwwwww| 亚洲毛片一区二区| 黄色三级生活片| 久久影视一区| yw.139尤物在线精品视频| 国产精品成人69xxx免费视频| 91视频一区| 欧美成人剧情片在线观看| 欧美日韩精品亚洲精品| 一区二区视频欧美| 69影院欧美专区视频| 欧美一区二区三区四| 亚洲一区二区三区高清不卡| 欧美性做爰毛片| 精人妻无码一区二区三区| 日本最新不卡在线| 成人免费视频网| 性一交一乱一乱一视频| 91在线精品一区二区| 美乳视频一区二区| av网站在线免费播放| 自拍偷拍欧美激情| 久久成人福利视频| 91精品韩国| 91精品国产综合久久香蕉麻豆| 欧美日韩一区二区区| 人体久久天天| 中文字幕亚洲欧美日韩在线不卡| 国产高清在线免费观看| 亚洲激情专区| 国产精品免费一区豆花| 国产av无码专区亚洲av麻豆| 成人国产精品免费观看动漫| 精品国产一区二区三区久久久久久| 视频午夜在线| 亚洲人亚洲人成电影网站色| 免费特级黄色片| 影音成人av| 精品国产亚洲一区二区三区在线观看| 中文字幕在线免费看线人| 久久国产成人精品| 91黑丝高跟在线| 11024精品一区二区三区日韩| 高清成人在线观看| 亚洲国产欧美日韩| 91超碰在线免费| 欧美丰满美乳xxx高潮www| 水蜜桃av无码| 欧美在线二区| 国产精品18久久久久久首页狼| 国产裸体永久免费无遮挡| 久久你懂得1024| av久久久久久| 精品美女一区| 亚洲欧洲午夜一线一品| 久久精品www| 美女网站色91| 日本欧洲国产一区二区| av中文在线资源库| 日韩免费视频一区| 香蕉久久久久久久| 日日摸夜夜添夜夜添亚洲女人| 91手机在线播放| 午夜激情视频在线观看| 欧美日韩亚洲系列| youjizz.com日本| 婷婷亚洲综合| 国产精品视频免费在线| 日本v片在线免费观看| 亚洲国产你懂的| 杨幂一区二区国产精品| 日韩国产一区| 国产精品视频久久| porn视频在线观看| 色综合久久中文字幕| 在线观看国产三级| 亚洲国产精品第一区二区三区| 成人黄色免费看| 999国产在线视频| 在线精品视频一区二区三四| 国产黄色三级网站| 亚洲精品资源| 久久久神马电影| 老色鬼在线视频| 亚洲激情第一页| 日韩无码精品一区二区三区| 成人网男人的天堂| 欧洲精品在线播放| 成人爽a毛片免费啪啪红桃视频| 欧美老肥婆性猛交视频| 精品国自产在线观看| 亚洲另类春色国产| 苍井空张开腿实干12次| 国产精品99一区二区| 国产精品一区二区三区观看| 蜜臀av国内免费精品久久久夜夜| 日韩欧美的一区| 久久久久久久中文字幕| 成人激情小说乱人伦| 黄页免费在线观看视频| 秋霞蜜臀av久久电影网免费| 欧美专区在线视频| 成人全视频高清免费观看| 欧美性一级生活| 国产极品视频在线观看| 久久99精品国产麻豆不卡| 制服丝袜综合日韩欧美| 人人九九精品视频| 国模精品系列视频| 男操女在线观看| 欧美日韩综合一区| 精品无码久久久久成人漫画| 成人一级黄色片| 日韩av片在线看| 日韩精品久久久久久久电影99爱| 国产欧美亚洲视频| 调教一区二区| 精品偷拍各种wc美女嘘嘘| 久久精品99北条麻妃| 中文字幕一区三区| 精品国产乱码久久久久夜深人妻| 亚洲美女91| 日韩欧美亚洲在线| 蜜桃在线一区| 日本高清不卡的在线| 午夜视频在线| 日韩电影免费观看在线观看| 波多野结衣视频网址| 亚洲日本护士毛茸茸| 丰满大乳奶做爰ⅹxx视频 | 18一19gay欧美视频网站| 激情小视频在线观看| 777色狠狠一区二区三区| 日韩 欧美 精品| 中文字幕免费不卡在线| 2025中文字幕| 蜜臀av一区二区| 日韩精品在线中文字幕| 日韩精品dvd| 国产视频不卡| 欧洲精品久久久久毛片完整版| 欧美精品18videosex性欧美| 成人亚洲综合天堂| 精品国产乱码久久久久久久| 亚洲精品国产精品乱码视色| 亚洲综合无码一区二区| 在线观看亚洲大片短视频| 成人一级黄色片| 污污视频网站在线| 天堂成人国产精品一区| 国产不卡一区二区视频| 天天综合网网欲色| 日本成人黄色| 国产精品毛片视频| 亚洲精品欧美一区二区三区| 奇米777日韩| 久久久久久久久久久免费精品| av色图一区| 国产视频精品va久久久久久| 99久久免费国产精精品| 欧美伊人久久大香线蕉综合69| 国产亚洲精久久久久久无码77777| 国产精品区一区二区三| 尤物视频最新网址| 成人av资源站| www日本在线观看| 国产在线精品视频| xx欧美撒尿嘘撒尿xx| 性欧美长视频| 亚洲美免无码中文字幕在线| 欧美理论在线| 樱空桃在线播放| 婷婷综合在线| 亚洲一区精彩视频| 成人黄色小视频| 日本一区免费在线观看| 亚洲综合图色| 欧美激情视频一区二区三区| 国产一区福利| 国产精品久久久久久久久久久久午夜片 | 18欧美亚洲精品| 蜜桃av免费在线观看| 欧美国产一区视频在线观看| 亚洲第一成人网站| 26uuu久久综合| 最新中文字幕视频| 久久先锋影音av| a天堂中文字幕| 国产欧美va欧美不卡在线| 精品国产成人亚洲午夜福利| 久久久美女毛片| 国产免费无遮挡吸奶头视频| 久久久影视传媒| 欧美图片第一页| 日本一二三不卡| 99热6这里只有精品| 国产精品免费av| 免费成年人视频在线观看| 成人免费在线视频观看| 久久久久久久久久久久久女过产乱| 国产精品二三区| 欧美性猛交xxxxx少妇| 亚洲图片有声小说| 一本一道无码中文字幕精品热| 日韩欧美在线播放| av首页在线观看| 欧美精三区欧美精三区| 精品人妻伦一区二区三区久久 | 91福利视频在线观看| 在线男人天堂| 国产精品久久久久久久久久久久| 国产成人精选| 999日本视频| 欧美电影在线观看完整版| 免费看国产精品一二区视频| 精品日韩毛片| 免费看日本黄色| 国产精品人人爽人人做我的可爱| caoporn超碰97| 精品一区二区日韩| 中文字幕三级电影| 国产欧美精品一区| 欧美黄色免费看| 色伊人久久综合中文字幕| 在线观看亚洲一区二区| 精品国产污网站| 成年网站在线| 高清欧美性猛交| 国产香蕉久久| 国产亚洲情侣一区二区无| 精品久久一区| 日本a视频在线观看| 日本午夜一区二区| 4438x全国最大成人| 久久你懂得1024| 免费无遮挡无码永久在线观看视频| 粉嫩老牛aⅴ一区二区三区| 91在线你懂的| 日韩黄色在线免费观看| 黄网站视频在线观看| 欧美在线视频一区| 18国产精品| 亚洲人成77777| 一本色道久久综合亚洲精品不卡| 高清av免费看| 久久综合九色综合97婷婷| 永久久久久久久| 欧美视频一区在线| 香蕉视频黄在线观看| 久久伊人精品一区二区三区| 欧美特大特白屁股xxxx| 国产精品夜夜夜一区二区三区尤| 日韩欧美一区免费| av动漫在线观看| 成人久久视频在线观看| 手机在线免费看片| 欧美在线视频日韩| 日韩毛片在线一区二区毛片| 欧美xxxx综合视频| 日本欧美在线| 水蜜桃一区二区三区| 国产九九精品| 国产人妻黑人一区二区三区| 亚洲丝袜美腿综合| ,一级淫片a看免费| 伊人久久精品视频| 精品网站在线| 欧美日韩天天操| 亚洲在线成人| 五十路六十路七十路熟婆| 亚洲午夜羞羞片| 国精产品一品二品国精品69xx| 精品国产欧美一区二区三区成人| 成人国产精品一区二区免费麻豆| 久久久久国产精品视频| 一区精品久久| 中文字幕人妻熟女在线| 一区二区三区四区五区视频在线观看| 国产精品毛片一区视频播| 中文字幕在线看视频国产欧美| 日韩中文影院| 三区精品视频观看| 日日夜夜精品视频免费| 日本黄色小视频在线观看| 在线观看91视频| eeuss影院在线观看| 国产精品久久久久一区二区| 精品欧美激情在线观看| www.精品在线| 亚洲日穴在线视频| 国产成人精品亚洲精品色欲| 成人444kkkk在线观看| 网站一区二区| 91精品国产91久久久久麻豆 主演| 成人av高清在线| 狠狠躁夜夜躁人人爽天天高潮| 亚洲第一网站免费视频| 成人免费观看在线观看| 久久99精品久久久久子伦| 夜久久久久久| 中文字幕免费高清| 欧美三级电影网| 大片免费在线看视频| 99国产超薄肉色丝袜交足的后果 | www.亚洲男人天堂| 亚洲精品三区| 久久久久久久香蕉| 99精品在线免费| 波多野结衣视频网址| 深夜福利亚洲导航| 91精品国产自产精品男人的天堂| 丰满的少妇愉情hd高清果冻传媒| www.亚洲在线| 无码日韩精品一区二区| 久久精品亚洲国产| 久久久久观看| 九九热在线免费| 一区二区免费看| 黄色国产在线| 亚洲xxxxx电影| 国产日韩1区| 女教师淫辱の教室蜜臀av软件| 日韩精品一区在线| 亚洲1234区| 毛片av在线播放| 国产色综合久久| 亚洲精品国产片| 国产精品久久久久久久午夜| 一本到12不卡视频在线dvd| 国产精品久久不卡| 欧美精品久久久久久久久老牛影院| 亚洲区欧洲区| 翔田千里亚洲一二三区| 国产成人精品亚洲日本在线桃色| 日批视频免费在线观看| 欧美精品在线看|