黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

ASP.NET Core整合Zipkin鏈路跟蹤的實現方法

瀏覽:312日期:2022-06-04 16:28:45

前言

    在日常使用ASP.NET Core的開發或學習中,如果有需要使用鏈路跟蹤系統,大多數情況下會優先選擇SkyAPM。我們之前也說過SkyAPM設計確實比較優秀,巧妙的利用DiagnosticSource診斷跟蹤日志,可以做到對項目無入侵方式的集成。其實還有一款比較優秀的鏈路跟蹤系統,也可以支持ASP.NET Core,叫Zipkin。它相對于SkyWalking來說相對輕量級,使用相對來說比較偏原生的方式,而且支持Http的形式查詢和提交鏈路數據。因為我們總是希望能擁有多一種的解決方案方便對比和參考,所以接下來我們就來學習一下關于Zipkin的使用方式。

Zipkin簡介

    Zipkin是由Twitter開源的一款基于Java語言開發的分布式實時數據追蹤系統(Distributed Tracking System),其主要功能是采集來自各個系統的實時監控數據。該系統讓開發者可通過一個 Web 前端輕松的收集和分析數據,例如用戶每次請求服務的處理時間等,可方便的監測系統中存在的瓶頸。它大致可以分為三個核心概念

  • 首先是上報端,它主要通過代碼的形式集成到程序中,用于上報Trace數據到Collector端。
  • Collector負責接收客戶端發送過來的數據,保存到內存或外部存儲系統中,供UI展示。
  • 存儲端可以是基于zipkin內存完全不依賴外部存儲的In-Memory形式或依賴外部存儲系統的形式,一般采用外部存儲系統存儲鏈路數據,畢竟內存有限。它可支持的存儲數據庫有MySQL、Cassandra、Elasticsearch。
  • UI負責展示采集的鏈路數據,及系統之間的依賴關系。

相對來說還是比較清晰的,如果用一張圖表示整體架構的話,大致如下圖所示(圖片來源于網絡)

在學習鏈路跟蹤的過程中會設計到相關概念,我們接下來介紹鏈路跟蹤幾個相關的概念

  • TranceId,一般一次全局的請求會有一個唯一的TraceId,用于代表一次唯一的請求。比如我請求了訂單管理系統,而訂單管理系統內部還調用了商品管理系統,而商品管理系統還調用了緩存系統或數據庫系統。但是對全局或外部來說這是一次請求,所以會有唯一的一個TraceId。
  • SpanId,雖然全局的來說是一次大的請求,但是在這個鏈路中內部間還會發起別的請求,這種內部間的每次請求會生成一個SpanId。
  • 如果將整條鏈路串聯起來的話,我們需要記錄全局的TraceId,代表當前節點的SpanId和發起對當前節點調用的的父級ParentId。
  • 然后基于鏈路跟蹤的核心概念,然后介紹一下Zipkin衍生出來了幾個相關概念
  • cs:Clent Sent 客戶端發起請求的時間,比如 dubbo 調用端開始執行遠程調用之前。
  • cr:Client Receive 客戶端收到處理完請求的時間。
  • ss:Server Receive 服務端處理完邏輯的時間。
sr - cs = 請求在網絡上的耗時ss - sr = 服務端處理請求的耗時cr - ss = 回應在網絡上的耗時cr - cs = 一次調用的整體耗時

關于zipkin概念相關的就介紹這么多,接下來我們介紹如何部署Zipkin。

部署ZipKin

    關于Zipkin常用的部署方式大概有兩種,一種是通過下載安裝JDK,然后運行zipkin.jar的方式,另一種是基于Docker的方式。為了方便我采用的是基于Docker的方式部署,因為采用原生的方式去部署還需要安裝JDK,而且操作相對比較麻煩。咱們上面說過,雖然Zipkin可以將鏈路數據存放到內存中,但是這種操作方式并不實用,實際使用過程中多采用ElasticSearch存儲鏈路數據。所以部署的時候需要依賴Zipkin和ElasticSearch,對于這種部署形式采用docker-compose的方式就再合適不過了,大家可以在Zipkin官方Github中找到docker的部署方式,地址是https://github.com/openzipkin/zipkin/tree/master/docker,官方使用的方式相對比較復雜,下載下來docker-compose相關文件之后我簡化了它的使用方式,最終修改如下

version: "3.6"services: elasticsearch: # 我使用的是7.5.0版本 image: elasticsearch:7.5.0 container_name: elasticsearch restart: always #暴露es端口 ports: - 9200:9200 environment: - discovery.type=single-node - bootstrap.memory_lock=true #es有內存要求 - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 networks: default: aliases: - elasticsearch zipkin: image: openzipkin/zipkin container_name: zipkin restart: always networks: default: aliases: - zipkin environment: #存儲類型為es - STORAGE_TYPE=elasticsearch #es地址 - ES_HOSTS=elasticsearch:9200 ports: - 9411:9411 #依賴es所以在es啟動完成后在啟動zipkin depends_on: - elasticsearch

通過docker-compose運行編輯后的yaml文件,一條指令就可以運行起來

<PackageReference Include="zipkin4net" Version="1.5.0" /><PackageReference Include="zipkin4net.middleware.aspnetcore" Version="1.5.0" />

