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

使用 gRPC 和 .NET7 構(gòu)建高性能服務(wù)

開發(fā) 架構(gòu)
本文的目的是提供有關(guān)已添加到 gRPC .NET 7 框架的性能增強(qiáng)的信息,包括 gRPC JSON 轉(zhuǎn)碼功能、OpenAPI 規(guī)范和服務(wù)器反射功能,以及新的性能改進(jìn)。

.NET 7 正式推出標(biāo)準(zhǔn)期限支持,支持期限為 18 個(gè)月。 其中包括許多令人興奮的新功能,包括 Web API、gRPC、ASP.NET 和 C#11 的性能升級(jí)。

本文涵蓋以下主題:

  1. .NET 7 中的性能改進(jìn)。
  2. gRPC JSON 轉(zhuǎn)碼。
  3. 在 .NET 7 中創(chuàng)建 gRPC 服務(wù)。
  4. 在 Postman 使用 gRPC 服務(wù)。
  5. 使用服務(wù)器反射和 Postman
  6. 添加 Swagger 規(guī)范。

除了討論 .NET 7 中 gRPC 的新特性,我們還將實(shí)現(xiàn)一個(gè)能夠在一分鐘內(nèi)流式傳輸 500 萬條記錄的真實(shí)微服務(wù)。

這是一個(gè)快速回顧:

  • gRPC 是由 CNCF 開發(fā)的流行的開源 RPC 框架。
  • 作為契約優(yōu)先、獨(dú)立于語言的框架,客戶端和服務(wù)器必須就消息的內(nèi)容和傳遞方式達(dá)成一致,契約在 .proto 文件中定義,然后使用 .NET7 的工具生成代碼。
  • 在單個(gè) tcp 連接上,HTTP/2 支持多路復(fù)用,您可以同時(shí)發(fā)送多個(gè)請(qǐng)求。
  • 此外,gRPC 支持?jǐn)?shù)據(jù)流,其中服務(wù)器可以同時(shí)向客戶端發(fā)送多個(gè)響應(yīng),反之亦然。

.NET 7 中有哪些新功能?

1、性能改進(jìn)

為了讓 gRPC 支持多路復(fù)用,HTTP/2 是必需的。 但是,Kestrel 的 HTTP/2 實(shí)現(xiàn)存在一個(gè)已知問題,該問題會(huì)在連接繁忙時(shí)通過 HTTP/2 寫入響應(yīng)時(shí)出現(xiàn)瓶頸。 當(dāng)您在同一個(gè) TCP 連接上同時(shí)運(yùn)行多個(gè)請(qǐng)求,但一次只有一個(gè)線程能夠?qū)懭朐撨B接時(shí),就會(huì)發(fā)生這種情況。 這是通過 .NET 6 中的線程鎖完成的,這會(huì)導(dǎo)致鎖爭(zhēng)用。

NET 7 使用一種巧妙的方法來解決此瓶頸,即實(shí)現(xiàn)一個(gè)隊(duì)列,該隊(duì)列會(huì)在寫入完成時(shí)通知所有其他線程,讓它們等待寫入完成。 因此,性能大大提升,CPU資源得到更好的利用——不再需要爭(zhēng)鎖。

.NET gRPC 團(tuán)隊(duì)的基準(zhǔn)測(cè)試表明服務(wù)器流式處理提高了 800%。

  • .NET 6–0.5M RPS
  • .NET 7–4.5M RPS

HTTP/2 上傳速度

通過增加緩沖區(qū)大小可將延遲減少 600%。 與 .NET 6 相比,.NET 7 將上傳 100MB 文件的時(shí)間從 26.9 秒減少到 4.3 秒。

.NET 7 gRPC 的性能現(xiàn)在超過了 Rust、Go 和 C++ 等流行框架。

2、gRPC JSON轉(zhuǎn)碼

.NET7 為 ASP.NET Core gRPC 提供了擴(kuò)展,以使 gRPC 服務(wù)能夠作為 RESTful Web 服務(wù)公開。 您現(xiàn)在可以通過 HTTP 調(diào)用 gRPC 方法而無需任何重復(fù)。

gRPC JSON 轉(zhuǎn)碼支持:

  • HTTP 動(dòng)詞
  • URL參數(shù)綁定
  • JSON請(qǐng)求/響應(yīng)

