国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

深入剖析全鏈路灰度技術(shù)內(nèi)幕

共 14494字,需瀏覽 29分鐘

 ·

2021-12-29 14:55

作者:揚少

當(dāng)服務(wù)有新版本要發(fā)布上線時,通過引流一小部分流量到新版本,可以及時發(fā)現(xiàn)程序問題,有效阻止大面積故障的發(fā)生。業(yè)界上已經(jīng)有比較成熟的服務(wù)發(fā)布策略,比如藍綠發(fā)布、A/B 測試以及金絲雀發(fā)布,這些發(fā)布策略主要專注于如何對單個服務(wù)進行發(fā)布。在微服務(wù)體系架構(gòu)中,服務(wù)之間的依賴關(guān)系錯綜復(fù)雜,有時某個功能發(fā)版依賴多個服務(wù)同時升級上線。我們希望可以對這些服務(wù)的新版本同時進行小流量灰度驗證,這就是微服務(wù)架構(gòu)中特有的全鏈路灰度場景,通過構(gòu)建從網(wǎng)關(guān)到整個后端服務(wù)的環(huán)境隔離來對多個不同版本的服務(wù)進行灰度驗證。


本文將會揭開全鏈路灰度的神秘面紗,深入剖析全鏈路灰度技術(shù)內(nèi)幕,引出兩種不同的實現(xiàn)方案,并對實現(xiàn)方案的技術(shù)細節(jié)進行深入探討,最后通過實踐環(huán)節(jié)來展示全鏈路灰度在實際業(yè)務(wù)中的使用場景。


01

微服務(wù)架構(gòu)帶來的挑戰(zhàn)

Cloud Native


為了滿足業(yè)務(wù)的迭代速度,開發(fā)者開始對原來的單體架構(gòu)進行細粒度的拆分,將單體應(yīng)用中的服務(wù)模塊拆分成一個個獨立部署運行的微服務(wù),并且這些微服務(wù)的生命周期由對應(yīng)的業(yè)務(wù)團隊獨自負責(zé),有效的解決了單體架構(gòu)中存在的敏捷性不足、靈活性不強的問題。常見的做法是根據(jù)業(yè)務(wù)域或者功能域進行服務(wù)拆分,如下圖:


其中,流量網(wǎng)關(guān)是四層代理,主要功能有負載均衡、TLS 卸載以及一些安全防護功能;微服務(wù)網(wǎng)關(guān)是七層代理,主要用來暴露后端服務(wù)、流量治理、訪問控制和流量監(jiān)控。以"高內(nèi)聚、低耦合"作為設(shè)計理念的微服務(wù)架構(gòu)為開發(fā)者帶來了前所未有的開發(fā)體驗,每個業(yè)務(wù)團隊專注于自身業(yè)務(wù)的代碼邏輯,并通過 API 形式對外發(fā)布。服務(wù)依賴方只需引入服務(wù)提供方的 API 定義,即可完成服務(wù)之間通信,無需關(guān)心服務(wù)提供方的部署形態(tài)和內(nèi)部實現(xiàn)。

但任何架構(gòu)都不是銀彈,在解決舊問題同時勢必會引入一些新的問題。微服務(wù)體系中最令人頭疼的問題,是如何對眾多微服務(wù)進行高效、便捷的治理,主要表現(xiàn)在可見性、連接性和安全性這三個方面。進一步細化,微服務(wù)架構(gòu)帶來了以下的挑戰(zhàn):



本文的重點主要關(guān)注服務(wù)發(fā)布這一子領(lǐng)域,如何保證微服務(wù)體系中服務(wù)新版本升級過程中平滑無損,以及如何低成本的為多個微服務(wù)構(gòu)建流量隔離環(huán)境,方便開發(fā)者同時對多個服務(wù)新版本進行充分的灰度驗證,避免故障的發(fā)生。

02

什么是全鏈路灰度

Cloud Native

1
?單體架構(gòu)下的服務(wù)發(fā)布


首先,我們先看一下在單體架構(gòu)中,如何對應(yīng)用中某個服務(wù)模塊進行新版本發(fā)布。如下圖,應(yīng)用中的 Cart 服務(wù)模塊有新版本迭代:


由于 Cart 服務(wù)是應(yīng)用的一部分,所以新版本上線時需要對整個應(yīng)用進行編譯、打包以及部署。服務(wù)級別發(fā)布問題變成了應(yīng)用級別的發(fā)布問題,我們需要對應(yīng)用的新版本而不是服務(wù)來實施有效的發(fā)布策略。


目前,業(yè)界已經(jīng)有非常成熟的服務(wù)發(fā)布方案,例如藍綠發(fā)布和灰度發(fā)布。藍綠發(fā)布需要對服務(wù)的新版本進行冗余部署,一般新版本的機器規(guī)格和數(shù)量與舊版本保持一致,相當(dāng)于該服務(wù)有兩套完全相同的部署環(huán)境,只不過此時只有舊版本在對外提供服務(wù),新版本作為熱備。當(dāng)服務(wù)進行版本升級時,我們只需將流量全部切換到新版本即可,舊版本作為熱備。我們的例子使用藍綠發(fā)布的示意圖如下,流量切換基于四層代理的流量網(wǎng)關(guān)即可完成。


在藍綠發(fā)布中,由于存在流量整體切換,所以需要按照原服務(wù)占用的機器規(guī)模為新版本克隆一套環(huán)境,相當(dāng)于要求原來1倍的機器資源?;叶劝l(fā)布的核心思想是根據(jù)請求內(nèi)容或者請求流量的比例將線上流量的一小部分轉(zhuǎn)發(fā)至新版本,待灰度驗證通過后,逐步調(diào)大新版本的請求流量,是一種循序漸進的發(fā)布方式。我們的例子使用灰度發(fā)布的示意圖如下,基于內(nèi)容或比例的流量控制需要借助于一個七層代理的微服務(wù)網(wǎng)關(guān)來完成。


其中,Traffic Routing 是基于內(nèi)容的灰度方式,比如請求中含有頭部 stag=gray 的流量路由到應(yīng)用 v2 版本;Traffic Shifting 是基于比例的灰度方式,以無差別的方式對線上流量按比重進行分流。相比藍綠發(fā)布,灰度發(fā)布在機器資源成本以及流量控制能力上更勝一籌,但缺點就是發(fā)布周期過長,對運維基礎(chǔ)設(shè)施要求較高。

2
?微服務(wù)架構(gòu)下的服務(wù)發(fā)布


在分布式微服務(wù)架構(gòu)中,應(yīng)用中被拆分出來的子服務(wù)都是獨立部署、運行和迭代的。單個服務(wù)新版本上線時,我們再也不需要對應(yīng)用整體進行發(fā)版,只需關(guān)注每個微服務(wù)自身的發(fā)布流程即可,如下:


為了驗證服務(wù) Cart 的新版本,流量在整個調(diào)用鏈路上能夠通過某種方式有選擇的路由到 Cart 的灰度版本,這屬于微服務(wù)治理領(lǐng)域中流量治理問題。常見的治理策略包括基于 Provider 和基于 Consumer 的方式。

  • 基于 Provider 的治理策略。配置 Cart 的流量流入規(guī)則,User 路由到 Cart 時使用 Cart 的流量流入規(guī)則。

  • 基于 Consumer 的治理策略。配置 User 的流量流出規(guī)則, User 路由到 Cart 時使用 User 的流量流出規(guī)則。

此外,使用這些治理策略時可以結(jié)合上面介紹的藍綠發(fā)布和灰度發(fā)布方案來實施真正的服務(wù)級別的版本發(fā)布。


3
?全鏈路灰度