其中-f是指定文件名稱,如果是docker-compose.yml則可以直接忽略文件名稱,當shell中出現如下界面

并且在瀏覽器中輸入http://localhost:9411/zipkin/出現如圖所示,則說明Zikpin啟動成功

整合ASP.NET Core

ZipKin啟動成功之后,我們就可以將程序中的數據采集到Zipkin中去了,我新建了兩個ASP.NET Core的程序,一個是OrderApi,另一個是ProductApi方便能體現出調用鏈路,其中OrderApi調用ProductApi接口,在兩個項目中分別引入Zipkin依賴包

<PackageReference Include="zipkin4net" Version="1.5.0" /><PackageReference Include="zipkin4net.middleware.aspnetcore" Version="1.5.0" />

其中zipkin4net為核心包,zipkin4net.middleware.aspnetcore是集成ASP.NET Core的程序包。然后我們在Startup文件中添加如下方法

public void RegisterZipkinTrace(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostApplicationLifetime lifetime){ lifetime.ApplicationStarted.Register(() => { //記錄數據密度,1.0代表全部記錄 TraceManager.SamplingRate = 1.0f; //鏈路日志 var logger = new TracingLogger(loggerFactory, "zipkin4net"); //zipkin服務地址和內容類型 var httpSender = new HttpZipkinSender("http://localhost:9411/", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer(), new Statistics()); var consoleTracer = new zipkin4net.Tracers.ConsoleTracer(); TraceManager.RegisterTracer(tracer); TraceManager.RegisterTracer(consoleTracer); TraceManager.Start(logger); }); //程序停止時停止鏈路跟蹤 lifetime.ApplicationStopped.Register(() => TraceManager.Stop()); //引入zipkin中間件,用于跟蹤服務請求,這邊的名字可自定義代表當前服務名稱 app.UseTracing(Configuration["nacos:ServiceName"]);}

然后我們在Configure方法中調用RegisterZipkinTrace方法即可。由于我們要在OrderApi項目中采用HttpClient的方式調用ProductAPI,默認zipkin4net是支持采集HttpClient發出請求的鏈路數據(由于在ProductApi中我們并不發送Http請求,所以可以不用集成一下操作),具體集成形式如下,如果使用的是HttpClientFactory的方式,在ConfigureServices中配置如下

public void ConfigureServices(IServiceCollection services){ //由于我使用了Nacos作為服務注冊中心 services.AddNacosAspNetCore(Configuration); services.AddScoped<NacosDiscoveryDelegatingHandler>(); services.AddHttpClient(ServiceName.ProductService,client=> { client.BaseAddress = new Uri($"http://{ServiceName.ProductService}"); }) .AddHttpMessageHandler<NacosDiscoveryDelegatingHandler>() //引入zipkin trace跟蹤httpclient請求,名稱配置當前服務名稱即可 .AddHttpMessageHandler(provider =>TracingHandler.WithoutInnerHandler(Configuration["nacos:ServiceName"])); services.AddControllers();}

如果是直接是使用HttpClient的形式調用則可以采用以下方式

using (HttpClient client = new HttpClient(new TracingHandler("OrderApi"))){}

然后我們在OrderApi中寫一段調用ProductApi的代碼

[Route("orderapi/[controller]")]public class OrderController : ControllerBase{ private List<OrderDto> orderDtos = new List<OrderDto>(); private readonly IHttpClientFactory _clientFactory; public OrderController(IHttpClientFactory clientFactory) { orderDtos.Add(new OrderDto { Id = 1, TotalMoney=222,Address="北京市",Addressee="me",From="淘寶",SendAddress="武漢" }); _clientFactory = clientFactory; } /// <summary> /// 獲取訂單詳情接口 /// </summary> /// <param name="id">訂單id</param> /// <returns></returns> [HttpGet("getdetails/{id}")] public async Task<OrderDto> GetOrderDetailsAsync(long id) { OrderDto orderDto = orderDtos.FirstOrDefault(i => i.Id == id); if (orderDto != null) { OrderDetailDto orderDetailDto = new OrderDetailDto { Id = orderDto.Id, TotalMoney = orderDto.TotalMoney, Address = orderDto.Address, Addressee = orderDto.Addressee, From = orderDto.From, SendAddress = orderDto.SendAddress }; //調用ProductApi服務接口 var client = _clientFactory.CreateClient(ServiceName.ProductService); var response = await client.GetAsync($"/productapi/product/getall"); var result = await response.Content.ReadAsStringAsync(); orderDetailDto.Products = JsonConvert.DeserializeObject<List<OrderProductDto>>(result); return orderDetailDto; } return orderDto; }}

在ProductApi中我們只需要編寫調用RegisterZipkinTrace方法即可,和OrderApi一樣,我們就不重復粘貼了。因為ProductApi不需要調用別的服務,所以可以不必使用集成HttpClient,只需要提供簡單的接口即可

[Route("productapi/[controller]")]public class ProductController : ControllerBase{ private List<ProductDto> productDtos = new List<ProductDto>(); public ProductController() { productDtos.Add(new ProductDto { Id = 1,Name="酒精",Price=22.5m }); productDtos.Add(new ProductDto { Id = 2, Name = "84消毒液", Price = 19.9m }); } /// <summary> /// 獲取所有商品信息 /// </summary> /// <returns></returns> [HttpGet("getall")] public IEnumerable<ProductDto> GetAll() { return productDtos; }}

啟動這兩個項目,調用OrderApi的getdetails接口,完成后打開zipkin界面點擊進去可查看鏈路詳情
總結起來核心操作其實就兩個,一個是在發送請求的地方,使用TracingHandler記錄發起端的鏈路情況,然后在接收請求的服務端使用UseTracing記錄來自于客戶端請求的鏈路情況。

改進集成方式

    其實在上面的演示中,我們可以明顯的看到明顯的不足,就是很多時候其實我們沒辦法去設置HttpClient相關的參數的,很多框架雖然也是使用的HttpClient或HttpClientFactory相關,但是在外部我們沒辦法通過自定義的方式去設置他們的相關操作,比如Ocelot其實也是使用HttpClient相關發起的轉發請求,但是對外我們沒辦法通過我們的程序去設置HttpClient的參數。還有就是在.Net Core中WebRequest其實也是對HttpClient的封裝,但是我們同樣沒辦法在我們的程序中給他們傳遞類似TracingHandler的操作。現在我們從TracingHandler源碼開始解讀看看它的內部到底是如何工作的,zipkin官方提供的.net core插件zipkin4net的源碼位于
https://github.com/openzipkin/zipkin4net,我們找到TracingHandler類所在的位置[點擊查看源碼👈],由于TracingHandler本身就是DelegatingHandler的子類,所以我們主要看SendAsync方法,大致抽離出來如下

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken){ Func<HttpRequestMessage, string> _getClientTraceRpc = _getClientTraceRpc = getClientTraceRpc ?? (request => request.Method.ToString()); IInjector<HttpHeaders> _injector = Propagations.B3String.Injector<HttpHeaders>((carrier, key, value) => carrier.Add(key, value)); //記錄發起請求客戶端鏈路信息的類是ClientTrace using (var clientTrace = new ClientTrace(_serviceName, _getClientTraceRpc(request))) { if (clientTrace.Trace != null) { _injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers); } var result = await clientTrace.TracedActionAsync(base.SendAsync(request, cancellationToken)); //AddAnnotation是記錄標簽信息,我們可以在zipkin鏈路詳情中看到這些標簽 if (clientTrace.Trace != null) { //記錄請求路徑 clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_PATH, result.RequestMessage.RequestUri.LocalPath)); //記錄請求的http方法 clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_METHOD, result.RequestMessage.Method.Method)); if (_logHttpHost) { //記錄主機 clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_HOST, result.RequestMessage.RequestUri.Host)); } if (!result.IsSuccessStatusCode) { clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_STATUS_CODE, ((int)result.StatusCode).ToString())); } } return result; }}

實現方式比較簡單,就是借助ClientTrace記錄一些標簽,其他的相關操作都是由zipkin4net提供的。我們在之前的文章.Net Core中的診斷日志DiagnosticSource講解中層說道HttpClient底層會有發出診斷日志,我們可以借助這個思路,來對HttpClient進行鏈路跟蹤埋點。
我們結合Microsoft.Extensions.DiagnosticAdapter擴展包定義如下類

public class HttpDiagnosticListener: ITraceDiagnosticListener{ public string DiagnosticName => "HttpHandlerDiagnosticListener"; private ClientTrace clientTrace; private readonly IInjector<HttpHeaders> _injector = Propagations.B3String.Injector<HttpHeaders>((carrier, key, value) => carrier.Add(key, value)); [DiagnosticName("System.Net.Http.Request")] public void HttpRequest(HttpRequestMessage request) { clientTrace = new ClientTrace("apigateway", request.Method.Method); if (clientTrace.Trace != null) { _injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers); } } [DiagnosticName("System.Net.Http.Response")] public void HttpResponse(HttpResponseMessage response) { if (clientTrace.Trace != null) { clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_PATH, response.RequestMessage.RequestUri.LocalPath)); clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_METHOD, response.RequestMessage.Method.Method)); clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_HOST, response.RequestMessage.RequestUri.Host)); if (!response.IsSuccessStatusCode) { clientTrace.AddAnnotation(Annotations.Tag(zipkinCoreConstants.HTTP_STATUS_CODE, ((int)response.StatusCode).ToString())); } } } [DiagnosticName("System.Net.Http.Exception")] public void HttpException(HttpRequestMessage request,Exception exception) { }}