在此擴(kuò)展中,HTTP 動(dòng)詞通過使用 protobuf 注釋的概念映射到 gRPC 服務(wù),擴(kuò)展在 ASP.NET Core 應(yīng)用程序中運(yùn)行,然后將 JSON 反序列化為 protobuf 消息并直接調(diào)用 gRPC 服務(wù),而不必編寫自己的 gRPC 客戶端應(yīng)用程序。

我們將在下一節(jié)中研究如何實(shí)現(xiàn)它。

3、開放API規(guī)范

現(xiàn)在有一個(gè) Open API 規(guī)范,用于 .NET 7 中的 gRPC JSON 轉(zhuǎn)碼,使用以下 Nuget 包:

?https://www.nuget.org/packages/Microsoft.AspNetCore.Grpc.Swagger?

4、 Azure 應(yīng)用服務(wù)支持

最后但同樣重要的是,Azure 應(yīng)用服務(wù)現(xiàn)在完全支持 gRPC。 這是在 .NET 中使用 gRPC 構(gòu)建和部署高性能服務(wù)的一大進(jìn)步。

現(xiàn)在我們已經(jīng)完成了討論,讓我們實(shí)現(xiàn) gRPC 并看看新功能是什么樣的。

先決條件:

  • 下載并安裝 .NET 7 SDK
  • Visual Studio 2022 17.4+

我們需要做的第一件事是啟動(dòng) Visual Studio 并創(chuàng)建一個(gè)新項(xiàng)目。 選擇“ASP.NET Core gRPC 服務(wù)”,這將創(chuàng)建一個(gè)示例 hello world gRPC 服務(wù)。

確保選擇了 .NET7。

這將分別在 protos 和服務(wù)文件夾中的 GreeterService 中創(chuàng)建一個(gè)隨時(shí)可用的 gRPC 應(yīng)用程序。

這是一個(gè)用作契約的 greeting.proto 文件,定義了客戶端將接收的消息和服務(wù)。

syntax = "proto3";

option csharp_namespace = "gRPCUsingNET7Demo";

package greet;

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings.
message HelloReply {
string message = 1;
}

契約可以被認(rèn)為是接口,這些接口的實(shí)現(xiàn)將由服務(wù)定義,在我們的例子中是 GreeterService.cs——這個(gè)文件將描述契約的實(shí)現(xiàn)。

GreeterService 類是一個(gè)標(biāo)準(zhǔn)的 C# 類,它向響應(yīng)返回 hello。 protobuf 的實(shí)際實(shí)現(xiàn)是通過代碼生成實(shí)現(xiàn)的,并使用 GreeterBase 抽象出來。 如果您想確切地知道引擎下發(fā)生了什么,您可以轉(zhuǎn)到 GreeterBase,您會(huì)在那里找到所有底層細(xì)節(jié)。

public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger){
_logger = logger;
}

public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}

代碼生成是 .NET 7 的一項(xiàng)不錯(cuò)的功能,它允許您生成服務(wù)器端和客戶端 gRPC 代碼。 通過設(shè)置代碼生成設(shè)置,可以更改 .CS 項(xiàng)目文件中代碼生成過程的行為(例如從服務(wù)器到客戶端)。

  <ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

讓我們啟動(dòng) Kestral 并在打開應(yīng)用程序后在瀏覽器中瀏覽 gRPC 端點(diǎn)。

我們無法通過網(wǎng)絡(luò)訪問我們的 gRPC 服務(wù),因?yàn)樗枰褂?gRPC 客戶端。 但是,我們不需要使用 gRPC 客戶端,而是使用流行的測(cè)試工具 Postman 對(duì)其進(jìn)行測(cè)試。 它最近在其功能中添加了對(duì) gRPC 請(qǐng)求的支持。

第一步是打開 Postman 并創(chuàng)建一個(gè)新的 gRPC 請(qǐng)求。

請(qǐng)?jiān)谙旅娴目蛑休斎敕?wù)器地址(您的應(yīng)用程序運(yùn)行的地址)。 例如,https://localhost:7211。

Postman目前不了解我們的服務(wù)如何運(yùn)作,因此我們有幾個(gè)選擇。 一種是導(dǎo)入 .proto 文件或使用稱為“服務(wù)器反射”的東西。 它可以被認(rèn)為是 gRPC 調(diào)用的 OpenAPI 規(guī)范。