繼續(xù)考慮上面微服務(wù)體系中對服務(wù) Cart 進行發(fā)布的場景,如果此時服務(wù) Order 也需要發(fā)布新版本,由于本次新功能涉及到服務(wù) Cart 和 Order 的共同變動,所以要求在灰度驗證時能夠使得灰度流量同時經(jīng)過服務(wù) Cart 和 Order 的灰度版本。如下圖:


按照上一小節(jié)提出的兩種治理策略,我們需要額外配置服務(wù) Order 的治理規(guī)則,確保來自灰度環(huán)境的服務(wù) Cart 的流量轉(zhuǎn)發(fā)至服務(wù) Order 的灰度版本。這樣的做法看似符合正常的操作邏輯,但在真實業(yè)務(wù)場景中,業(yè)務(wù)的微服務(wù)規(guī)模和數(shù)量遠超我們的例子,其中一條請求鏈路可能經(jīng)過數(shù)十個微服務(wù),新功能發(fā)布時也可能會涉及到多個微服務(wù)同時變更,并且業(yè)務(wù)的服務(wù)之間依賴錯綜復(fù)雜,頻繁的服務(wù)發(fā)布、以及服務(wù)多版本并行開發(fā)導(dǎo)致流量治理規(guī)則日益膨脹,給整個系統(tǒng)的維護性和穩(wěn)定性帶來了不利因素。


對于以上的問題,開發(fā)者結(jié)合實際業(yè)務(wù)場景和生產(chǎn)實踐經(jīng)驗,提出了一種端到端的灰度發(fā)布方案,即全鏈路灰度。全鏈路灰度治理策略主要專注于整個調(diào)用鏈,它不關(guān)心鏈路上經(jīng)過具體哪些微服務(wù),流量控制視角從服務(wù)轉(zhuǎn)移至請求鏈路上,僅需要少量的治理規(guī)則即可構(gòu)建出從網(wǎng)關(guān)到整個后端服務(wù)的多個流量隔離環(huán)境,有效保證了多個親密關(guān)系的服務(wù)順利安全發(fā)布以及服務(wù)多版本并行開發(fā),進一步促進業(yè)務(wù)的快速發(fā)展。

03

全鏈路灰度的解決方案

Cloud Native


如何在實際業(yè)務(wù)場景中去快速落地全鏈路灰度呢?目前,主要有兩種解決思路,基于物理環(huán)境隔離和基于邏輯環(huán)境隔離。

1
?物理環(huán)境隔離


物理環(huán)境隔離,顧名思義,通過增加機器的方式來搭建真正意義上的流量隔離。


這種方案需要為要灰度的服務(wù)搭建一套網(wǎng)絡(luò)隔離、資源獨立的環(huán)境,在其中部署服務(wù)的灰度版本。由于與正式環(huán)境隔離,正式環(huán)境中的其他服務(wù)無法訪問到需要灰度的服務(wù),所以需要在灰度環(huán)境中冗余部署這些線上服務(wù),以便整個調(diào)用鏈路正常進行流量轉(zhuǎn)發(fā)。此外,注冊中心等一些其他依賴的中間件組件也需要冗余部署在灰度環(huán)境中,保證微服務(wù)之間的可見性問題,確保獲取的節(jié)點 IP 地址只屬于當(dāng)前的網(wǎng)絡(luò)環(huán)境。


這個方案一般用于企業(yè)的測試、預(yù)發(fā)開發(fā)環(huán)境的搭建,對于線上灰度發(fā)布引流的場景來說其靈活性不夠。況且,微服務(wù)多版本的存在在微服務(wù)架構(gòu)中是家常便飯,需要為這些業(yè)務(wù)場景采用堆機器的方式來維護多套灰度環(huán)境。如果您的應(yīng)用數(shù)目過多的情況下,會造成運維、機器成本過大,成本和代價遠超收益;如果應(yīng)用數(shù)目很小,就兩三個應(yīng)用,這個方式還是很方便的,可以接受的。


2
?邏輯環(huán)境隔離


另一種方案是構(gòu)建邏輯上的環(huán)境隔離,我們只需部署服務(wù)的灰度版本,流量在調(diào)用鏈路上流轉(zhuǎn)時,由流經(jīng)的網(wǎng)關(guān)、各個中間件以及各個微服務(wù)來識別灰度流量,并動態(tài)轉(zhuǎn)發(fā)至對應(yīng)服務(wù)的灰度版本。如下圖:


上圖可以很好展示這種方案的效果,我們用不同的顏色來表示不同版本的灰度流量,可以看出無論是微服務(wù)網(wǎng)關(guān)還是微服務(wù)本身都需要識別流量,根據(jù)治理規(guī)則做出動態(tài)決策。當(dāng)服務(wù)版本發(fā)生變化時,這個調(diào)用鏈路的轉(zhuǎn)發(fā)也會實時改變。相比于利用機器搭建的灰度環(huán)境,這種方案不僅可以節(jié)省大量的機器成本和運維人力,而且可以幫助開發(fā)者實時快速的對線上流量進行精細化的全鏈路控制。


那么全鏈路灰度具體是如何實現(xiàn)呢?通過上面的討論,我們需要解決以下問題:

  1. 鏈路上各個組件和服務(wù)能夠根據(jù)請求流量特征進行動態(tài)路由
  2. 需要對服務(wù)下的所有節(jié)點進行分組,能夠區(qū)分版本
  1. 需要對流量進行灰度標(biāo)識、版本標(biāo)識
  2. 需要識別出不同版本的灰度流量

接下來,會介紹解決上述問題需要用到的技術(shù)。

標(biāo)簽路由


標(biāo)簽路由通過對服務(wù)下所有節(jié)點按照標(biāo)簽名和標(biāo)簽值不同進行分組,使得訂閱該服務(wù)節(jié)點信息的服務(wù)消費端可以按需訪問該服務(wù)的某個分組,即所有節(jié)點的一個子集。服務(wù)消費端可以使用服務(wù)提供者節(jié)點上的任何標(biāo)簽信息,根據(jù)所選標(biāo)簽的實際含義,消費端可以將標(biāo)簽路由應(yīng)用到更多的業(yè)務(wù)場景中。


節(jié)點打標(biāo)


那么如何給服務(wù)節(jié)點添加不同的標(biāo)簽?zāi)兀吭谌缃窕馃岬脑圃夹g(shù)推動下,大多數(shù)業(yè)務(wù)都在積極進行容器化改造之旅。這里,我就以容器化的應(yīng)用為例,介紹在使用 Kubernetes Service 作為服務(wù)發(fā)現(xiàn)和使用比較流行的 Nacos 注冊中心這兩種場景下如何對服務(wù) Workload 進行節(jié)點打標(biāo)。


在使用 Kubernetes Service 作為服務(wù)發(fā)現(xiàn)的業(yè)務(wù)系統(tǒng)中,服務(wù)提供者通過向 ApiServer 提交 Service 資源完成服務(wù)暴露,服務(wù)消費端監(jiān)聽與該 Service 資源下關(guān)聯(lián)的 Endpoint 資源,從 Endpoint 資源中獲取關(guān)聯(lián)的業(yè)務(wù) Pod 資源,讀取上面的 Labels 數(shù)據(jù)并作為該節(jié)點的元數(shù)據(jù)信息。所以,我們只要在業(yè)務(wù)應(yīng)用描述資源 Deployment 中的 Pod 模板中為節(jié)點添加標(biāo)簽即可。


在使用 Nacos 作為服務(wù)發(fā)現(xiàn)的業(yè)務(wù)系統(tǒng)中,一般是需要業(yè)務(wù)根據(jù)其使用的微服務(wù)框架來決定打標(biāo)方式。如果 Java 應(yīng)用使用的 Spring Cloud 微服務(wù)開發(fā)框架,我們可以為業(yè)務(wù)容器添加對應(yīng)的環(huán)境變量來完成標(biāo)簽的添加操作。比如我們希望為節(jié)點添加版本灰度標(biāo),那么為業(yè)務(wù)容器添加`spring.cloud.nacos.discovery.metadata.version=gray`,這樣框架向Nacos注冊該節(jié)點時會為其添加一個標(biāo)簽`verison=gray`。