ITraceDiagnosticListener是我們方便操作DiagnosticListener定義的接口,接口僅包含DiagnosticName用來表示DiagnosticListener監聽的名稱,有了這個接口接下來的操作我們會方便許多,接下來我們來看訂閱操作的實現。

public class TraceObserver :IObserver<DiagnosticListener>{ private IEnumerable<ITraceDiagnosticListener> _traceDiagnostics; public TraceObserver(IEnumerable<ITraceDiagnosticListener> traceDiagnostics) { _traceDiagnostics = traceDiagnostics; } public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(DiagnosticListener listener) { //這樣的話我們可以更輕松的擴展其他DiagnosticListener的操作 var traceDiagnostic = _traceDiagnostics.FirstOrDefault(i=>i.DiagnosticName==listener.Name); if (traceDiagnostic!=null) { //適配訂閱 listener.SubscribeWithAdapter(traceDiagnostic); } }}

通過這種操作我們就無需關心如何將自定義的DiagnosticListener訂閱類適配到DiagnosticAdapter中去,方便我們自定義其他DiagnosticListener的訂閱類,這樣的話我們只需注冊自定義的訂閱類即可。

services.AddSingleton<TraceObserver>();services.AddSingleton<ITraceDiagnosticListener, HttpDiagnosticListener>();

通過這種改進方式,我們可以解決類似HttpClient封裝到框架中,并且我們我們無法通過外部程序去修改設置的時候。比如我們在架構中引入了Ocelot網關,我們就可以采用類似這種方式,在網關層集成zipkin4net。

自定義埋點