在 gRPC 服務(wù)中啟用服務(wù)器反射。

按照以下步驟啟用服務(wù)器反射非常簡(jiǎn)單。

下載并安裝以下 nuget 包:

Install-Package Grpc.AspNetCore.Server.Reflection -Version 2.49.0

2、在Program.cs文件中,需要注冊(cè)如下服務(wù),并將該服務(wù)映射到我們的http管道中,如下:

builder.Services.AddGrpcReflection();

app.MapGrpcReflectionService();

現(xiàn)在我們已經(jīng)完成了所有這些前置需求,讓我們回到 Postman,再次運(yùn)行應(yīng)用程序。

我們可以看到我們的 greet.greeter 服務(wù)和它的 SayHello 方法。

可以通過單擊帶有 JSON 正文(將由 Postman 轉(zhuǎn)換為 protobuf)的 Invoke 按鈕來調(diào)用此端點(diǎn)。

在 49 毫秒內(nèi)得到了服務(wù)器響應(yīng)。

將您的 gRPC 服務(wù)轉(zhuǎn)變?yōu)?REST

本節(jié)將實(shí)現(xiàn) gRPC JSON 轉(zhuǎn)碼以通過 HTTP 訪問 gRPC。

  1. 將以下 nuget 包添加到您的項(xiàng)目中:
Install-Package Microsoft.AspNetCore.Grpc.JsonTranscoding -Version 7.0.0

2. 導(dǎo)航到 Program.cs 并添加 JSONTranscoding 服務(wù):

builder.Services.AddGrpc().AddJsonTranscoding();

下一步,我們將向您的項(xiàng)目添加兩個(gè)配置文件。

添加這些文件后,我們需要修改 greet.proto 并添加 import “google/api/annotations.proto” 以便我們可以注解服務(wù)方法。

  // Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply)
{
option (google.api.http) =
{
get: "/v1/greeter/{name}"
}

};

基本上,我們向我們的 RPC 方法添加了一個(gè)路由,以便它可以作為 REST 方法被調(diào)用。 讓我們?cè)俅芜\(yùn)行應(yīng)用程序并使用瀏覽器執(zhí)行端點(diǎn)。

就是這樣! 該 API 現(xiàn)在作為基于 REST 的 API 工作,但它仍然可以作為 gRPC 接口使用。 來自 Postman 的 gRPC 響應(yīng)如下所示。

添加開放 API 規(guī)范

本節(jié)的目的是解釋我們?nèi)绾问褂?gRPC.Swagger 向我們的應(yīng)用程序添加開放 API 規(guī)范。

  1. 安裝以下 nuget 包:
Install-Package Microsoft.AspNetCore.Grpc.Swagger -Version 0.3.0

2.注冊(cè)Swagger服務(wù)和中間件,如下

   builder.Services.AddGrpcSwagger();
builder.Services.AddSwaggerGen( c=>
{
c.SwaggerDoc("v1",
new Microsoft.OpenApi.Models.OpenApiInfo { Title = "gRPC using .NET 7 Demo", Version = "v1" } );
});

最后,您的 program.cs 應(yīng)該如下所示:

using gRPCUsingNET7Demo.Services;

namespace gRPCUsingNET7Demo
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);

// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

// Add services to the container.
builder.Services.AddGrpc().AddJsonTranscoding();
builder.Services.AddGrpcReflection();
builder.Services.AddGrpcSwagger();

builder.Services.AddSwaggerGen( c=>
{
c.SwaggerDoc("v1",
new Microsoft.OpenApi.Models.OpenApiInfo { Title = "gRPC using .NET 7 Demo", Version = "v1" }

});
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI(c
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "gRPC using .NET7 Demo");
}
);
// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapGrpcReflectionService();
app.MapGet("/", () "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
app.Run();
}
}
}

啟動(dòng)應(yīng)用程序后調(diào)用 Swagger 端點(diǎn):
https://localhost:7211/swagger/index.html。

您可以像調(diào)用任何 Restful API 一樣嘗試調(diào)用端點(diǎn)。

在本節(jié)之后,我們將演示如何使用 gRPC 服務(wù)器流將 5M 記錄(大約 600MB 數(shù)據(jù))使用流式傳輸?shù)娇蛻舳恕?/span>

gRPC 服務(wù)器流