流量染色


請求鏈路上各個組件如何識別出不同的灰度流量?答案就是流量染色,為請求流量添加不同灰度標(biāo)識來方便區(qū)分。我們可以在請求的源頭上對流量進行染色,前端在發(fā)起請求時根據(jù)用戶信息或者平臺信息的不同對流量進行打標(biāo)。如果前端無法做到,我們也可以在微服務(wù)網(wǎng)關(guān)上對匹配特定路由規(guī)則的請求動態(tài)添加流量標(biāo)識。此外,流量在鏈路中流經(jīng)灰度節(jié)點時,如果請求信息中不含有灰度標(biāo)識,需要自動為其染色,接下來流量就可以在后續(xù)的流轉(zhuǎn)過程中優(yōu)先訪問服務(wù)的灰度版本。

分布式鏈路追蹤


還有一個很重要的問題是如何保證灰度標(biāo)識能夠在鏈路中一直傳遞下去呢?如果在請求源頭染色,那么請求經(jīng)過網(wǎng)關(guān)時,網(wǎng)關(guān)作為代理會將請求原封不動的轉(zhuǎn)發(fā)給入口服務(wù),除非開發(fā)者在網(wǎng)關(guān)的路由策略中實施請求內(nèi)容修改策略。接著,請求流量會從入口服務(wù)開始調(diào)用下一個微服務(wù),會根據(jù)業(yè)務(wù)代碼邏輯形成新的調(diào)用請求,那么我們?nèi)绾螌⒒叶葮?biāo)識添加到這個新的調(diào)用請求,從而可以在鏈路中傳遞下去呢?

從單體架構(gòu)演進到分布式微服務(wù)架構(gòu),服務(wù)之間調(diào)用從同一個線程中方法調(diào)用變?yōu)閺谋镜剡M程的服務(wù)調(diào)用遠端進程中服務(wù),并且遠端服務(wù)可能以多副本形式部署,以至于一條請求流經(jīng)的節(jié)點是不可預(yù)知的、不確定的,而且其中每一跳的調(diào)用都有可能因為網(wǎng)絡(luò)故障或服務(wù)故障而出錯。分布式鏈路追蹤技術(shù)對大型分布式系統(tǒng)中請求調(diào)用鏈路進行詳細記錄,核心思想就是通過一個全局唯一的 traceid 和每一條的 spanid 來記錄請求鏈路所經(jīng)過的節(jié)點以及請求耗時,其中 traceid 是需要整個鏈路傳遞的。


借助于分布式鏈路追蹤思想,我們也可以傳遞一些自定義信息,比如灰度標(biāo)識。業(yè)界常見的分布式鏈路追蹤產(chǎn)品都支持鏈路傳遞用戶自定義的數(shù)據(jù),其數(shù)據(jù)處理流程如下圖所示:


邏輯環(huán)境隔離——基于 SDK


上面我們詳細介紹了實現(xiàn)全鏈路灰度所需要的幾種技術(shù),如果想為現(xiàn)有的業(yè)務(wù)接入全鏈路灰度能力,不可避免的需要為業(yè)務(wù)使用的開發(fā)框架 SDK 進行改造。首先,需要支持動態(tài)路由功能,對于 Spring Cloud、Dubbo 開發(fā)框架,可以對出口流量實現(xiàn)自定義 Filter,在該 Filter 中完成流量識別以及標(biāo)簽路由。同時需要借助分布式鏈路追蹤技術(shù)完成流量標(biāo)識鏈路傳遞以及流量自動染色。此外,需要引入一個中心化的流量治理平臺,方便各個業(yè)務(wù)線的開發(fā)者定義自己的全鏈路灰度規(guī)則。基于 SDK 實現(xiàn)方式的圖例如下:


邏輯環(huán)境隔離——基于 Java Agent


基于 SDK 方式的弊端在于需要業(yè)務(wù)進行 SDK 版本升級,甚至?xí)婕暗綐I(yè)務(wù)代碼的變動。企業(yè)內(nèi)部各個微服務(wù)雖然使用同一種開發(fā)框架,但很難保證框架版本是一致的,所以不得不為每一個版本維護一份全鏈路灰度的代碼。業(yè)務(wù)代碼與 SDK 代碼緊耦合,SDK 版本迭代會觸發(fā)業(yè)務(wù)不必要的發(fā)版變更,對業(yè)務(wù)的侵入性比較強。


另一種比較流行的方式是基于字節(jié)碼增強技術(shù)在編譯時對開發(fā)框架進行功能拓展,這種方案業(yè)務(wù)無感知,以無侵入方式為業(yè)務(wù)引入全鏈路灰度能力?;?Java Agent 的實現(xiàn)方式的圖例如下:


但仍然無法避免是開發(fā)者需要為業(yè)務(wù)使用版本不一致的開發(fā)框架維護對應(yīng)的 Java Agent 的版本。如果您比較傾向于這種無侵入的方案但又不想自己來維護,您可以選擇阿里云 MSE 服務(wù)治理產(chǎn)品,該產(chǎn)品就是一款基于 Java Agent 實現(xiàn)的無侵入式企業(yè)生產(chǎn)級服務(wù)治理產(chǎn)品,您不需要修改任何一行業(yè)務(wù)代碼,即可擁有不限于全鏈路灰度的治理能力,并且支持近 5 年內(nèi)所有的 Spring Boot、Spring Cloud 和 Dubbo。


邏輯環(huán)境隔離——基于 Service Mesh


在業(yè)務(wù)系統(tǒng)的微服務(wù)架構(gòu)中,如果存在大量使用不同的技術(shù)棧、語言棧的微服務(wù),Java Agent 的方式就無能為力了。我們可能需要為每一個語言的 SDK 編寫和維護全鏈路灰度代碼,不僅需要不同語言棧的開發(fā)者,而且涉及到語言無關(guān)的 bug 修復(fù)時需要全語言版本的 SDK 共同升級,這種代價不見得比基于物理環(huán)境隔離方案小。


那有沒有一種與語言無關(guān)的方案呢?有,下一代微服務(wù)架構(gòu)服務(wù)網(wǎng)格,Service Mesh。它將分布式服務(wù)的通信層抽象為單獨的一層,在這一層中實現(xiàn)負載均衡、服務(wù)發(fā)現(xiàn)、認證授權(quán)、監(jiān)控追蹤、流量控制等分布式系統(tǒng)所需要的功能。顯然,我們所需的全鏈路灰度能力也可以在這個流量治理基礎(chǔ)設(shè)施層來實現(xiàn)。幸運的是,服務(wù)網(wǎng)格明星產(chǎn)品Istio以聲明式 API 資源對流量治理進行了統(tǒng)一抽象,借助于 VirtualService 和 DestinationRule 治理規(guī)則可以很容易實現(xiàn)全鏈路灰度的效果,并且Istio集成了各種主流的分布式鏈路追蹤框架?;?Service Mesh 的實現(xiàn)方式的圖例如下:


在實際生產(chǎn)環(huán)境中,服務(wù)多版本并行開發(fā)是很常見的事情,而且版本迭代速度非??臁0姹久看巫兏夹枰薷?VirtualSerivice 資源中路由匹配規(guī)則,另外 VirtualSerivice 資源中并沒有提供容災(zāi)能力。比如存在一條路由規(guī)則訪問服務(wù)提供方的某個灰度版本,如果目標(biāo)服務(wù)不存在該灰度版本或者不可用,按照目前 Istio 的實現(xiàn)是仍然將流量轉(zhuǎn)發(fā)至該版本,缺乏容災(zāi)機制。還有一種業(yè)務(wù)場景,如果我們希望對處于一定 UID 范圍的用戶流量轉(zhuǎn)發(fā)指定灰度環(huán)境,是無法通過 Istio 現(xiàn)有的流量治理規(guī)則實現(xiàn)的。此時,您可以選擇阿里云服務(wù)網(wǎng)格產(chǎn)品 ASM,是一個統(tǒng)一管理微服務(wù)應(yīng)用流量、兼容 Istio 的托管式平臺。ASM 針對上述兩個場景都有應(yīng)對方案,輕松解決您在多語言場景下的全鏈路灰度訴求。