    通過上面我們查看TracingHandler的源碼我們得知埋點主要是通過ClientTrace進行的,它是在發起請求的客戶端進行埋點。在服務端埋點的方式我們可以通過TracingMiddleware中間件中的源碼查看到[點擊查看源碼👈]叫ServerTrace。有了ClientTrace和ServerTrace我們可以非常輕松的實現一次完整的客戶端和服務端埋點,只需要通過它們打上一些標簽即可。其實它們都是對Trace類的封裝,我們找到它們的源碼進行查看

public class ClientTrace : BaseStandardTrace, IDisposable{ public ClientTrace(string serviceName, string rpc) { if (Trace.Current != null) { Trace = Trace.Current.Child(); } Trace.Record(Annotations.ClientSend()); Trace.Record(Annotations.ServiceName(serviceName)); Trace.Record(Annotations.Rpc(rpc)); } public void Dispose() { Trace.Record(Annotations.ClientRecv()); }}public class ServerTrace : BaseStandardTrace, IDisposable{ public override Trace Trace { get { return Trace.Current; } } public ServerTrace(string serviceName, string rpc) { Trace.Record(Annotations.ServerRecv()); Trace.Record(Annotations.ServiceName(serviceName)); Trace.Record(Annotations.Rpc(rpc)); } public void Dispose() { Trace.Record(Annotations.ServerSend()); }}

因此,如果你想通過更原始的方式去記錄跟蹤日志可以采用如下方式

var trace = Trace.Create();trace.Record(Annotations.ServerRecv());trace.Record(Annotations.ServiceName(serviceName));trace.Record(Annotations.Rpc("GET"));trace.Record(Annotations.ServerSend());trace.Record(Annotations.Tag("http.url", "<url>"));

示例Demo

由于上面說的比較多,而且有一部分關于源碼的解讀,為了防止由本人文筆有限,給大家帶來理解誤區,另一方面也為了更清晰的展示Zipkin的集成方式,我自己做了一套Demo,目錄結構如下
ApiGateway為網關項目可以轉發針對OrderApi的請求,OrderApi和ProductApi用于模擬業務系統,這三個項目都集成了zipkin4net鏈路跟蹤,他們之間是通過Nacos實現服務的注冊和發現。這個演示Demo我本地是可以直接運行成功的,如果有下載下來運行不成功的,可以評論區給我留言。由于博客園有文件上傳大小的限制,所以我將Demo上傳到了百度網盤中
下載鏈接:鏈接: https://pan.baidu.com/s/1LDyoRQehaE0FzedFTC4_Og 提取碼: i45x 

總結