在服務(wù)器流中,gRPC 客戶端發(fā)送請(qǐng)求并獲取響應(yīng)流。 客戶端讀取這些響應(yīng),直到所有消息都已傳遞。 gRPC 確保消息排序。

使用此示例 CSV 文件作為示例。

該 CSV 文件包含大約 500 萬條銷售記錄,因此不可能在一個(gè)調(diào)用中將它們?nèi)堪l(fā)送出去。

此外,傳統(tǒng)的基于 REST 的分頁(yè)涉及多個(gè)客戶端請(qǐng)求,并且需要在客戶端和服務(wù)器之間來回通信。

gRPC Server streaming 是解決這個(gè)問題的絕佳方案。

  • 客戶端將簡(jiǎn)單地調(diào)用服務(wù)方法。
  • CSV 文件將逐行讀取,轉(zhuǎn)換為原型模型,然后使用 StreamReader 發(fā)送回客戶端。
  • 響應(yīng)流將被發(fā)送到客戶端。

我們將從定義一個(gè)原型文件開始:

Protos-> sales.proto

syntax = "proto3";
import "google/protobuf/timestamp.proto";
csharp_namespace = "gRPCUsingNET7Demo";

package sales;

service SalesService {
rpc GetSalesData(Request) returns (stream SalesDataModel) {}
}

message Request{
string filters=1;

}

message SalesDataModel {
int32 OrderID = 1;
string Region = 2;
string Country = 3;
string ItemType=4;
google.protobuf.Timestamp OrderDate=5;
google.protobuf.Timestamp ShipDate=6;
int32 UnitsSold=7;
float UnitCost=8;
float UnitPrice=9;
int32 TotalRevenue=10;
int32 TotalCost=11;
int32 TotalProfit=12;
}

使用 stream 關(guān)鍵字,我們可以指定 SalesDataModel 將作為流傳遞。

我們的下一步是通過以下方式添加一個(gè)新服務(wù)——SalesDataService.cs:

using Grpc.Core;
using gRPCUsingNET7Demo;