三種方式對比


下表是三種方式對比,從多個方面進行了對比。


  • 如果您傾向于使用無侵入式的 Java Agent 的方式,但又擔(dān)心自建帶來的穩(wěn)定性問題,您可以選擇 MSE 微服務(wù)治理產(chǎn)品,該產(chǎn)品是阿里巴巴內(nèi)部多年在微服務(wù)治理領(lǐng)域的沉淀的產(chǎn)出,經(jīng)歷了各種大促考驗。

  • 如果您傾向于使用語言無關(guān)、無侵入式的 Service Mesh 的方式,但又擔(dān)心自建帶來的穩(wěn)定性問題,您可以選擇阿里云 ASM 產(chǎn)品,相比開源 Istio,在功能性、穩(wěn)定性和安全性都有很大的提升。

3
?流量入口:網(wǎng)關(guān)



在分布式應(yīng)用中,作為流量入口的網(wǎng)關(guān)是不可或缺的。在全鏈路灰度場景中,就要求微服務(wù)網(wǎng)關(guān)具備豐富的流量治理能力,支持服務(wù)多版本路由,支持對特定路由規(guī)則上的請求進行動態(tài)打標(biāo)。對于入口服務(wù)可見性問題,網(wǎng)關(guān)需要支持多種服務(wù)發(fā)現(xiàn)方式。安全性問題上,網(wǎng)關(guān)作為集群對外的入口可以對所有請求流量進行認證鑒權(quán),保障業(yè)務(wù)系統(tǒng)不被非法流量入侵。


在虛擬化時期的微服務(wù)架構(gòu)下,業(yè)務(wù)通常采用流量網(wǎng)關(guān) + 微服務(wù)網(wǎng)關(guān)的兩層架構(gòu),流量網(wǎng)關(guān)負責(zé)南北向流量調(diào)度和安全防護,微服務(wù)網(wǎng)關(guān)負責(zé)東西向流量調(diào)度和服務(wù)治理。在容器和 K8s 主導(dǎo)的云原生時代,Ingress 成為 K8s 生態(tài)的網(wǎng)關(guān)標(biāo)準(zhǔn),賦予了網(wǎng)關(guān)新的使命,使得流量網(wǎng)關(guān) + 微服務(wù)網(wǎng)關(guān)合二為一成為可能。阿里云 MSE 發(fā)布的云原生網(wǎng)關(guān)在能力不打折的情況下,將兩層網(wǎng)關(guān)變?yōu)橐粚樱粌H可以節(jié)省 50% 的資源成本,還可以降低運維及使用成本。最重要的是,云原生網(wǎng)關(guān)支持與后端微服務(wù)治理聯(lián)動實現(xiàn)端到端的全鏈路灰度。


04

從 0 到 1 實踐全鏈路灰度

Cloud Native


看到這里,相信大多數(shù)讀者對全鏈路灰度有了大概的認識,也了解了幾種解決方案以及實現(xiàn)細節(jié)。接下來,我們會基于文中提到的 MSE 云原生網(wǎng)關(guān)和 MSE 服務(wù)治理產(chǎn)品,從 0 到 1 對全鏈路灰度進行實踐,一方面加深對全鏈路灰度的認識,另一方面可以了解下阿里云是如何將阿里巴巴內(nèi)部的最佳實踐輸出到云產(chǎn)品中。


我們假設(shè)應(yīng)用的架構(gòu)由 MSE 云原生網(wǎng)關(guān)以及后端的微服務(wù)架構(gòu)(Spring Cloud)來組成,后端調(diào)用鏈路有 3 跳,購物車(a),交易中心(b),庫存中心(c),通過客戶端或者是 H5 頁面來訪問后端服務(wù),它們通過 Nacos 注冊中心做服務(wù)發(fā)現(xiàn)?,F(xiàn)在希望使用全鏈路灰度能力構(gòu)建一個灰度環(huán)境,方便對服務(wù) A 和服務(wù) C 同時進行灰度驗證。


1
?前提條件


必備的資源列表


  • 已擁有一個 MSE 云原生網(wǎng)關(guān)
  • 已擁有一個 MSE Nacos 注冊中心
  • 已擁有一個 ACK 運維集群
  • 已開通 MSE 微服務(wù)治理專業(yè)版

部署 Demo 應(yīng)用程序


將下面的文件保存到 ingress-gray.yaml 中,并執(zhí)行 kubectl apply -f ingress-gray.yaml 以部署應(yīng)用,這里我們將要部署 A,B,C 三個應(yīng)用,A 和 C 應(yīng)用分別部署一個基線版本和一個灰度版本,B 應(yīng)用部署一個基線版本。


有以下注意點:

  1. 全鏈路灰度能力是與注冊中心無關(guān)的,本文用例暫以 MSE Nacos 作為注冊中心,所以需要將 spring.cloud.nacos.discovery.server-addr 換成業(yè)務(wù)自己的 Nacos 注冊中心地址

  2. 接入云原生網(wǎng)關(guān)的服務(wù),如果需要使用灰度發(fā)布,需要在發(fā)布服務(wù)時在元數(shù)據(jù)信息增加版本標(biāo)。在我們的例子,服務(wù) A 是需要暴露給網(wǎng)關(guān),所以發(fā)布時為基線版本添加spring.cloud.nacos.discovery.metadata.version=base,為灰度版本添加 spring.cloud.nacos.discovery.metadata.version=gray。

# A 應(yīng)用 base 版本---apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-a  name: spring-cloud-aspec:  replicas: 2  selector:    matchLabels:      app: spring-cloud-a  template:    metadata:      annotations:        msePilotCreateAppName: spring-cloud-a      labels:        app: spring-cloud-a    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-1.8-openjdk/jre        - name: spring.cloud.nacos.discovery.server-addr          value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848        - name: spring.cloud.nacos.discovery.metadata.version          value: base        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT        imagePullPolicy: Always        name: spring-cloud-a        ports:        - containerPort: 20001          protocol: TCP        resources:          requests:            cpu: 250m            memory: 512Mi      # A 應(yīng)用 gray 版本---            apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-a-new  name: spring-cloud-a-newspec:  replicas: 2  selector:    matchLabels:      app: spring-cloud-a-new  strategy:  template:    metadata:      annotations:        alicloud.service.tag: gray        msePilotCreateAppName: spring-cloud-a      labels:        app: spring-cloud-a-new    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-1.8-openjdk/jre        - name: profiler.micro.service.tag.trace.enable          value: "true"        - name: spring.cloud.nacos.discovery.server-addr          value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848        - name: spring.cloud.nacos.discovery.metadata.version          value: gray        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-a:0.1-SNAPSHOT        imagePullPolicy: Always        name: spring-cloud-a-new        ports:        - containerPort: 20001          protocol: TCP        resources:          requests:            cpu: 250m            memory: 512Mi            # B 應(yīng)用 base 版本---apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-b  name: spring-cloud-bspec:  replicas: 2  selector:    matchLabels:      app: spring-cloud-b  strategy:  template:    metadata:      annotations:        msePilotCreateAppName: spring-cloud-b      labels:        app: spring-cloud-b    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-1.8-openjdk/jre        - name: spring.cloud.nacos.discovery.server-addr          value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-b:0.2-demo-SNAPSHOT         imagePullPolicy: Always        name: spring-cloud-b        ports:        - containerPort: 8080          protocol: TCP        resources:          requests:            cpu: 250m            memory: 512Mi            # C 應(yīng)用 base 版本---apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-c  name: spring-cloud-cspec:  replicas: 2  selector:    matchLabels:      app: spring-cloud-c  template:    metadata:      annotations:        msePilotCreateAppName: spring-cloud-c      labels:        app: spring-cloud-c    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-1.8-openjdk/jre        - name: spring.cloud.nacos.discovery.server-addr          value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.2-demo-SNAPSHOT        imagePullPolicy: Always        name: spring-cloud-c        ports:        - containerPort: 8080          protocol: TCP        resources:          requests:            cpu: 250m            memory: 512Mi            # C 應(yīng)用 gray 版本---apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: spring-cloud-c-new  name: spring-cloud-c-newspec:  replicas: 2  selector:    matchLabels:      app: spring-cloud-c-new  template:    metadata:      annotations:        alicloud.service.tag: gray        msePilotCreateAppName: spring-cloud-c      labels:        app: spring-cloud-c-new    spec:      containers:      - env:        - name: LANG          value: C.UTF-8        - name: JAVA_HOME          value: /usr/lib/jvm/java-1.8-openjdk/jre        - name: spring.cloud.nacos.discovery.server-addr          value: mse-455e0c20-nacos-ans.mse.aliyuncs.com:8848        image: registry.cn-shanghai.aliyuncs.com/yizhan/spring-cloud-c:0.2-demo-SNAPSHOT        imagePullPolicy: Always        name: spring-cloud-c-new        ports:        - containerPort: 8080          protocol: TCP        resources:          requests:            cpu: 250m            memory: 512Mi