    以上就是關于Zipkin以及ASP.NET Core整合Zipkin的全部內容,希望能給大家帶來一定的幫助。如果你有實際需要也可以繼續自行研究。Zipkin相對于我們常用的Skywalking而且,它的使用方式比較原生,許多操作都需要自行通過代碼操作,而SkyAPM可以做到對代碼無入侵的方式集成。Skywalking是一款APM(應用性能管理),鏈路跟蹤只是它功能的一部分。而Zipkin是一款專注于鏈路跟蹤的系統,個人感覺就鏈路跟蹤這一塊而言,Zipkin更輕量級(如果使用ES作為存儲數據庫的話,Skywalking默認會生成一堆索引,而Zipkin默認是每天創建一個索引),而且鏈路信息檢索、詳情展示、鏈路數據上報形式等相對于Skywalking形式也更豐富一些。但是整體而言Skywalking更強大,比如應用監控、調用分析、集成方式等。技術并無好壞之分,適合自己的才是更好的,多一個解決方案,就多一個解決問題的思路,我覺得這是對于我們程序開發人員來說都應該具備的認知。

到此這篇關于ASP.NET Core整合Zipkin鏈路跟蹤的實現方法的文章就介紹到這了,更多相關ASP.NET Core整合Zipkin鏈路跟蹤內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: ASP
相關文章:
主站蜘蛛池模板: 狠狠干性视频 | 日韩伦理一区二区三区 | 国产激情片| 舒淇裸体午夜理伦 | 国产精品无码专区在线播放 | 国产乱色国产精品播放视频 | 国产中文区二幕区2021 | 高清一级片 | 少妇一区二区三区 | 日韩精品一区二区午夜成人版 | 黑人干亚洲女人 | 亚洲日韩电影久久 | 欧美性欧美zzzzzzzzz | 色综合久久久无码中文字幕波多 | 国产亚洲精品久久久久秋霞 | 性欧美丰满熟妇xxxx性久久久 | 青青操免费在线视频 | 怡红院a∨人人爰人人爽 | av大全网站 | 奇米第四色一二三四区 | 精品一区二区久久久 | 永久免费看mv网站入口亚洲 | 超碰爱爱 | 97成人超碰 | 久久国产精品久久久久久 | 国产伦孑沙发午休精品 | 色一情一狱一爱一乱 | 日韩淫视频| 亚洲中文字幕在线第六区 | 亚洲国产中文字幕在线视频综合 | 好大好爽cao死我了bl | 丰满熟妇乱又伦在线无码视频 | 国产精品中文在线 | 永久免费的网站入口 | 亚洲制服丝袜精品久久 | 天天干天天摸天天操 | 欧美 日韩 一区二区三区 | 国产精品永久在线 | 青青草成人免费在线视频 | 欧美激情国产在线 | 日韩三级成人 | 亚洲一区二区三区四区五区六 | 国产av熟女一区二区三区 | 久久久久久久久免费 | 91小宝寻花一区二区三区 | 97色偷偷色噜噜狠狠爱网站 | 九九香蕉视频 | 无人在线观看的免费高清视频 | 欧美午夜精品久久久久久浪潮 | 国产69精品一区二区亚洲孕妇 | 极品美女白嫩呻吟湿淋淋照片 | 中文字幕视频在线观看 | 淫综合网 | 亚洲精品日日夜夜 | 精品夜色国产国偷在线 | 精品少妇人妻av一区二区 | 国产91丝袜 | 91香蕉视频黄色 | 大尺度做爰床戏呻吟2046 | 国产精品区一区二区三含羞草 | 97香蕉久久超级碰碰高清版 | 欧美一区视频 | av在线资源网站 | 久久国产精品偷 | 精品国产一区二区在线 | wwwcom日本| 日韩乱码人妻无码中文字幕久久 | 国产精品xxxxxx | 亚洲成人一区二区在线观看 | 亚洲第一黄网 | 精品日韩在线观看 | 国内av一区二区 | 黄色大片网 | 国内爆初菊对白视频 | 国产又色又爽又黄的视频在线观看 | 成人性生交大片免费看r视频 | 在线看免费毛片 | 国产精品2019| 国产成人av免费 | 人人爽人人爽人人片av亚洲 | 国产乱人伦精品免费 | 4438国产精品一区二区 | 成人国产精品免费观看动漫 | 999久久久国产999久久久 | 一个人看的免费高清www视频 | 精品国产综合 | 天天爽天天干 | 国产伦精品一区二区三区四区免费 | 成人免费av在线播放 | 在线视频夫妻内射 | 玩丰满熟妇xxxx视频 | 国产公共场合大胆露出 | 精品 日韩 国产 欧美 视频 | 女人扒开腿让男人桶到爽 | 亚洲视频导航 | 国产三级香港三韩国三级 | 国产丝袜美女 | 91网站在线免费观看 | 亚洲日韩欧美内射姐弟 | 亚洲熟妇无码爱v在线观看 又色又爽又黄18禁美女裸身无遮挡 | 7777kkk亚洲综合欧美网站 | 欧美成人h版 | 国产精品资源在线观看 | 久久99国产综合精品免费 | 中文成人精品久久一区 | 亚洲欧美成人精品香蕉网 | 欧美做受又硬又粗又大视频 | 黄色成人在线 | 亚洲一区久久久 | 国产精品久久久久一区二区 | 天天舔天天射 | 91精品国产91久久综合 | 国产在线观看你懂的 | 久久久wwww| 91精品国产亚洲 | 成年人的天堂 | 少妇色综合 | 国产suv精品一区二区四 | 青青青青在线 | 自拍偷拍精品视频 | 少妇饥渴偷公乱第95 | 国产精品入口免费视频一 | 午夜精品久久久久久久四虎美女版 | 中文无码一区二区三区在线观看 | 无码人妻一区二区三区一 | 少妇久久久久久 | 亚洲天堂少妇 | www.香蕉视频 | 亚洲精品456在线播放狼人 | 久久久久国产精品视频 | 巨胸喷奶水www久久久 | 麻豆精品国产传媒av | 国产国产乱老熟女视频网站97 | 久久久一级 | 蜜桃成人免费视频 | 男人扒女人添高潮视频 | 女人18毛片一区二区三区 | 国产成人艳妇aa视频在线 | 人妻无码久久精品人妻 | 伊人性视频 | 亚洲国产欧美另类 | www欧美com | 久久精品中文騷妇女内射 | 免费色站 | 97精品在线视频 | 免费av网址在线观看 | 精品一区二区三区四区五区 | 97视频网址 | 日本一级淫片免费啪啪琪琪 | 91精品国产色综合久久不卡蜜臀 | 四虎网站 | 午夜视频一区二区 | 丰满少妇一区二区三区专区 | 福利在线视频观看 | 日韩av导航 | 亚洲五月花 | 天天舔天天舔 | 国产在线精品一区二区三区不卡 | 在线看免费视频 | www.久久久.com | 激情噜噜 | 欧美性受xxx | 欧美乱插| 欧美v国产v亚洲v日韩九九 | 日日日噜噜噜 | 秋霞一级全黄大片 | 青青草操| 国产第一福利影院 | 国产精品无码v在线观看 | 成人影视免费 | 国产a毛片| 伊人成综合 | 日韩精品一区二区在线观看 | 黄片毛片在线观看 | 四虎影视在线永久免费观看 | 最新黄色av网址 | 日本最新免费二区三区 | 香蕉视频1024 | 九九免费在线视频 | 青草青草久热国产精品 | 超碰在线观看免费 | 中文字幕av导航 | 国产亚洲精品久久久97蜜臀 | 亚洲欧美v| 精品亚洲成在人线av无码 | 久久经典视频 | 国产精品入口牛牛影视 | 中文字幕视频在线 | 综合天堂av久久久久久久 | 鲁一鲁一鲁一鲁一av | 91亚洲精品国产成人 | 日本高清视频网站 | 国内精品视频在线播放 | 国产又黄又爽又猛免费视频网站 | 久久妇女高潮喷水多 | 91porny丨首页入口在线 | 国自产拍偷拍精品啪啪一区二区 | 国产精品夜夜 | 欧美蜜桃视频 | 中文字幕狠狠干 | 极品人妻videosss人妻 | 少妇性bbb搡bbb爽爽爽欧美 | 男女作爱bbbbbbbbb | 成人免费午夜视频69影院 | 国产真人无遮挡作爱免费视频 | 亚洲精品中文字幕久久久久 | 欧美成人黑人xx视频免费观看 | 亚洲成人免费网站 | 三级黄色av | 精品亚洲一区二区三区四区五区 | 97人人做人人添人人爱 | 91亚洲日本aⅴ精品一区二区 | www黄色毛片 | 天天做天天看 | 欧美国产影院 | 久久深夜视频 | 免费av手机在线观看 | 久久精品囯产精品亚洲 | 日批在线| av中文字幕观看 | 最新中文字幕av专区 | 免费无遮挡无码永久视频 | 国产又粗又猛又大爽 | 亚洲国产午夜精品理论片 | 精品国产精品三级精品av网址 | 无码粉嫩虎白一线天在线观看 | 国产亚洲精品久久久久久大师 | 精品一区二区三区在线视频 | 国产高清性xxxxxxxx | 四虎影视成人永久免费观看视频 | 免费久久日韩aaaaa大片 | 免费久久精品 | 怡红院怡春院a∨免费十部 怡红院最新网址 | 在线人人车操人人看视频 | 美女脱了内裤张开腿让男人桶网站 | 日韩av一区二区精品不卡 | 521香蕉网站大香网站 | 国产孕妇孕交高潮 | 欧美老熟妇欲乱高清视频 | 国产精品8 | 日韩三级免费观看 | 日本一区二区三区在线免费观看 | 93精品国产乱码久久久 | 麻豆毛片| 97超碰在线免费 | 99中文字幕| 午夜国产精品视频 | 久久大综合| 狠狠色丁香婷婷久久综合五月 | 亚洲人成色777777精品音频 | 久久久久偷看国产亚洲87 | 亚洲精品www久久久久久 | 亚洲成肉网 | 看久久| 婷婷丁香五月天综合东京热 | 99精品欧美一区二区 | 好爽又高潮了毛片免费下载 | 亚洲中文字幕无码不卡电影 | 久久国产精品99国产精 | 亚洲狠狠婷婷综合久久久久图片 | 草草浮力地址线路①屁屁影院 | 久久成人高清 | 性欧美视频videos6一9 | 成人h动漫精品一区二区原神 | 一区二区精品在线观看 | 中文字幕欧美在线 | 亚洲丝袜一区二区 | 无遮挡国产高潮视频免费观看 | 亚洲九九热 | 超碰免费成人 | 国产经典一区二区三区 | 国内精品人妻久久毛片app | 久久这里只有精品国产 | 婷婷五月综合丁香在线 | 亚洲图片三区 | 久久三| 午夜色网站 | 瑟瑟视频在线观看 | 变态孕妇孕交av免费看 | 日本美女逼 | 亚洲伊人伊色伊影伊综合网 | 欧美jizzhd精品欧美 | 黑丝一区 | 正在播放亚洲 | 国产极品粉嫩在线观看的软件 | 国产精品www色诱视频 | 亚洲毛片在线 | 亚洲成年人在线观看 | 久久国产精品久久久久久电车 | 在线亚洲一区 | 免费涩涩18网站入口 | 成人婷婷网色偷偷亚洲男人的天堂 | 久久岛国| 三男一女吃奶添下面视频 | 2020精品国产自在现线看 | 男女做爰猛烈啪啪吃奶动床戏麻豆 | 国产麻豆a毛片 | 色综合久久88 | 中文字幕人乱码中文字 | 一级黄色美女视频 | 国产又粗又猛又爽又黄 | 黄色小说在线免费观看 | 日韩在线视频中文字幕 | 日本激情一区二区 | 骚片av蜜桃精品一区 | 久久97| 欧美精品一区二区三区久久久竹菊 | 久草网在线观看 | wwwcom国产| 亚洲va欧美| 自拍偷在线精品自拍偷无码专区 | 国产一区免费 | 亚洲精品久久久久中文字幕欢迎你 | 少妇激情偷人三级 | 免费观看添你到高潮视频 | 亚洲成年网 | 久久无码精品一区二区三区 | 国产成人精品在线视频 | 久草热在线 | 国产99免费| 麻豆精品免费观看 | 日韩毛片在线播放 | 夜夜春亚洲嫩草一区二区 | 欧美一级淫片免费视频魅影视频 | 亚洲欧洲日韩av | 伦理一级片 | 黄瓜视频在线观看污 | 成人三级黄色片 | 国产人妻精品一区二区三区不卡 | 久久99国产综合精品 | 玖玖在线观看视频 | 免费看色网站 | 瑜伽裤国产一区二区三区 | 国产噜噜噜噜久久久久久久久 | 欧美日韩精品一区二区在线播放 | 亚洲精品www久久久久久软件 | 首页 亚洲 欧美 制服 丝腿 | 国产一区二区在线视频 | mm视频在线观看 | 久久精品国产99国产精品导航 | 日本免费在线观看视频 | 亚洲一区二区三区四区av | 在线视频 日韩 | 国产绳艺sm调教室论坛 | 一区二区三区国产精品 | 日韩精品手机在线 | 久久久久久av无码免费网站下载 | 亚洲人成亚洲人成在线观看 | 亚洲精品视频在线观看免费视频 | 欧美黄视频在线观看 | 国产一区二区三区在线看 | 九色视频导航 | 亚洲国产精品成人综合在线 | 欧美日韩中文字幕 | 91丨porny丨在线中文 | 污视频网站免费观看 | 国产精品乱码妇女bbbb | 男人的又粗又长又硬 | 九九九久久久精品 | 国产一区自拍视频 | 精品日韩一区 | 欧美一级色片 | 精品一区二区三区国产 | 观看成人永久免费视频 | 丰满妇女毛茸茸刮毛 | www狠狠操 | 亚洲乱妇熟女爽到高潮的片 | 日本中文有码 | 性欧美zoo| 成人黄色在线 | 国产肉丝袜在线观看 | 国产三级在线观看视频 | 台湾佬自拍偷区亚洲综合 | 国产不雅视频 | 男女啪啪免费视频网站 | 欧美精品综合 | 国产成人三级在线视频 | 久久久久日韩精品久久久男男 | 日韩一区二区三区在线播放 | 热久久美女精品天天吊色 | 国产又爽又粗又猛的视频 | 九九99九九精彩6 | 欧美丰满老熟妇xxxxx性 | 国产精品视频一区二区三区不卡 | 丰满少妇弄高潮了www | 麻豆三级在线观看 | 国产无人区码一码二码三mba | 国产麻豆午夜三级精品 | 欧美视频在线一区二区三区 | 日本人妻中文字幕乱码系列 | 国产网站在线免费观看 | www亚洲精品少妇裸乳一区二区 | 久久久久久欧美精品se一二三四 | 91久久婷婷国产一区二区三区 | 在线免费精品视频 | 日产国产精品亚洲系列 | 嫩草网站入口一区二区 | 亚洲精品久久久久久久蜜桃臀 | 天天天操天天天干 | 99久久久 | 亚洲欧洲精品成人久久曰 | 国内丰满熟女出轨videos | 亚洲日本欧美日韩高观看 | 老牛嫩草一区二区三区消防 | av在线免费观看不卡 | 综合色在线视频 | 日韩精品免费一区二区三区 | 黑丝国产在线 | 中文字幕在线播放一区二区 | 国产三区四区视频 | 色偷偷一区二区无码视频 | 精品偷拍一区二区三区在线看 | 狠狠色综合网站久久久久久久 | 亲嘴扒胸摸屁股激烈网站 | 黄色69视频| 免费无码又黄又爽又刺激 | 国产人妻精品午夜福利免费 | 51国产偷自视频区免费播放 | 伊人久久99 | 国产片性视频免费播放 | 军人粗大的内捧猛烈进出视频 | 99国产精品久久久蜜芽 | 色久av| 成人免费视频在线看 | 96国产精品 | 超污网站在线看 | 精品视频在线观看 | 人妻中出无码一区二区三区 | 亚洲字幕av一区二区三区四区 | 精品亚洲成av人在线观看 | 天天看天天操 | 女超人h版av在线看 女儿的朋友4在线观看 | 国产suv精品一区 | 国产午夜不卡片免费视频 | 国语精品| 欧美成人精品高清视频在线观看 | 久久精品人成免费 | 免费观看污 | 国产成人午夜精华液 | 国产乱码精品一区二区三区中文 | 韩国理伦三级 | 帮老师解开蕾丝奶罩吸乳网站 | 亚洲国产精品成人一区二区在线 | 中日韩中文字幕 | heyzo北岛玲在线播放 | 免费黄毛片 | 日韩精品成人免费观看视频 | 日本中文字幕视频在线 | 五月中文字幕 | 国产女同疯狂作爱系列3 | 日本黄又爽又大高潮毛片 | 国产又大又黄又猛 | 一区二区三区入口 | 97精品国产97久久久久久免费 | 久久久综合香蕉尹人综合网 | 成人黄色在线免费观看 | 国产精品入口免费软件 | 天天干天天舔天天操 | 啪啪网页 | 欧美精品乱码 | 男女做爰猛烈吃奶啪啪喷水网站 | 美国色综合 | 国产又大又长又粗 | 欧美v成 人在线观看 | 国产尤物av | 3p在线播放 | aⅴ资源番号库 | 欧美一级大黄大黄大色毛片小说 | 亚洲va欧美va人人爽 | www久久久久 | 免费在线黄 | 亚洲午夜天堂吃瓜在线 | 美女a视频| 国产成人高清精品免费 | 成年人激情网站 | 91丨九色丨海角社区 | 欧美成人精品第一区二区三区 | 日韩视频无码中字免费观 | 日韩av第一页| 国产精品欧美亚洲韩国日本久久 | 永久免费看黄网站 | 欧美成人免费观看 | 加勒比综合在线19p 加勒比综合在线888 | 久久精品久久久久久久 | 黄色免费在线网站 | 免费看a的网站 | 成人免费在线视频网站 | 亚洲国精产品一二二线 | 风流少妇按摩来高潮 | 水蜜桃久久夜色精品一区怎么玩 | 九色porny丨精品自拍视频 | 国产aa级| 久久久久久久999 | 亚洲在线免费 | 少妇一级淫片免费播放 | 国产精品男女啪啪 | 少妇第一次交换又紧又爽 | 51国产偷自视频区视频小蝌蚪 | 老头糟蹋新婚少妇系列小说 | 含羞草传媒mv免费观看视频 | 午夜九九九| 国产做爰xxxⅹ久久久精华液 | 俺也来俺也去俺也射 | 国产精品久久久久久久久大全 | 又粗又猛又黄又爽无遮挡 | 成人亚洲天堂 | 岛国视频一区 | 69xxⅹ性视频免费 | 两个人看的www在线观看 | 久久免费视频观看 | 夜夜嗨av一区二区三区四区 | 日本爽爽爽爽爽爽在线观看免 | 成人tv888| 日本骚少妇| 国产成人久久精品亚洲 | 北条麻妃一区二区三区在线 | 国产一线二线在线观看 | 国产卡一卡二 | 中文字幕乱码人妻二区三区 | 91精品国产高清一区二区三区蜜臀 | 国产一线天粉嫩馒头极品av | 日本护士毛茸茸高潮 | 欧美日韩激情网 | 日韩av在线播 | 久久伊人网视频 | 丰满岳乱妇在线观看视频国产 | 91成人精品一区二区三区四区 | 日韩人妻无码一区二区三区久久99 | 91在线视频免费观看 | 久久人人爽亚洲精品天堂 | 成年人免费毛片 | 日本熟女毛茸茸 | 国产精品99久久久精品 | 肉性天堂 | 亚洲精品综合一区二区 | 91视频专区 | 久久久久噜噜噜亚洲熟女综合 | 欧美精品一区二区视频在线观看 | 嫩草影院永久入口 | 日本a级免费| 含紧一点h边做边走动免费视频 | 大尺度激情吻胸视频 | 国产精品一区二区福利视频 | 国产av毛片| 中文字幕老妇偷乱视频在线小说 | 麻豆视频官网 | 国产精品国产自线拍免费软件 | 国产精品成人一区二区 | 亚洲性久久久 | 国产69精品久久久久久野外 | 19禁国产精品福利视频 | julia一区二区在线播放 | 全部av―极品视觉盛宴 | 亚洲深夜在线 | 在线 国产 欧美 亚洲 天堂 | 欧洲熟妇色xxxxx欧美老妇伦 | 国产精品久久久久亚洲影视 | 亚洲自偷精品视频自拍 | 国产成人麻豆精品午夜在线 | yy6080高清性理论片啪 | 99久久精品费精品国产一区二区 | 欧美另类交在线观看 | 欧美性开放视频 | 92国产精品午夜福利 | 亚洲精品成人a在线观看 | 在线播放日韩av | 国产精品久久久 | 亚洲 小说区 图片区 都市 | 夜夜嗨av久久av | 国产亚洲精品久久久久久青梅 | 国产成人精品优优av | 97免费人妻在线视频 | 东北老女人高潮大叫对白 | 免费观看污网站 | 黄色av网址在线观看 | 麻豆人妻无码性色av专区 | 久久大陆 | 国产精品免费久久久久影院 | 亚洲自拍偷拍一区二区三区 | 国产性色的免费视频网站 | 在线观看av一区 | 精品国产免费一区二区三区五区 | 性调教学院高h学校 | 久草青青| 91精品在线免费观看 | 无码精品国产va在线观看dvd | 欧美牲交a欧美牲交aⅴ免费真 | 高潮添下面视频免费看 | 天天草夜夜| 久久久精品人妻一区二区三区四 | 丰满少妇aaaaaa爰片毛片 | 欧美大片免费在线观看 | 国产l精品国产亚洲区久久 国产sm主人调教女m视频 | 亚洲春色av无码专区在线播放 | 色综合a怡红院怡红院 | 一级中国毛片 | 男人天堂2024| 18性夜影院午夜寂寞影院免费 | 精品国产一区二区三区久久久蜜月 | 亚洲最大黄色网址 | 亚洲成av人无码综合在线观看 | 欧美一级在线观看 | 国产艳妇疯狂做爰视频 | 国产91对白在线观看九色 | 国产网站av | 欧洲美女毛片 | 一级大片视频 | 亚洲夜夜夜 | 欧美a√ | 国产 中文 字幕 日韩 在线 | 亚洲综合色成在线播放 | 国产精品久久久久久久久久免 | 国产suv精品一区二人妻 | 亚洲天堂视频在线观看 | 性生交大片免费全片 |