namespace gRPCUsingNET7Demo.Services
{
public class SalesDataService : SalesService.SalesServiceBase

{
public override async Task
GetSalesData(Request request,
IServerStreamWriter<SalesDataModel> responseStream, ServerCallContext context){

using (var reader = new StreamReader(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Data", "sales_records.csv")))
{
string line; bool isFirstLine = true;
while ((line = reader.ReadLine()) != null)
{
var pieces = line.Split(',');

var _model = new SalesDataModel();

try
{
if (isFirstLine)
{
isFirstLine = false;
continue;
}

_model.Region = pieces[0];
_model.Country = pieces[1];

_model.OrderID = int.TryParse(pieces[6], out int _orderID) ? _orderID : 0;
_model.UnitPrice = float.TryParse(pieces[9], out float _unitPrice) ? _unitPrice : 0;

_model.ShipDate = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime
((DateTime.TryParse(pieces[7], out DateTime _dateShip) ? _dateShip : DateTime.MinValue).ToUniversalTime());

_model.UnitsSold = int.TryParse(pieces[8], out int _unitsSold) ? _unitsSold : 0;

_model.UnitCost = float.TryParse(pieces[10], out float _unitCost) ? _unitCost : 0;

_model.TotalRevenue = int.TryParse(pieces[11], out int _totalRevenue) ? _totalRevenue : 0;
_model.TotalCost = int.TryParse(pieces[13], out int _totalCost) ? _totalCost : 0;

await responseStream.WriteAsync(_model);

}

catch (Exception ex)
{
throw new RpcException(new Status(StatusCode.Internal, ex.ToString()));
}

}
}

}

}
}

此服務(wù)實(shí)現(xiàn) SalesServiceBase 類,該類由 .NET7 工具使用 proto 文件自動(dòng)生成。

它只是重寫 GetSalesData 以逐行從文件中讀取數(shù)據(jù)并將其作為流返回。

await responseStream.WriteAsync(_model);

讓我們構(gòu)建項(xiàng)目并運(yùn)行應(yīng)用程序。

應(yīng)用程序按預(yù)期運(yùn)行。 要從服務(wù)器獲取訂單流,我們需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的 RPC 客戶端,這將在下一節(jié)中介紹。

使用 .NET7 創(chuàng)建 gRPC 客戶端

讓我們?cè)谀慕鉀Q方案中創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序,并向其中添加以下包

<PackageReference Include="Google.Protobuf" Version="3.21.9" />
<PackageReference Include="Grpc.Net.ClientFactory" Version="2.49.0" />
<PackageReference Include="Grpc.Tools" Version="2.40.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
  1. 確保添加了 Protos 文件夾并將 sales.proto 文件復(fù)制到那里。
  2. 為了為客戶端生成 gRPC 類,您需要修改 .csproj 文件。
<ItemGroup>
<Protobuf Include="Protos\sales.proto" GrpcServices="Client" />
</ItemGroup>

3. 保存并構(gòu)建項(xiàng)目(以便生成客戶端代碼)

4. 第一步是打開 Program.cs 并為您的 gRPC 服務(wù)創(chuàng)建一個(gè)通道。

var channel = GrpcChannel.ForAddress("https://localhost:7211");

5. 創(chuàng)建一個(gè)新的SalesService對(duì)象(使用gRPC工具創(chuàng)建)如下:

var client = new SalesService.SalesServiceClient(channel);

6.服務(wù)方法應(yīng)按如下方式調(diào)用:

using var call = client.GetSalesData(new Request { Filters = "" });

7. 我們的代碼只是調(diào)用服務(wù)器上的 ReadAllAsync 來檢索流,然后在收到流后立即在控制臺(tái)上打印輸出。

await foreach (var each in call.ResponseStream.ReadAllAsync())
{
Console.WriteLine(String.Format("New Order Receieved from {0}-{1},Order ID = {2}, Unit Price ={3}, Ship Date={4}", each.Country, each.Region, each.OrderID, each.UnitPrice,each.ShipDate));
Count++;
}

這就是完整實(shí)現(xiàn):

using Grpc.Core;
using Grpc.Net.Client;
using gRPCUsingNET7Demo;

namespace gRPCClient
{
internal class Program
{
static async Task Main(string[] args)
{
var channel = GrpcChannel.ForAddress("https://localhost:7211");
int Count = 0;
var watch = System.Diagnostics.Stopwatch.StartNew();
try
{
var client = new SalesService.SalesServiceClient(channel);

using var call = client.GetSalesData(new Request { Filters = "" }
, deadline: DateTime.UtcNow.AddMinutes(10)
);

await foreach (var each in call.ResponseStream.ReadAllAsync())
{

Console.WriteLine(String.Format("New Order Receieved from {0}-{1},Order ID = {2}, Unit Price ={3}, Ship Date={4}", each.Country, each.Region, each.OrderID, each.UnitPrice, each.ShipDate));
Count++;

}
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.DeadlineExceeded)
{
Console.WriteLine("Service timeout.");
}

watch.Stop();

Console.WriteLine($"Stream ended: Total Records:{Count.ToString()} in {watch.Elapsed.TotalMinutes} minutes and {watch.Elapsed.TotalSeconds});
Console.Read();

}
}
}

正如您在上面的示例中看到的,服務(wù)方法調(diào)用是在deadline的幫助下完成的。 您可以使用deadline指定通話的持續(xù)時(shí)間,這樣您就可以指定通話應(yīng)該持續(xù)多長(zhǎng)時(shí)間。

using var call = client.GetSalesData(new Request { Filters = "" }
, deadline: DateTime.UtcNow.AddMinutes(10)
);

客戶端現(xiàn)在允許您查看來自 gRPC 服務(wù)的傳入消息。

結(jié)論:

本文的目的是提供有關(guān)已添加到 gRPC .NET 7 框架的性能增強(qiáng)的信息,包括 gRPC JSON 轉(zhuǎn)碼功能、OpenAPI 規(guī)范和服務(wù)器反射功能,以及新的性能改進(jìn)。 本文還解釋了如何使用 gRPC 服務(wù)器流式處理來創(chuàng)建能夠立即處理和交付數(shù)百萬條記錄的高性能服務(wù)。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2025-02-04 13:53:18

NixGogRPC

2011-02-13 09:17:02

ASP.NET

2011-02-23 09:49:40

ASP.NET

2018-12-03 08:00:00

微服務(wù)gRPC

2011-02-16 09:08:27

ASP.NET

2011-02-15 09:31:56

ASP.NET

2025-03-04 08:00:00

機(jī)器學(xué)習(xí)Rust開發(fā)

2022-12-08 08:00:00

.NET?7BitArray數(shù)據(jù)執(zhí)行

2022-06-07 08:19:30

gRPCBallerina微服務(wù)

2011-02-13 09:37:55

ASP.NET

2016-05-20 14:20:31

ASP.NET建議

2011-02-22 09:16:24

高性能ASP.NET

2017-05-25 10:50:16

Python高性能服務(wù)

2023-12-26 00:58:53

Web應(yīng)用Go語言

2025-10-31 10:04:05

2025-10-09 03:00:00

2011-02-14 09:32:16

ASP.NET

2011-02-17 09:13:57

ASP.NET

2023-12-01 07:06:14

Go命令行性能

2023-12-14 08:01:08

事件管理器Go
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

在线观看精品视频| 韩国一区二区电影| 婷婷激情四射五月天| 在线a人片免费观看视频| 精品一区中文字幕| 久久99国产综合精品女同| 88av在线播放| 欧美精品高清| 亚洲欧洲另类国产综合| 成人av资源网| 精品国产午夜福利| 亚洲激情五月| 亚洲高清免费观看高清完整版| 国内外成人免费激情视频| www.av在线| 高清日韩电视剧大全免费| 欧美有码在线观看| 自拍偷拍第9页| 牛牛精品成人免费视频| 欧美日韩1234| 欧美在线观看www| 老司机福利在线视频| 91亚洲国产成人精品一区二区三| 国产精品香蕉国产| 国产五月天婷婷| 日韩在线观看电影完整版高清免费悬疑悬疑| 91精品国产欧美一区二区18| 欧美女人性生活视频| 免费黄网站在线播放| 99r国产精品| 亚洲a一级视频| 成人毛片一区二区三区| 欧美日韩一视频区二区| 中文字幕在线国产精品| 99久久人妻无码中文字幕系列| 亚洲国产一区二区久久| 黑人极品videos精品欧美裸| 免费的av在线| 伊人免费在线| 国产香蕉久久精品综合网| 国产精品一区二区三区在线 | 日本女优一区| 亚洲高清在线观看| gogo亚洲国模私拍人体| 国产精品成人国产| 色国产综合视频| 黄色一级在线视频| 丰满诱人av在线播放| 国产精品久久久久影院| 色一情一区二区三区四区| 手机av在线免费观看| 国产精品一区二区在线播放| 国产日韩中文字幕| 波多野结衣在线观看一区| 中文高清一区| 97国产成人精品视频| 精品视频一区二区在线观看| 亚洲欧美伊人| 久久国产精品久久久久| 我要看一级黄色录像| 欧美丝袜激情| 一区二区三区四区在线观看视频| 最新中文字幕视频| 亚洲国产网址| 亚洲欧洲免费视频| 中文字幕高清视频| 国产欧美日韩视频在线| 在线成人激情视频| 麻豆一区在线观看| 小小影院久久| 欧美xxxx18国产| 日本妇女毛茸茸| 国产精品hd| 久久久免费高清电视剧观看| 日本三级视频在线| 中日韩视频在线观看| 国产97人人超碰caoprom| 日本精品入口免费视频| 男男视频亚洲欧美| 国产精品日韩欧美| 97精品人妻一区二区三区| 精品制服美女久久| 999在线观看免费大全电视剧| 性做久久久久久久| 99精品一区二区| 欧美精品123| 波多野结衣一区二区| 国产精品久久久久久久久免费樱桃 | 在线成人直播| 久久久久久久久久av| 国产成人无码精品亚洲| 日韩高清不卡在线| 成人国产精品日本在线| 亚洲精品久久久久久无码色欲四季 | 日韩伦理一区二区| 欧美一级欧美三级| www.日本高清| 日韩精品中文字幕第1页| 久久这里只有精品视频首页| 国产精品7777| 日韩一区欧美二区| 91福利入口| 欧美扣逼视频| 亚洲视频一区二区在线| 乱妇乱女熟妇熟女网站| 欧美高清影院| 日韩av一区二区在线| 亚洲色图欧美色| 在线日韩av| 国产欧美日韩中文字幕| 好男人在线视频www| 国产欧美日韩另类一区| 无码日本精品xxxxxxxxx| 另类专区亚洲| 欧美tk丨vk视频| xxxxx99| 国产美女精品| 99影视tv| 亚洲精品承认| 日韩欧美第一页| 宇都宫紫苑在线播放| 国产精品羞羞答答在线观看| 欧美日韩高清区| 中文字幕精品一区二区精| 成人免费黄色大片| 亚洲资源视频| 日韩大尺度黄色| 精品免费国产一区二区三区四区| 国产调教在线观看| 国产一区二区三区的电影| 亚洲自拍偷拍区| 18视频免费网址在线观看| 国产精品天天摸av网| 国产在线不卡精品| 午夜小视频在线播放| 中文字幕中文字幕一区| 久久夜色精品国产欧美乱| 国产精品一区二区6| 国产一区二区三区不卡在线观看| 日本一区免费看| 成人在线免费观看黄色| 国产精品久久久久999| 久久久久99精品成人| 一区二区三区成人精品| 国产91精品一区二区绿帽| 日韩欧美小视频| 色天使色偷偷av一区二区| 私密视频在线观看| 亚洲一级影院| av一区二区三区免费| 看黄网站在线| 欧美福利一区二区| 欧美88888| 久久成人麻豆午夜电影| 亚洲欧洲一区二区| 国产精品第一国产精品| 伊人激情综合网| 亚洲午夜在线播放| 国产精品天干天干在线综合| 男女男精品视频站| 色999国产精品| 国产精品亚洲激情| 日韩精品黄色| 在线综合视频播放| 青青操视频在线播放| 国产麻豆视频一区二区| 青青在线视频免费观看| 视频二区欧美| 久久久久久国产| 神宫寺奈绪一区二区三区| 亚洲成人资源在线| 性欧美成人播放77777| 午夜亚洲性色视频| 日本视频一区在线观看| 成人黄色在线| 久久精品一本久久99精品| 国产不卡精品视频| 亚洲成av人片在线观看无码| 国产三级视频网站| 男女男精品视频| 99视频精品全部免费看| 东京久久高清| 日本欧美国产在线| 永久免费av在线| 日韩精品一区二区三区老鸭窝| 日产亚洲一区二区三区| 国产亚洲美州欧州综合国| 亚洲娇小娇小娇小| 国产精品videosex极品| 久久伊人资源站| 久久精品黄色| 欧美精品日韩三级| 午夜福利一区二区三区| 欧美三级乱人伦电影| 欧美极品视频在线观看| 91在线观看污| 亚洲欧美偷拍另类| 亚洲免费成人| 亚洲免费视频一区| 福利片一区二区| 国产精品久久久久高潮| 色呦呦久久久| 一区二区三区黄色| 国产刺激高潮av| 欧美三级午夜理伦三级中视频| 国产一级av毛片| 欧美国产一区视频在线观看| 波多野结衣三级视频| 三级一区在线视频先锋 | 久久久噜噜噜久久久| 国产经典自拍视频在线观看| 日韩午夜激情免费电影| 日本中文字幕久久| 亚洲色图第一区| 老司机福利av| 成人黄色av电影| 天天影视色综合| 每日更新成人在线视频| 国产午夜精品视频一区二区三区| 精品影片在线观看的网站| 北条麻妃高清一区| 青草综合视频| 日本一区二区三区在线播放 | 亚洲一卡久久| 日本一区二区三区www| 亚洲乱码一区| 国产欧美日韩中文字幕在线| 一区二区三区的久久的视频| 韩国三级成人在线| 日韩免费av在线| 丰乳肥臀在线| 久久综合五月天| 成年人在线观看| 精品视频久久久久久| 丰满人妻av一区二区三区| 欧美天天综合网| 国产91精品看黄网站在线观看| 亚洲国产成人tv| 欧美成人三级在线观看| 国产精品免费视频一区| 亚洲精品成人无码| 97国产一区二区| 亚洲一区二区三区黄色| 国产精品资源站在线| 可以看污的网站| 日韩在线a电影| 麻豆av免费在线| 男人的天堂成人在线| 国产精品网站免费| 91久久在线| 久久99中文字幕| 尤物精品在线| 美女扒开大腿让男人桶| 韩国自拍一区| 免费人成在线观看视频播放| 午夜精品久久| 亚洲爆乳无码精品aaa片蜜桃| 亚洲精品在线观看91| 伊人色综合久久天天五月婷| 99精品电影| 青青草原国产免费| 香蕉视频国产精品| 999久久欧美人妻一区二区| 欧美精品播放| 成人性生活视频免费看| 日韩一级在线| 任你操这里只有精品| 老色鬼久久亚洲一区二区| 欧洲熟妇精品视频| 日本va欧美va欧美va精品| 国产福利影院在线观看| 美女免费视频一区二区| 做a视频在线观看| 国产美女一区二区三区| 中文字幕1区2区| 成人av网站在线| 99久久久久久久久久| 国产亚洲欧美在线| 欧美另类69xxxx| 亚洲男人天堂av网| 日韩欧美国产亚洲| 91黄色激情网站| 国产一区二区在线播放视频| 日韩欧美激情四射| 亚欧在线观看视频| 在线观看视频亚洲| 制服丝袜中文字幕在线| 91国内精品久久| 嫩草伊人久久精品少妇av杨幂| 成人黄色中文字幕| 精品久久ai电影| 日韩欧美亚洲在线| 欧美有码视频| 精品人妻一区二区三区四区在线 | 免费观看成人性生生活片| 国产欧美一区二区三区四区| 亚洲大奶少妇| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 四季av中文字幕| 一区二区三区欧美日韩| 草久视频在线观看| 欧美美女一区二区三区| 天天干天天做天天操| 在线性视频日韩欧美| 成人性生交大片免费看网站| 国产精品视频一区国模私拍| 亚洲精品aⅴ| 日韩高清dvd| 伊人久久大香线蕉综合热线 | 免费在线一级片| 欧美伊人精品成人久久综合97| www.亚洲黄色| 国产一区二区三区毛片| av3级在线| 成人在线视频福利| 天堂99x99es久久精品免费| 裸体裸乳免费看| 视频一区二区欧美| 亚洲一区二区三区四区av| 中文字幕色av一区二区三区| 亚洲免费在线观看av| 日韩午夜电影在线观看| 97视频精彩视频在线观看| 8090成年在线看片午夜| 日韩免费一级| 最新国产精品久久| 日韩精品午夜视频| 国产麻豆天美果冻无码视频| 亚洲一区二区三区四区五区黄 | 欧美日韩一区二区三区四区在线观看| 国产又大又黄又粗的视频| 93久久精品日日躁夜夜躁欧美| 午夜少妇久久久久久久久| 欧美日韩国产在线观看| 激情小视频在线| 热久久这里只有| 欧美日韩一区二区三区在线电影| 日韩一级特黄毛片| 激情综合色播激情啊| 少妇的滋味中文字幕bd| 91国偷自产一区二区三区观看| 污污网站在线免费观看| 久久久久久久97| 影音先锋欧美激情| 99视频精品全部免费看| 国产麻豆视频一区| 性欧美videos| 91麻豆精品国产综合久久久久久| 99视频在线观看地址| 国产精品69av| 奇米亚洲欧美| 成人在线看视频| 久久久久久久久久久久久女国产乱| 日韩特级黄色片| 亚洲男人天堂网| 亚洲成人激情社区| 青青成人在线| 美女视频免费一区| 欧美爱爱免费视频| 欧美一级高清片| 日韩特级毛片| 国产精品久久久久久久久久直播| 国产综合视频| 一级欧美一级日韩片| 日韩欧美高清视频| 番号在线播放| 国产欧美日韩中文| 欧美日韩伊人| 91视频啊啊啊| 欧洲精品一区二区三区在线观看| 中文字幕在线免费| 91精品视频免费看| 国精品一区二区| 色呦呦一区二区| 欧洲色大大久久| 国产精品剧情| 国产伦视频一区二区三区| 亚洲综合社区| 国产馆在线观看| 欧美大片在线观看一区二区| brazzers在线观看| 日韩.欧美.亚洲| 精品一二三四区| 久久高清无码视频| 日韩风俗一区 二区| 91欧美精品| 喜爱夜蒲2在线| 99精品1区2区| 亚洲天堂免费av| 欧美激情精品久久久久久蜜臀| 日韩激情毛片| 伊人色在线观看| 午夜精品aaa| av网页在线| 国产99在线免费| 免费精品视频在线| 久久视频免费看| 正在播放欧美一区| 哺乳挤奶一区二区三区免费看| 天天影视综合色|