完成云原生網(wǎng)關(guān)初步配置


第一步,為云原生網(wǎng)關(guān)添加 Nacos 服務(wù)來源,服務(wù)管理,來源管理,點擊創(chuàng)建來源,


選擇 MSE Nacos 服務(wù)來源,選擇需要關(guān)聯(lián)的 Nacos 注冊中心,點擊確定。


第二步,導(dǎo)入要通過云原生網(wǎng)關(guān)暴露給外部的服務(wù)。選擇服務(wù)管理,服務(wù)列表,點擊創(chuàng)建服務(wù)。

選擇服務(wù)來源為 MSE Nacos,選擇服務(wù) sc-A。


點擊服務(wù) A 的策略配置,為入口服務(wù) A 創(chuàng)建多版本,版本劃分依據(jù)服務(wù)注冊時所帶的元數(shù)據(jù)信息 version(注意,這里可以是任意可以區(qū)分服務(wù)版本的標(biāo)簽值,取決于用戶注冊服務(wù)時所采用的元數(shù)據(jù)信息),創(chuàng)建以下兩個版本 base 和 gray。



2
?路由配置


創(chuàng)建基線環(huán)境的路由匹配規(guī)則,關(guān)聯(lián)域名 base.example.com,路由到服務(wù) sc-A 的 base 版本中。


創(chuàng)建灰度環(huán)境的路由匹配規(guī)則,關(guān)聯(lián)的域名與基線環(huán)境保持一致,注意此處增加了請求頭相關(guān)的配置,并且路由的目標(biāo)服務(wù)為服務(wù) sc-A 的 gray 版本。


這時,我們有了如下兩條路由規(guī)則,


此時,訪問?base.example.com?路由到基線環(huán)境

curl -H "Host: base.example.com" http://118.31.118.69/aA[172.21.240.105] -> B[172.21.240.106] -> C[172.21.240.46]

如何訪問灰度環(huán)境呢?只需要在請求中增加一個 header x-mse-tag: gray 即可。

curl -H "Host: base.example.com" -H "x-mse-tag: gray" http://118.31.118.69/aAgray[172.21.240.44] -> B[172.21.240.146] -> Cgray[172.21.240.147]

可以看到 云原生網(wǎng)關(guān) 將灰度流量路由到了 A 和 C 的灰度版本,由于B沒有指定的灰度版本,所以流量自動回退到基線版本。

3
?分析


從上面可以看出,我們只需要開通 MSE 微服務(wù)治理專業(yè)版,在云原生網(wǎng)關(guān)配置入口服務(wù)的路由規(guī)則,并且對入口流量進行灰度染色,即可滿足我們對 A 和?C 全鏈路灰度的要求。另外還有一個很重要的點是,業(yè)務(wù)需要自行對節(jié)點打標(biāo)并對入口服務(wù)開啟鏈路傳遞。為 Pod 模板的 Annotations添加 alicloud.service.tag 鍵值對完成節(jié)點打標(biāo),Java Agent 會在業(yè)務(wù)向注冊中心時登記節(jié)點時自動為其添加這個元數(shù)據(jù)信息,同時需要為入口服務(wù)的業(yè)務(wù)容器添加環(huán)境變量 profiler.micro.service.tag.trace.enable=true 開啟鏈路傳遞灰度標(biāo)識。MSE 服務(wù)治理組件默認使用 x-mse-tag 來標(biāo)識流量,并在整個調(diào)用鏈路中傳遞。


另外,您可以設(shè)置其他自定義或業(yè)務(wù)已有的字段來標(biāo)識流量,更多詳情操作、場景展示參考文檔:
https://help.aliyun.com/document_detail/359851.html


05

總結(jié)

Cloud Native


本文從單體架構(gòu)向微服務(wù)架構(gòu)演進過程中帶來的挑戰(zhàn)展開,著重對其子領(lǐng)域服務(wù)發(fā)布在單體架構(gòu)和微服務(wù)架構(gòu)體系下的形態(tài)進行分析,引出了分布式應(yīng)用場景中特有的全鏈路灰度問題。針對業(yè)務(wù)對全鏈路能力的要求,介紹了基于物理環(huán)境隔離和基于邏輯環(huán)境隔離兩種方案,其中對基于邏輯環(huán)境隔離方案進行詳細分析,對涉及到的各個技術(shù)點也進行了很好的解釋,接著提出了三種基于邏輯環(huán)境隔離的落地方案,并進行了簡單的對比分析,最后引出了阿里云 MSE 云原生、MSE 服務(wù)治理和服務(wù)網(wǎng)格 ASM 是如何提供不限于全鏈路灰度的流量治理能力。


瀏覽 72
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲中文字幕视频在线观看| 亚洲黄色大片| 囯产精品久久久久久久久久辛辛 | 亚洲a在线观看| 丁香五月天啪啪| 国产v欧美| 欧美一区二区三区成人| 欧美在线观看一区| 色五月激情五月| 国产精品国产三级国产专业不 | 国产成人亚洲精品| 二区三区在线观看| 国产精品久久久久久久免牛肉蒲| 国产激情视频在线观看| 国产免费一区| 特级西西444www精品视频| 爱逼AV| www超碰在线| 欧美一级片免费观看| 日美女网站| 男人的天堂在线播放| 国产真实乱婬A片久久久老牛| 国产一区二区电影| 91av在线免费观看| 狠狠干| 欧美日屄视频| 男人天堂手机在线| 成人精品免费视频| 中文字幕视频2023| 北京熟妇搡BBBB搡BBBB电影| 免费一级大片| 国产精品国产精品国产专区不卡| 高清无码一区| 欧美成人免费在线| 亚州无码一区| 天天操网站| 欧美自拍性爱视频| 欧美精品一卡二卡| 日韩在线视频网| 国产成人无码一区二区在线观看 | 亚洲AV无码高清| 18禁AV在线| 亚洲A片V一区二区三区| 秋霞午夜| 中文无码在线播放| av色在线| 欧美一区二区三区系列电影| 国产xxxx视频| 谁有毛片网站| 九九色九九| 996热| 欧美成人色| 久久人视频| 欧美黄片一区| 俺去俺来也www色视频| 操一线天逼| 69色综合| 色欲成人AV| 日本视频一区二区三区| 成人在线18禁| 日韩超碰在线| 俺也去色色| 亚洲成人AAAAA| 人妻丰满熟妇av无码区| 久久久久久久性爱| 3d动漫一区二区| 成人精品视频在线| 在线一级A片| 色综合激情| 青草网| 成人一级黄色片| ThePorn日本无码| 久久嫩草精品久久久久精| 亚洲专区区免费| 亲子乱一区二区三区视频| 国外亚洲成AV人片在线观看 | 在线播放91灌醉迷J高跟美女| 中文字幕日韩电影| 91精品婷婷国产| 男人天堂免费视频| 一区二区三区在线观看视频| 大香蕉中文视频| 中文字幕av一区二区| 爽好紧别夹喷水无码| 黄色网址在线观看视频| 婷婷社区五月天| 加勒比黑人和翔田千里在线播放 | 免费高清无码| 色婷婷大香蕉| 又爽又黄免费网站97双女| 国产啊啊啊啊| 久久久久久亚洲精品| A级免费毛片| 大香蕉国产视频| 国产在线播放av| 免费观看av| 竹菊av一区二区三区四区五区 | 午夜福利sw| 18岁成人毛片| 久精品视频| a片在线免费播放| 超碰在线观看91| 成人高清在线| 九九九久久久| 欧美XX888做受| 国产黄色在线免费观看| 成人视频黄片| 香蕉视频在线看| 国产黄色直播| 另类老妇videos另类| 3D动漫精品啪啪一区二区| 久久久五月| 操逼网站大全| 四川性BBB搡BBB爽爽爽小说| seseav| 国产香蕉AV| 五月天久久久| 五月天综合在线| 91伊人网| 在线无码中文字幕| 91久久爽久久爽爽久久片| 大香蕉com| 啪啪啪啪网站| 一级性爽AV毛片| 殴美亚洲一流| 天天操电影| 婷婷五月天色| 高潮流水视频| 乱伦a片| 精品国产黄色| 麻豆蜜桃91无码| 久久久久久亚洲AV无码专区| 在线伊人网| 伊人大香蕉综合| 中文字幕亚洲视频在线观看| 全部视频午夜寂寞| 蜜桃网站在线观看| 黄片中文| 亚洲激情AV| 一个人看的www日本高清视频| 日韩中文字幕视频| 黄色国产AV| 欧美激情性爱网站| 91精品久久久久久粉嫩| 亚洲黑人av| 大色欧美| 人人干人人干人人干| 麻豆国产成人AV一区二区三区| 国产欧美日韩| 成人三级片网| 久久性爱视频| 久久婷婷亚洲| 水蜜桃一区二区三区| 狠狠狠狠狠| 成人无码电影在线观看| 天天插综合| 国产天堂在线| 日韩免费视频一区| 日韩人妻无码一区二区三区七区| 日本成人久久| 精品三级在线观看| 久久精彩偷拍视频| 精品乱子伦一区二区三区免费播放| 毛片A片免费看| 日本无码一区二区三三| 豆花av在线| 日韩一区二区在线看在线看| 国内操逼视频| 日本在线视频一区二区| 九色丨蝌蚪丨老版熟女| 91精品人妻| 日韩AV中文字幕在线| 人人摸人人爱人人操| 91丨九色丨熟女老版| ChineSe露脸老女人| 国产人与禽zoz0性伦| 韩国精品无码一区二区三区18| 波多野结衣一级| 久久嫩草精品| 91在线资源| 日韩啪| 伊人大香在线| 熟妇人妻久久中文字幕| 日韩视频免费| 日韩一级片在线播放| 蜜臀av网站| 亚洲精品视频在线观看网站| 色色五月天婷婷| 亚洲.无码.制服.日韩.中文字幕| 四虎影院中文字幕| 午夜福利大片| 中文字幕15页| 日韩福利一区| 91吊逼| 天a堂8在线www| 看毛片网址| 国产激情在线| 91大屁股| 人妻无码一区二区三区免费| 欧美激情综合色综合啪啪五月| 久久久久久久97| 久久综合无码内射国产| 丁香婷婷久久久综合精品国产| 五月开心婷婷| 网站毛片| 中文字幕在线观看有码| a√在线视频| 精品福利在线观看| 中国老熟女重囗味HDXX| 91毛片在线观看| 人成在线视频| 无套内射免费视频| 黑人内射人妖| 欧美色交| 99热91| 亚洲人操逼视频| 日韩视频一级| 国产在线成人| 亚洲成人Av| 国产资源AV| 丁香激情综合| 狠狠色婷婷7777| 日本操b| 黄色视频导航| 国产成人电影一区二区| 黑人干亚洲| 国产中文在线| 少妇毛片| 日本爱爱视频免费| 欧美色噜噜| 免费视频A| 在线看v片| 国精产品一区二区三区在线观看| 开心激情站| 无码专区一区二区三区| 大香伊人中文字幕精品| 不卡三区| 午夜黄色大片| 成人av免费观看| 婷婷网五月天| 日韩在线观看免| 欧美激情xxx| 免费看一级高潮毛片| 操逼视频免费| 中国老熟妇| 久久这里只有| 人妻视频网站| 婷婷五月天av| 日韩午夜福利视频| 夜夜高潮夜夜爽| 超级人人操| 另类老太婆性BBWBBw| XXXXⅩHD亚洲人HD| 超碰人| 在线观看日韩精品| 欧亚一区二区| 91丨精品丨国产丨丝袜| 亚洲插逼视频| 欧美老妇大BBBBXXXX| 久操精品视频| 尤物综合网| 亚洲北条麻妃一级A片| 成人午夜A片| 怡春院熟女精品AV| 中文字幕韩日| 先锋影音资源站av每日资源在线| 激情日逼| 久久久999精品视频| 久久人妻无码中文字幕系列| 午夜福利啪啪啪| 久久久久久久久久国产精品免费观看-百度 | 91精品人妻一区二区三区四区| 蝌蚪窝在线视频观看| 欧美足交视频| 99热99re6国产线播放| 日本一区中文字幕| 最近最火中文字幕mv歌词| 一级真人毛片| 免费在线亚洲| 日韩在线观看中文字幕| 少妇探花| 天天日狠狠操| 五月天综合| 99热er| 青春草在线视频观看| 性无码一区二区三区无码免费| 日韩一级在线播放| 亚洲国产成人电影| 99精品无码| 亚洲成人性爱网| 18禁日韩| 免费看成人747474九号视频在线观看| 国产精品久久久久久久久久| 欧美日韩逼| 丁香五月天色婷婷| 日韩精品免费一区二区在线观看| 玖玖资源在线观看| 欧美成在线视频| 免费啪啪网| 一级片成人| a片在线视频| 五月综合久久| 大香蕉97| 翔田千里无码流出两部| 欧美性爱免费在线视频| 日韩字幕无码| 国产AⅤ无码一区二区| 亚洲天堂在线看| 性一区| 人妻操| 在线免费看av| 一级片在线播放| 日日免费视频| AV大片免费看| 色婷婷五月天激情| 中文字幕在线国产| 久久午夜无码鲁丝片午夜精| 国产精品无码在线观看| 人人操人人爱人人拍| 91人妻日韩人妻无码专区精品 | 天天日天天操天天干| AV在线天堂| 中文字幕韩日| 精精国产| AV无码一区二区三区| 日韩无码不卡视频| 尤物视频在线| 国产A区| а√天堂中文最新版8| 亚洲人人爱| 久久大香蕉网| 超碰在线观看99| 伊人成人电影| 欧美成人A级片| 91亚洲精品国产成人| 欧美精品一卡二卡| 久草超碰在线| 伊人黄色| 毛片一区| 成人午夜无码| 男人的天堂婷婷| A片在线观看网站| 五月丁香999| 操逼一区二区| 国产AV日韩| 日韩无码2024| 色五月激情网| 日韩无码首页| 初学影院WWWBD英语完整版在线观看 | 久久久久久久免费| 婷婷成人电影| 国内自拍激情视频| 国产真实乱婬A片久久久老牛| www.婷婷六月天| 国产ts在线| 午夜福利影院在线| 乱伦内射视频| 日韩欧美中文| 特黄AAAAAAAA片视频| 日本一级婬片A片免费播放一| 欧美第一色| 亚洲一级黄色| 日韩亚洲中文在线| 久草网视频| 92久久| 国产高清视频在线| 成人在线三级| 26uuu亚洲| 亚洲在线视频观看| 9l人人澡人人妻人人精品| 黄网站在线播放| 爽好紧别夹喷水网站| 国产免费成人在线观看| 在线亚洲色图| 国产成人99久久亚洲综合精品| 黑人AV在线播放| 搡老熟女-91Porn| 一级黄色视频网站| 亚洲欧美在线一区| 三级片高清无码| 日韩精品免费| 亚洲成人黄色在线| 五月琪琪| 亚洲精品99| 国产有码在线观看| 国产116页| 成人网肏逼视频| 熟女少妇一区二区| 麻豆人妻换人妻好紧| 国产女主播在线播放| 日韩性爱在线观看| 蜜臀久久99精品久久久晴天影视 | 欧美亚洲成人在线观看| 欧美视频精品| 日韩av电影免费在线观看| 黄色免费在线观看| 男女拍拍视频| A片在线观看网站| 亚洲香蕉在线| 不卡无码免费视频| 99免费观看视频| 国产剧情一区二区av在线观看| 欧美在线视频网| 中文字幕人妻无码| 91麻豆成人精品国产| 亚洲欧美日本在线观看| 国产狂喷水潮免费网站www| 亚洲在线成人视频| 一区视频| 国产热| 爱爱91| 国产一级片无码| 男人的天堂2019| 爱爱日韩| 777久久久| 97性爱视频| 91欧美视频| 色狠狠干| 古装一级无遮挡A片| 午夜AV在线播放| av五月| 日韩人妻无码一区二区三区中文 | 久久无码高清| 亚洲精品色色| 亚洲无码在线视频播放| 狠狠AV| 日韩啪| 黄色插逼视频| 特级毛片WWW| 好逼123| 欧美午夜在线| 亚洲香蕉国产| 黄色美女视频网站| 亚洲国产色婷婷| 俺也去在线视频| 精品三级网站| 九九热在线视频| 影音先锋成人AV资源| 免费无码高清| 成人日皮视频| 中文字幕码精品视频网站| 免费国产三级片| 加勒比日日综合| 国产97在线观看| 久久久无码精品亚洲日韩男男| 欧美一级aaa| 一牛影视精品av| 久久亚洲AV| 日韩无码一二三区| 91人妻人人操| 色老板在线免费观看| 国产AV日韩AⅤ亚洲AV中文| 黄色一级在线观看| 精品久久久无码| 激情操逼| www.三级片| 欧美狼友| 欧洲一区二区三区| 欧美日韩视频一区二区| 国产一区不卡| 大骚逼影院| 亚洲美女网站在线观看| 日韩欧美A片| 97超碰在线视| 国产TS丝袜人妖系列视频| 国产免费www| aa人人操夜夜操人人| 无码操逼视频| 伊人伊人网| 嘿咻无码推油| 日韩精品一级| 中文字幕国产在线观看| 免费在线观看黄片| 国产精品1区2区| 日本亚洲精品秘入口A片| 亚洲无码高清在线观看| 俺去俺来WWW色官方| 国产欧美精品一区二区三区| 精品国产国产没封| 男女免费av| 久久久久久亚洲| 一区二区三区无码高清| 亚洲一级一级黄色| 伊人中文字幕| 成人大香蕉网| 2019天天操| 人人摸人人爱| 免费乱伦视频| h片无码| 特级毛片AAAAAA蜜桃| 久射久| 亚洲区中文字幕| 精品多人P群无码视频| 国产高清视频在线| 欧美精品日韩在线观看| 亚洲婷婷综合网| 蜜桃av秘无码一区二区三| av中文字幕在线播放| 天天天天天天天天操| 青草视频在线观看免费| 在线观看免费黄色视频| 超碰在线人妻| 国产成人精品无码片区在线观91| 青草青视频| 欧美人妻日韩精品| 91官网在线观看| 法国《少女日记》电影| 国产午夜无码视频在线观看| 日本精品视频一区二区| 黄色大片av| 久久er| 99热这里只有精| 亚欧av无码| 欧美一级特黄A片免费看视频小说 东北嫖老熟女一区二区视频网站 国产丨熟女丨国产熟女视频 | 男女精品一区| 成人爱爱视频| 国产香蕉在线观看| 无码不卡av| 日韩性爱网址| 天天躁狠狠躁夜躁2024| 91人人妻| 2019天天干| 日韩美女免费视频| 欧美老妇另类BBwBBw| 亚洲AAAAAA| 天天拍天天干| 国产区av| 天天干天天舔| 天天日,天天干,天天操| 婷婷精品秘进入| 日韩成人在线视频| 人人操人人插| 成人网站毛片| 日韩中文无码字幕| 日韩在线91| 亚洲精品久久久久毛片A级牛奶| 日本韩国叼嘿片| 精品中文字幕在线观看| 欧美视频第一页| 91麻豆精品视频| 操B电影| 国产黄色Av| 国产高潮视频在线观看| 人人操碰成人网| 人妻少妇视频| 翔田千里无码XXXXXX| 亚洲色一区二区| 国产成人无码免费| 大学生一级特黄大片| 日韩A片免费观看| 国产精品操逼网站| 在线A∨视频| 大色欧美综合| 激情99| 爱爱黄色视频| AV大全在线观看| 国产成人精品一区二| 日韩A∨| 天堂a在线8| 动漫人物插画动漫人物的视频软件| 夜夜爽夜夜高潮夜夜爽| 久久伊人中文字幕| 亚洲天媒在线播放| 一区二区三区久久久| 一级片A片| 五月天黄色小说| 无码视频在线观看免费| v在线| 91人人妻人人澡人人爽人人| 日本视频一区二区三区| 久色悠悠| 中文解说AⅤ水果派| 无码内射在线播放| AV怡红院| 欧美黄页| 毛片网站免费| 亚洲先锋影音| 成人网站欧美| 久久成人无码| 五月婷在线观看| 精品国内视频| 欧美日韩综合网| 久久老女人| 免费看黄色毛片| 撸一撸av| 亲子伦一区二区三区观看方式| 国产网站视频| 九色91PORNY国产| 日韩欧美成人片| 久久久久久伊人| 182在线视频| 精品久久一区二区三区四区| 国产一区二区电影| 高清无码三级片在线观看| 日本视频一区二区| 日本国产在线观看| 亚洲成人观看| 激情五月天影院| 18禁亚洲| 日韩成人无码AV| 色婷婷无码| 日韩欧美综合| 天天躁狠狠躁夜躁2024| 大香焦草久| 天天综合网久久| 日韩色图在线观看| 婷婷亚洲国产| PORNY九色视频9l自拍| 在线观看小视频| 另类性爱视频| 久久久久一区| 国产精品主播| ThePorn人妻白浆| 欧美成人精品AAA| 大香蕉电影网| 五月无码视频| 成人777777| 亚洲天堂AV在线观看| 99国产精品久久久久久久成人| 亚洲操色| 特级毛片WWW| 成人AV免费在线观看| 一区二区三区日韩| 欧美亚洲色色网视频| 91一区二区在线观看| 欧美XX888做受| 北条麻妃在线一区二区| 一本色综合亚洲精品| 国产成人无码一区二区| 少妇特黄A一区二区三区| 亚洲高清中文字幕| 成人无码视频在线| 8x8拨牐拨牐拨牐永久免费| 人人人人人人操| 山西真实国产乱子伦| 中文字幕日韩视频| 久久婷婷国产| 午夜精品久久久久久久99老熟妇| 人人爱人人妻人人操| 欧美在线A片| 欧一美一婬一伦一区二区三区黑人-亚 | 亚洲精品视频无码| 久色性爱视频| 亚洲色成人中文字幕在线| 午夜8050| 91资源超碰| 天天干天天撸| 中文免费高清在线观看视频| 成人黄网站在线观看| 久久国产乱子伦精品免费午夜... 国产毛片精品一区二区色欲黄A片 | 91精品婷婷国产综合| 最近中文字幕在线中文字幕7| 亚洲视频免费播放| 丹麦电影《下午》| 日欧视频| 久操亚洲| 正在播放国产精品| 欧美三P囗交做爰| 香蕉国产AV| 亚洲一区二区视频在线观看| 波多野结衣无码在线视频| 四川少妇BBBB槡BBBB槡| 无码乱伦| 国产精品啪啪啪啪| 成人电影久久久| 久久草视频| 亚洲中文字幕人妻。| 综合合一品道| 欧美黄片免费在线观看| 日韩国产AV| 蜜桃视频免费网站| 99久久精品国产一区二区三区| 四川BBB搡BBB搡多人乱| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 免费av一区二区| 东京热久久综合| 久久久久久久91| 亚洲中文字幕第一页| 91麻豆国产福利在线观看| 国产精品粉嫩福利在线| 无码一卡| 亚洲小说图片AV在线| 亚洲Av秘无码一区二区| 巨爆乳肉感一区二区三区| xxx综合网| 成人操b视频| 国产精品午夜福利视频| 国产熟女视频| 久久久午夜| 色五月在线观看| www.俺去也| 亚洲欧美日韩在线| 伊人九九热| 日韩一级在线| 久久午夜无码人妻精品蜜桃冫| 久久国产综合| 国产午夜91人妻| 69久久久久| 亚洲性爱av| 中文字幕亚洲观看| 欧美VA视频| 婷婷综合网| 天天草天天草| 国产毛片基地| 91人妻日韩人妻无码专区精品| 在线a免费| 波多野结衣视频网站| 曰韩精品| 日韩在线精品| 亚洲色图一区二区| 欧美四虎| 欧美69视频| 好看的中文字幕av| 欧美综合精品| 天天干夜夜操熟女| 五月丁香激情婷婷| 天天色视频| 青青草狠狠干| 国产AV一级片| 97人人爽人人爽人人爽| 极品人妻疯狂3p超刺激| 2019狠狠操| 亚洲秘一区二区三区-精品亚洲二区- | 亚洲在线视频观看| 亚洲色图五月天| 青青草操逼视频| 国产一级黄色大片| 俺也干| 丁香视频在线观看| 七十路の高齡熟妇无码| 中日韩中文字幕一区二区区别| 久久久久电影| 麻豆成人无码| 手机在线观看av| 亚洲福利天堂| 久久综合五月天| 色999在线播放视频| a片视频网站| 不卡无码中文字幕一区| 成人片免费| 中文字幕高清免费看| 视色AV| 79色色| 一本色道无码人妻精品| av三级片在线观看| 蜜桃久久精品成人无码AV| 大香蕉性爱视频| 亚洲日韩在线看| 亚洲综合免费观看| 精品一区二区三区四区五区| 日韩一区二区无码| 免费日比视频| 中文字幕亚洲在线| 一区二区三区观看| 淫一区二区| 亚洲专区在线播放| 日韩性无码| 91久操| 91成人视频免费观看| 精品人妻中文字幕| 韩国三级HD久久精品| 国产视频一区二区三区四区| 大香蕉尹人视频| www99国产| 99热这里只有精品1| 免费高清无码视频在线观看| 亚洲AV中文| 久久成人福利| 北条麻妃一区二区三区-免费免费高清观看| 免费观看黄色视频网站| 特特级毛片| 亚洲清高毛无码毛片| 蜜桃91精品| 无码成人AV在线看免费| 熟妇女人妻丰满少妇中文字幕 | 国产精品v欧美精品v日韩精品| 欧美性猛交XXXX乱大交蜜桃| 久草综合网| 影音先锋成人在线| AV网站在线免费观看| 精品人妻一区二区乱码一区二区| 蜜桃精品在线观看| 香蕉视频日韩| 日韩视频播放在线综合| 亚洲久久久久久| 久久b| 日韩欧美亚洲| 亚洲乱伦中文字幕| 成人理论片| 91视频在线观看18| 亚洲va视频| 亚洲无码中文字幕在线| 中文字幕浅井香舞被黑人俘虏| 日本伊人大香蕉| 狠狠狠狠狠狠操| 免费成人黄视频| 精品综合网| 最近日本中文字幕中文翻译歌词| 亚洲丁香五月激情| 自拍AV在线| 日韩欧美在中文| 国产一级黄色毛片| 内射视频在线观看| 永久免费无码中文字幕| 一本色道无码人妻精品| 久久九九99| 色天堂网站| 亚洲精品国产AV婷婷| 中文字幕高清无码在线播放| 加勒比综合| 日韩无码字幕| 做a视频| 亚洲精品mv| 黄色小电影网站| 特级西西444www精品视频| 三级片AV在线| 日本a视频| 免费久久久| 加勒比操逼| 91人体视频| 欧美肏屄视频| 18国产免费视频在线观看| 人人爽人人操人人| 五月天色婷婷丁香| BBWBBw嫩| 久久18| 国产成人在线免费| 伊人婷婷大香蕉| 成人毛片一区二区三区| 亚洲A∨| 国产黄A片免费网站免费| 草B网| 亚洲AV图片| 久久99精品久久久久| 亚洲激情| 国产91无码精品秘入口新欢| 国产久久精品| 亚洲成人不卡| 免费A片在线| 久久精品水多多www| 亚洲无码第一页| 中文字幕精品亚洲熟女| www五月天| 国产资源AV| 中文字幕亚洲人妻| 天天干强奸视频在线综合| 18禁在线播放| 97人妻视频| 美日韩视频| 国产jizz| 亚洲无码在线观看网站| 91新婚人妻偷拍| 中文人妻av| 西西4444WWW无码视频| 波多野吉衣毛片| 国产又大又粗| AV网站在线免费观看| 在线播放国产精品| 三级黄,色| 干欧美女人| 国产A片免费视频| 精品福利导航| 国产精品美女毛片真酒店| 在线看国产| 天堂一区二区三区18| 成年人黄色视频网站| 久久av一区二区三区观看| 操15p| av在线资源网站| 日韩精品成人专区无码| 四虎在线观看| 色香蕉视频| 国产人人看| 免费无码国产| 免费A片观看| 日韩av中文字幕在线| 学生妹毛片视频| 无码AV网| 欧美福利在线观看| 影音先锋男人网| 女女久久| 午夜在线无码| www.91在线视频| 麻酥酥在线视频| 亚洲av二区| 国产成人综合亚洲| 免费在线国产| av大片在线观看| 日韩无码精品AV| 午夜精品久久久久久久久久久久| 无码中文暮| 中文字幕在线观看完整av| 亚洲日韩中文字幕| 免费无码视频| 成人国产精品秘在线看| 蜜桃91精品秘入口| av大香蕉| 中文字幕av高清片,中文在线观看| 欧美成人A片在线观看| 1插菊花综合网|