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

為故障而構(gòu)建:簡(jiǎn)化生產(chǎn)調(diào)試的最佳實(shí)踐

譯文 精選
開發(fā) 測(cè)試
應(yīng)用程序出錯(cuò)是在所難免的。盡管我們通過測(cè)試、質(zhì)量保證、持續(xù)集成和防御性編程盡可能減少錯(cuò)誤,但完全避免錯(cuò)誤的發(fā)生是不可能的。這篇文章介紹了如何在生產(chǎn)環(huán)境中構(gòu)建可靠的軟件系統(tǒng),避免因?yàn)楣收隙鴮?dǎo)致用戶體驗(yàn)下降或者損失數(shù)據(jù)。

譯者 | 劉汪洋

審校 | 重樓

很多年前,我在維護(hù)一個(gè)數(shù)據(jù)庫驅(qū)動(dòng)的系統(tǒng)時(shí)遇到了一個(gè)奇怪的生產(chǎn)環(huán)境的 bug。我讀取的列有一個(gè)空值,但是代碼中不允許這樣,而且也沒有地方可以讓這個(gè)值為空。數(shù)據(jù)庫嚴(yán)重?fù)p壞,我們沒有任何線索。雖然有日志,但是由于隱私問題,關(guān)鍵信息并未被打印出來。即使我們能打印,我們?cè)趺粗涝撜沂裁茨兀?/p>

應(yīng)用程序出錯(cuò)不可避免。我們努力減少出錯(cuò),但總是還會(huì)出錯(cuò)。我們還有另一項(xiàng)工作,它并未得到足夠的關(guān)注:故障分析。有一些最佳實(shí)踐和常見方法,最著名的就是日志記錄。我曾多次說過,日志其實(shí)是預(yù)知性的調(diào)試,但是我們?cè)撊绾蝿?chuàng)建一個(gè)更容易調(diào)試的應(yīng)用程序呢?

我們應(yīng)如何構(gòu)建系統(tǒng),以便當(dāng)它出現(xiàn)類似的錯(cuò)誤時(shí),我們能知道出了什么問題?

一個(gè)常見的理念是:“艱苦的準(zhǔn)備讓工作更輕松?!?在開發(fā)階段,我們面臨的挑戰(zhàn)可能更大,因?yàn)槲覀儫o法預(yù)見在生產(chǎn)過程中會(huì)遇到哪些問題。但是,這個(gè)階段的準(zhǔn)備工作也很有價(jià)值,因?yàn)槲覀冋跒樯a(chǎn)階段做準(zhǔn)備。

這種準(zhǔn)備超出了測(cè)試和質(zhì)量保證的范圍。它意味著我們需要為代碼和基礎(chǔ)設(shè)施在未來可能出現(xiàn)的問題做好準(zhǔn)備。到了出現(xiàn)問題的那一刻,測(cè)試和質(zhì)量保證就失效了。簡(jiǎn)單來說,這是一種對(duì)未知問題的預(yù)防措施。

失敗的定義

首先,我們需要明確什么是失敗。當(dāng)我提到生產(chǎn)環(huán)境中的失敗,人們往往會(huì)自動(dòng)聯(lián)想到系統(tǒng)崩潰、網(wǎng)站宕機(jī)或?yàn)?zāi)難級(jí)別的事件。然而,實(shí)際上,這些情況相對(duì)較少,大部分都由運(yùn)維人員和系統(tǒng)工程師處理。

當(dāng)我向開發(fā)人員詢問他們最近遇到的生產(chǎn)問題時(shí),他們通常會(huì)猶豫不決,甚至無法回憶起具體情況。然而在進(jìn)行更深入的交談和詢問后,開發(fā)者們回憶起了一個(gè)他們最近處理過的錯(cuò)誤。這個(gè)錯(cuò)誤的確是在生產(chǎn)環(huán)境中出現(xiàn)的,并且是由客戶報(bào)告的。他們必須在本地以某種方式復(fù)現(xiàn)它,或者審查信息來修復(fù)它。我們并不把這種錯(cuò)誤看作是生產(chǎn)錯(cuò)誤,但它們確實(shí)是。需要復(fù)現(xiàn)已經(jīng)在現(xiàn)實(shí)世界中發(fā)生的故障,這使我們的工作變得更困難。

如果我們能夠僅通過查看問題在生產(chǎn)環(huán)境中出現(xiàn)的方式就理解問題,那就太好了。

簡(jiǎn)潔性

簡(jiǎn)潔性非常顯而易見,但是在實(shí)際應(yīng)用中,人們對(duì)于簡(jiǎn)潔性的理解卻各不相同。簡(jiǎn)潔性是主觀的。以下哪段代碼更簡(jiǎn)單?

return obj.method(val).compare(otherObj.method(otherVal));

還是這段代碼更簡(jiǎn)單?

var resultA = obj.method(val);
var resultB = otherObj.method(otherVal);
return resultA.compare(resultB);

從代碼行數(shù)來看,第一個(gè)示例似乎更簡(jiǎn)單,而且許多開發(fā)人員確實(shí)會(huì)更喜歡那樣。但這可能是一個(gè)錯(cuò)誤。注意,第一個(gè)示例在一行中包含了多個(gè)可能出現(xiàn)故障的地方,對(duì)象可能無效,或者三個(gè)方法中的任何一個(gè)都可能會(huì)失敗。如果真的出現(xiàn)了故障,我們可能無法清晰地判斷具體是哪一部分出了問題。

此外,我們無法適當(dāng)?shù)赜涗浗Y(jié)果。我們無法輕易地對(duì)代碼進(jìn)行調(diào)試,因?yàn)檫@需要我們逐個(gè)進(jìn)入每一個(gè)方法進(jìn)行檢查。如果故障發(fā)生在方法內(nèi),堆棧跟蹤應(yīng)該會(huì)引導(dǎo)我們到正確的位置,甚至在第一個(gè)示例中也是如此。

試想一下,如果我們調(diào)用的方法改變了某個(gè)狀態(tài),那么obj.method(val)是否在otherObj.method(otherVal)之前被調(diào)用呢?

第二種方式寫代碼,可以很容易地看出方法的調(diào)用順序和結(jié)果。此外,我們還可以審查和記錄中間狀態(tài),即 resultA 和 resultB 的值。

我們來看一個(gè)常見的例子:

var result = list.stream()
                 .map(MyClass::convert)
                 .collect(Collectors.toList());

這是一段非常常見的代碼,與下面的代碼有相似之處:

var result = new ArrayList<OtherType>();
for(MyClass c: list) {
    result.add(c.convert());
}

從可調(diào)試性的角度看,這兩種方法都有其優(yōu)點(diǎn),我們的選擇可能會(huì)對(duì)代碼的長(zhǎng)期質(zhì)量產(chǎn)生重大影響。第一個(gè)示例中的一個(gè)微妙之處在于,返回的列表是不可修改的。這既是優(yōu)點(diǎn)也是問題。

當(dāng)我們?cè)噲D更改不可修改的列表時(shí),會(huì)在運(yùn)行時(shí)出現(xiàn)故障,這是一種潛在的風(fēng)險(xiǎn)。然而,故障的原因通常是明確的,我們可以清楚地知道什么導(dǎo)致了這個(gè)問題。

如果我們對(duì)第二個(gè)示例中的列表結(jié)果進(jìn)行更改,可能會(huì)引發(fā)一系列問題。然而,只要這些問題在生產(chǎn)環(huán)境中沒有導(dǎo)致故障,我們就可以視為問題已經(jīng)被解決。

那么,我們應(yīng)該選擇哪個(gè)呢?

通過只讀列表可以實(shí)現(xiàn)快速失敗的原則,這對(duì)我們調(diào)試生成問題有幫助。當(dāng)快速失敗時(shí),我們降低了連鎖故障的可能性。這些可能是我們?cè)谏a(chǎn)環(huán)境中遇到的最糟糕的故障,因?yàn)閷?duì)應(yīng)用程序狀態(tài)的深入理解在生產(chǎn)環(huán)境中具有很高的復(fù)雜度。

在構(gòu)建大型應(yīng)用程序時(shí),我們經(jīng)常提到 "robust"(魯棒性)這個(gè)詞。系統(tǒng)應(yīng)該具有魯棒性,這種魯棒性應(yīng)該由代碼以外的部分提供。同時(shí),你的代碼本身應(yīng)該遵循快速失敗的原則。

一致性原則

在我之前關(guān)于日志記錄最佳實(shí)踐的分享中,我提到過,無論在哪家曾服務(wù)過的公司,都有一套自己的代碼風(fēng)格指南,或者至少會(huì)遵循某種公認(rèn)的風(fēng)格。然而,很少有公司會(huì)有一份關(guān)于日志記錄的指南,告訴我們應(yīng)該在何處記錄日志,以及應(yīng)該記錄哪些內(nèi)容。

我們追求的一致性,實(shí)際上比代碼格式化更為重要。 在進(jìn)行調(diào)試的時(shí)候,我們需要知道應(yīng)該尋找什么。如果禁止使用某些特定的包,我期望這個(gè)規(guī)則能適用于整個(gè)代碼庫。 同樣,如果大家普遍不推薦某種編碼實(shí)踐,我期望這是一個(gè)共識(shí)。

幸運(yùn)的是,有了持續(xù)集成(CI),這些一致性規(guī)則可以輕易地得到執(zhí)行,而不會(huì)增加我們的代碼審查負(fù)擔(dān)。像 SonarQube 這樣的自動(dòng)化工具是可插拔的,并且可以通過自定義的檢測(cè)代碼進(jìn)行擴(kuò)展。我們可以調(diào)整這些工具,以強(qiáng)制執(zhí)行我們的一致性規(guī)則集,限制代碼中某個(gè)特定子集的使用,或者要求適當(dāng)?shù)娜罩居涗洝?/p>

當(dāng)然,每條規(guī)則都可能有例外。我們不應(yīng)受過于嚴(yán)格的規(guī)則束縛。這就是我們需要能夠調(diào)整這些工具,通過開發(fā)者審查來合并代碼變更的原因,這非常重要。

雙重驗(yàn)證

調(diào)試,其本質(zhì)是在我們發(fā)現(xiàn)并修復(fù) bug 的過程中對(duì)假設(shè)進(jìn)行驗(yàn)證。通常,這一過程進(jìn)行得相當(dāng)迅速:我們找到問題所在,進(jìn)行驗(yàn)證,然后修復(fù)。但偶爾,我們可能會(huì)在追蹤某個(gè) bug 上花費(fèi)過多的時(shí)間,尤其是那些難以復(fù)現(xiàn)的 bug 或只在生產(chǎn)環(huán)境出現(xiàn)的 bug。

當(dāng)我們遇到難以解決的 bug,重要的是能夠后退一步反思,這通常表示我們可能需要重新審視我們的假設(shè)和驗(yàn)證方法。雙重驗(yàn)證的關(guān)鍵在于利用不同的方法來確認(rèn)假設(shè)的有效性,以保證我們的結(jié)論準(zhǔn)確無誤。

一般來說,我們需要驗(yàn)證 bug 存在的兩個(gè)方面。例如,假設(shè)后端存在一個(gè)問題,而這個(gè)問題會(huì)在前端呈現(xiàn)出錯(cuò)誤的數(shù)據(jù)。為了定位這個(gè) bug,我最初做出了兩個(gè)假設(shè):

  • 前端準(zhǔn)確地顯示了后端的數(shù)據(jù)
  • 數(shù)據(jù)庫查詢返回了正確的數(shù)據(jù)

為了驗(yàn)證這兩個(gè)假設(shè),我可能會(huì)打開瀏覽器查看數(shù)據(jù),使用網(wǎng)絡(luò)開發(fā)者工具檢查響應(yīng)來確保顯示的數(shù)據(jù)確實(shí)來自服務(wù)器查詢。對(duì)于后端,我可以直接發(fā)出數(shù)據(jù)庫查詢,確認(rèn)返回的數(shù)據(jù)是否正確。

但這僅僅是驗(yàn)證這些數(shù)據(jù)的一種方法。我們希望在理想情況下,有第二種驗(yàn)證方法。例如,如果緩存返回了錯(cuò)誤的數(shù)據(jù),又或者 SQL 查詢的前提假設(shè)錯(cuò)誤呢?

第二種驗(yàn)證方法應(yīng)盡可能與第一種方法不同,以防止犯下與第一種方法相同的錯(cuò)誤。對(duì)于前端代碼,我們可能會(huì)嘗試使用像 cURL 這樣的工具進(jìn)行驗(yàn)證。 使用像  cURL  這樣的工具進(jìn)行驗(yàn)證是一個(gè)好方法,我們應(yīng)該嘗試。但更好的方式可能是在服務(wù)器上查看記錄的數(shù)據(jù),或者調(diào)用支持前端的 WebService。

同樣,對(duì)于后端,我們希望能夠看到從應(yīng)用程序內(nèi)部返回的數(shù)據(jù)。這是可觀察性的一個(gè)核心概念。一個(gè)具有可觀察性的系統(tǒng),就是我們可以對(duì)其提出問題并得到答案的系統(tǒng)。在開發(fā)過程中,我們應(yīng)通過兩種不同的方式來提高我們的系統(tǒng)可觀察性,以便更好地回答問題。

為何避免使用三種以上驗(yàn)證方式?

我們通常不采用超過兩種驗(yàn)證方式,這是因?yàn)檫^度驗(yàn)證會(huì)導(dǎo)致我們的成本增加,性能降低。我們需要將收集的信息量限制在合理的范圍內(nèi),尤其在收集信息的過程中,必須重視個(gè)人信息保護(hù)的風(fēng)險(xiǎn),這是我們必須重視的關(guān)鍵因素。

可觀察性往往根據(jù)其使用的工具,柱狀指標(biāo)或者某些明顯的特征來定義,但這其實(shí)是錯(cuò)誤的。可觀察性應(yīng)當(dāng)根據(jù)它提供的訪問權(quán)限來定義。我們決定記錄什么,監(jiān)控什么,決定追蹤的范圍,決定信息的粒度,以及決定是否希望部署開發(fā)者的可觀察性工具。

我們需要保證我們的生產(chǎn)系統(tǒng)能夠得到適當(dāng)?shù)谋O(jiān)控。為此,我們需要進(jìn)行故障注入,可能還需要安排混沌工程的執(zhí)行。在運(yùn)行這樣的場(chǎng)景時(shí),我們需要考慮如何解決出現(xiàn)的問題。我們能對(duì)系統(tǒng)提出哪些問題?我們?nèi)绾位卮疬@些問題?

例如,當(dāng)特定問題出現(xiàn)時(shí),我們通常關(guān)心有多少用戶的操作正在實(shí)時(shí)影響系統(tǒng)數(shù)據(jù)。因此,我們可以為這個(gè)信息添加一個(gè)度量。

通過特性標(biāo)志進(jìn)行驗(yàn)證

雖然我們可以使用可觀察性工具來驗(yàn)證假設(shè),但我們也可以使用一些更具創(chuàng)新性的驗(yàn)證工具。其中,一個(gè)意想不到的工具就是特性標(biāo)志系統(tǒng)。特性標(biāo)志解決方案通??梢苑浅<?xì)粒度地操作,例如我們可以只為特定用戶關(guān)閉或改變一個(gè)特性的設(shè)置等。

這種功能非常強(qiáng)大。如果特定的代碼被封裝在一個(gè)標(biāo)志中,我們就可以通過切換一個(gè)特性來為我們提供對(duì)特定行為的驗(yàn)證。我并不建議在所有代碼中都使用特性標(biāo)志,但是能夠拉動(dòng)開關(guān)并在生產(chǎn)環(huán)境中改變系統(tǒng)是一種強(qiáng)大的調(diào)試工具,這種工具的威力常常被低估。

bug 分析會(huì)議

我在 90 年代開發(fā)過飛行模擬器,期間有幸與許多戰(zhàn)斗機(jī)飛行員合作。我從他們那里了解到了"分析會(huì)議"這個(gè)概念。我之前只把這樣的會(huì)議當(dāng)作任務(wù)失敗后的討論,然而戰(zhàn)斗機(jī)飛行員無論任務(wù)成功還是失敗,都會(huì)在任務(wù)結(jié)束后立刻進(jìn)行這樣的會(huì)議。

我們可以從中學(xué)習(xí)以下重要的要點(diǎn):

  • 即時(shí)性 - 我們需要在事件剛發(fā)生不久的時(shí)候討論這些信息。如果等待過久,部分信息可能會(huì)丟失,而我們的記憶也會(huì)發(fā)生明顯的改變。
  • 成功與失敗 - 每次任務(wù)都包含成功與失敗的元素。我們需要理解在哪些方面做對(duì)了,哪些方面做錯(cuò)了,尤其是在任務(wù)成功的情況下。

解決了一個(gè) bug 之后,我們通常只想把這件事了結(jié),不再討論它。即使我們想要"炫耀",也通常只是對(duì)追蹤過程的模糊記憶。通過開放的討論,我們對(duì)做對(duì)的事情和做錯(cuò)的事情沒有任何評(píng)判,我們可以了解到我們的現(xiàn)狀。這些信息可以幫助我們?cè)谧粉檰栴}時(shí)提升我們的效果。

這樣的分析會(huì)議能幫我們發(fā)現(xiàn)在可觀測(cè)數(shù)據(jù)中的缺失、不一致性以及問題流程。在許多團(tuán)隊(duì)中,流程是一個(gè)常見的問題。通常,當(dāng)出現(xiàn)問題時(shí),它的解決過程是這樣的:

  • 客戶發(fā)現(xiàn)問題
  • 向支持部門報(bào)告問題
  • 運(yùn)維團(tuán)隊(duì)進(jìn)行檢查
  • 問題轉(zhuǎn)交給研發(fā)部門

如果你在研發(fā)部門,你離客戶隔了 4 層,而你接收到的問題可能不包含你需要的所有信息。盡管優(yōu)化這些流程并不涉及到代碼修改,但我們可以在代碼中添加工具,以便更輕松地定位問題。一種常見的做法是為每個(gè)異常對(duì)象添加一個(gè)唯一的鍵。在出現(xiàn)故障的情況下,這將呈現(xiàn)到用戶界面。

當(dāng)客戶報(bào)告問題時(shí),他們可能會(huì)包含這個(gè)錯(cuò)誤碼,方便研發(fā)部門通過日志快速定位錯(cuò)誤。這些都是通過這樣的分析會(huì)議,我們可以發(fā)現(xiàn)并優(yōu)化流程的方法。

審閱有效的日志與儀表板

僅僅等待失敗的發(fā)生并非是解決問題的正確方式。我們需要定期查閱日志和儀表板,以便于追蹤可能已經(jīng)存在但未曾顯露出來的 bug,并能建立正常運(yùn)行狀態(tài)的基準(zhǔn)。健康的儀表板或者日志應(yīng)該呈現(xiàn)出怎樣的狀態(tài)。

在日志中,我們可能會(huì)遇到一些錯(cuò)誤信息。如果我們?cè)谧粉?bug 的過程中,花費(fèi)時(shí)間去查看那些并無實(shí)質(zhì)性影響的錯(cuò)誤,那我們就是在浪費(fèi)時(shí)間。理想情況下,我們需要盡可能地減少這些錯(cuò)誤,因?yàn)樗鼈儠?huì)使得日志的閱讀變得困難。但是在服務(wù)器開發(fā)中的現(xiàn)實(shí)狀況是,我們不能總是做到這一點(diǎn)。不過,我們可以通過對(duì)源代碼的深入理解和適當(dāng)?shù)淖⑨?,來降低這方面的時(shí)間開銷。

結(jié)語

創(chuàng)建 Codename One 數(shù)年后,我們的 Google App Engine 賬單突然飆升,甚至在幾天內(nèi)就會(huì)導(dǎo)致公司的破產(chǎn)。這是由于他們后端系統(tǒng)的一次更新,引發(fā)了一個(gè)突發(fā)性的回歸問題。

這個(gè)問題的源頭在于未被緩存的數(shù)據(jù),但是由于當(dāng)時(shí) App Engine 的運(yùn)行方式,我們無法定位到代碼中哪一個(gè)具體的區(qū)域觸發(fā)了這個(gè)問題。我們無法直接調(diào)試這個(gè)問題,只能嘗試通過更新服務(wù)器并觀察其運(yùn)行情況來判斷問題是否得到了解決。

幸運(yùn)的是,我們當(dāng)時(shí)解決了這個(gè)問題。我們對(duì)所有可能的部分盡可能進(jìn)行了緩存處理。直到今天,我仍然不清楚是什么觸發(fā)了這個(gè)問題,也不知道我們做了什么修復(fù)了問題。

但是我知道的是:

選擇使用"App Engine"是我當(dāng)時(shí)的一個(gè)決策失誤。它未能提供足夠的可觀察性,并留下了關(guān)鍵的盲點(diǎn)。如果我在部署前花時(shí)間對(duì)可觀察性能力進(jìn)行審查,我就能夠察覺這點(diǎn)。選擇使用"App Engine"是我當(dāng)時(shí)的一個(gè)決策失誤。

譯者介紹

劉汪洋,51CTO社區(qū)編輯,昵稱:明明如月,一個(gè)擁有 5 年開發(fā)經(jīng)驗(yàn)的某大廠高級(jí) Java 工程師,擁有多個(gè)主流技術(shù)博客平臺(tái)博客專家稱號(hào)。

原文標(biāo)題:Building for Failure: Best Practices for Easy Production Debugging,作者:Shai Almog

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2010-11-26 09:36:41

移動(dòng)互聯(lián)網(wǎng)移動(dòng)Web界面Web站點(diǎn)

2025-07-03 07:06:56

2023-08-17 10:14:58

物聯(lián)網(wǎng)家庭自動(dòng)化

2023-12-06 07:13:16

RESTAPI客戶端

2010-09-07 17:12:46

DB2故障處理

2024-11-28 10:15:09

2018-12-18 09:00:26

Kubernetes工作負(fù)載測(cè)試

2014-12-22 17:19:51

Radware

2016-08-29 13:59:30

華為

2023-09-13 08:00:00

JavaScript循環(huán)語句

2015-09-15 16:01:40

混合IT私有云IT架構(gòu)

2024-01-09 07:25:31

2011-08-18 11:05:21

jQuery

2023-07-21 01:12:30

Reactfalse?變量

2016-12-27 08:49:55

API設(shè)計(jì)策略

2024-09-29 16:05:18

2020-12-10 08:00:00

開發(fā).NET工具

2023-10-26 01:28:02

2011-12-27 15:42:13

2013-05-22 15:29:28

微軟云計(jì)算微軟公有云Windows Azu
點(diǎn)贊
收藏

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

怡红院在线播放| 久久久久久免费观看| xxxxx.日韩| 亚洲欧洲中文日韩久久av乱码| 亚洲影院高清在线| 欧美精品亚洲精品日韩精品| 精品久久国产| 日韩亚洲欧美高清| 黄色高清无遮挡| 国产激情在线观看| 91在线国产观看| 成人国产精品一区| 日韩av一二三区| 99re66热这里只有精品8| 亚洲成色999久久网站| 91国产精品视频在线观看| 欧美人与性动交α欧美精品济南到| av电影在线观看一区| 成人国产精品久久久| 国产微拍精品一区| 欧美伊人影院| 亚洲色图综合久久| 人妖粗暴刺激videos呻吟| 狠狠久久伊人中文字幕| 婷婷成人激情在线网| 三年中文高清在线观看第6集| 天天色综合久久| 国产精品自拍毛片| 国产精品高精视频免费| 日本天堂网在线观看| 久久久久久久久久久久久久| 亚洲人午夜精品免费| 人妻体内射精一区二区三区| 国产精品日本一区二区三区在线| 狠狠色噜噜狠狠狠狠97| 男人添女人下部视频免费| 三级外国片在线观看视频| 久久美女艺术照精彩视频福利播放| 99久久精品国产一区二区三区 | 自拍一级黄色片| 日本韩国欧美| 亚洲r级在线视频| 日本a级片在线观看| 色的视频在线免费看| 国产日韩欧美制服另类| 欧美一二三区| 日韩福利一区二区| 97国产一区二区| 国产精品一 二 三| 国内精品久久久久久久久久| 激情都市一区二区| 成人在线小视频| 在线观看国产精品入口男同| 日韩电影一区二区三区| 国产成人av网址| 影音先锋在线国产| 蘑菇福利视频一区播放| 欧美最猛性xxxx| 免费观看成人毛片| 香蕉国产精品偷在线观看不卡| 国内精品久久久久久影视8| 精品一区在线视频| 亚洲国产精品第一区二区三区| 欧美黄色三级网站| 日韩激情在线播放| 亚洲欧美视频| 国产精品黄页免费高清在线观看| 久久人人爽人人爽人人片av免费| 日韩高清一区在线| 国产精品视频精品视频| 国产精品毛片久久久久久久av | 中国xxxx性xxxx产国| 哺乳挤奶一区二区三区免费看| 精品欧美一区二区久久| 天堂www中文在线资源| 欧美激情99| 亚洲欧美日本另类| 中文字幕第69页| 欧美一区不卡| 精品国产91久久久久久| yy111111少妇影院日韩夜片| www.日本在线观看| 99视频在线精品| 女同一区二区| 日本中文字幕在线看| 夜夜夜精品看看| 国产精品沙发午睡系列| 高清在线一区| 精品国产乱码久久久久久图片 | 免费黄色特级片| 九九九精品视频| 日韩亚洲欧美一区| 日韩一级视频在线观看| 成人在线国产| 欧美第一页在线| 欧美在线观看不卡| 精品在线一区二区| 极品日韩久久| av中文在线| 亚洲成精国产精品女| 久久久精品三级| 亚洲精品一二三**| 亚洲色图35p| 强行糟蹋人妻hd中文| 美女国产一区| 肥熟一91porny丨九色丨| 国产中文字幕在线播放| 亚洲精品乱码久久久久久久久| 日韩人妻精品无码一区二区三区| 亚洲一区有码| 亚洲欧洲高清在线| 精品少妇爆乳无码av无码专区| 丝袜亚洲另类欧美综合| 懂色一区二区三区av片| 日本在线观看| 色素色在线综合| 亚洲精品第二页| 欧美电影《睫毛膏》| 91高清在线免费观看| av网站免费大全| 国产亚洲1区2区3区| av在线播放天堂| 深夜福利亚洲| 亚洲欧美国产视频| 3d蒂法精品啪啪一区二区免费| 中文字幕第31页| 91丨九色丨蝌蚪丨老版| 日韩精品一区二区免费| 国产欧美视频在线| 中文字幕视频一区二区在线有码| 欧美一区二区三区四| 国产成人午夜视频| 欧美 日韩 国产 在线观看| 久久野战av| 日韩av在线网址| 豆国产97在线 | 亚洲| 国产原创一区二区| 尤物一区二区三区| 日韩福利在线观看| 中文字幕日韩av电影| 无码人妻丰满熟妇精品| 久久亚洲免费视频| 日本成年人网址| 欧美男男freegayvideosroom| 久久99热精品这里久久精品| 国产欧美熟妇另类久久久 | 一区二区三区不卡在线| 日本成人片在线| 亚洲视频自拍偷拍| 亚洲自拍一区在线观看| 久久网这里都是精品| av天堂永久资源网| 欧美美乳视频| 国产精品第10页| av在线三区| 欧美日韩国产小视频| 999久久久国产| 蜜乳av一区二区三区| 亚洲最大色综合成人av| 涩涩涩久久久成人精品| 久久精品小视频| 国产青青草视频| 一区二区三区在线视频免费| 日本天堂在线播放| 日韩一级免费| 欧美不卡福利| www.一区| 欧美老少配视频| 男人天堂一区二区| 欧美性生交大片免费| 男人操女人动态图| 亚洲天天综合网| 久久综合久久综合九色| 91香蕉视频污版| 国产精品久久久久9999赢消| 亚洲xxx自由成熟| 97在线超碰| 亚洲一区二区福利| 国产免费一区二区三区免费视频| 一级女性全黄久久生活片免费| yjizz视频| 日韩电影在线一区| 日韩人妻精品一区二区三区| y111111国产精品久久久| 2019中文字幕在线免费观看| www.av在线| 日韩一级片在线观看| 日韩av电影网| 国产精品美女久久久久久久久久久| 超碰在线超碰在线| 亚洲资源av| 成人短视频在线看| 卡通动漫精品一区二区三区| 国产精品h片在线播放| 91精品久久久久久粉嫩| 日韩精品中文字幕有码专区| 亚洲天堂网在线视频| 亚洲国产日产av| 蜜桃av免费观看| 99久久伊人精品| 亚洲欧美日韩一二三区| 亚洲制服av| 中文字幕在线中文| 国产精品密蕾丝视频下载| 亚洲综合小说区| 日韩pacopacomama| 久久久久免费视频| caoporn国产精品免费视频 | 久久精品国产亚洲a∨麻豆| 56国语精品自产拍在线观看| 亚洲黄色小说图片| 亚洲视频资源在线| 一级性生活毛片| 国产91精品一区二区| 网站一区二区三区| 国产偷自视频区视频一区二区| 自拍偷拍99| 精品国产美女| 欧美污视频久久久| 国产精品欧美大片| 7777精品久久久大香线蕉小说| av成人免费看| 青青草99啪国产免费| 亚洲 自拍 另类小说综合图区| 国产一区二区三区不卡av| 国产有码在线一区二区视频| 免费电影日韩网站| 久久全球大尺度高清视频| 国产在线高清理伦片a| 在线免费观看羞羞视频一区二区| 色呦呦视频在线| 精品少妇一区二区三区视频免付费| 中文字幕欧美色图| 91国产成人在线| 精品国产一区二区三区四| 亚洲午夜激情网站| 永久免费看黄网站| 18欧美乱大交hd1984| 国产三级在线观看完整版| 97精品久久久午夜一区二区三区 | wwwwww.色| 久久久久国内| 免费午夜视频在线观看| 午夜在线视频观看日韩17c| 日本欧美黄色片| 亚洲精品少妇| 黄色一级视频片| 中文亚洲欧美| 日本久久久精品视频| 亚洲少妇在线| 国产精品沙发午睡系列| 久久成人精品| www.欧美日本| 麻豆成人91精品二区三区| 国产 porn| 精品影院一区二区久久久| 手机av在线网| 国产一区二区三区在线观看免费视频 | 136福利第一导航国产在线| 久久久在线观看| 福利在线免费视频| 日本精品一区二区三区在线播放视频| 天堂电影一区| 国产精品国产自产拍高清av水多| 天然素人一区二区视频| 国产欧美一区二区三区在线看| 四虎国产精品成人免费影视| 亚洲一区亚洲二区| 久久精品色综合| 日本免费高清一区| 97天天综合网| 欧美日韩一本到| 国产女同91疯狂高潮互磨| 精品剧情在线观看| 欧美偷拍视频| 伊人伊成久久人综合网站| 久久综合之合合综合久久| 欧美日韩aaaa| 亚洲国产成人二区| 成人午夜在线观看| 黄色成人美女网站| 日韩区国产区| 激情欧美一区二区三区| 亚洲 中文字幕 日韩 无码| 国产一区二区在线影院| 无套内谢大学处破女www小说| 国产色爱av资源综合区| 国产又黄又爽又无遮挡| 欧美视频在线免费| 国产乱色精品成人免费视频| 亚洲精品美女视频| 欧美成人高清在线| 97在线视频观看| 四虎影视精品永久在线观看| 国产美女精品久久久| 日韩国产一区二区| 和岳每晚弄的高潮嗷嗷叫视频| 可以看av的网站久久看| 人妻少妇偷人精品久久久任期| 久久久久久99久久久精品网站| 欧美黄色aaa| 色欧美乱欧美15图片| www.亚洲黄色| 最近2019中文字幕mv免费看 | 丰满少妇一区二区三区专区| 久久人人爽人人爽| 久久精品第一页| 欧美日本在线播放| 日韩在线免费播放| 欧美老女人在线视频| 国产电影一区二区三区爱妃记| 国产九色91| 综合久久婷婷| 日日噜噜夜夜狠狠| 久久综合九色综合欧美就去吻| 日韩影院一区二区| 欧美日韩中文另类| 你懂的视频在线播放| 久久免费视频在线观看| 一区二区三区| 亚洲精品成人三区| 手机精品视频在线观看| av在线播放网址| 玉足女爽爽91| 国产男男gay体育生白袜| 中文字幕免费精品一区| 69久成人做爰电影| 韩国精品一区二区三区六区色诱| 亚洲精品va| 99re精彩视频| 国产欧美日韩视频一区二区| 国产九九在线观看| 欧美日韩四区| 1314成人网| 综合精品久久久| 一级黄色短视频| 在线视频欧美性高潮| 国产精品扒开腿做爽爽爽视频软件| 精品乱码一区二区三区| 亚洲国产日本| 高清中文字幕mv的电影| 亚洲激情成人在线| 99热这里只有精品在线| 日韩资源在线观看| 国产精品高潮久久| 亚洲欧洲免费无码| 久久精品国产一区二区| 中文字幕91视频| 5566中文字幕一区二区电影| 国产秀色在线www免费观看| 国产综合久久久久久| 99久久视频| 免费成年人高清视频| 日韩毛片视频在线看| 国产精品毛片一区视频播| www亚洲精品| 久久久久久亚洲精品美女| 强开小嫩苞一区二区三区网站| 国产真实乱对白精彩久久| 澳门黄色一级片| 欧美第一区第二区| av在线理伦电影| 久久伊人资源站| 免费高清不卡av| 加勒比婷婷色综合久久| 欧美α欧美αv大片| 成人黄色动漫| 欧美乱偷一区二区三区在线| 日本免费在线视频不卡一不卡二| 91视频免费在观看| 欧美乱熟臀69xxxxxx| 一区二区三区伦理| 精品国产乱码久久久久久郑州公司 | 中文字幕免费国产精品| 国产一区二区| 极品粉嫩国产18尤物| 久久久一区二区| 97超碰人人草| 久久久久久久久久国产| 一道在线中文一区二区三区| 美女少妇一区二区| 亚洲一区二区三区激情| 深夜福利在线看| 成人国产精品久久久| 国产欧美二区| 日本裸体美女视频| 亚洲成人三级在线| 国产成人免费精品| av免费看网址| 国产精品国产三级国产三级人妇 | 日韩在线播放视频| av不卡一区| 久久久人成影片一区二区三区| 在线免费av网站| 岛国一区二区三区高清视频| 喷白浆一区二区| 精品无码免费视频| 色偷偷9999www| 日韩极品在线| 青娱乐精品在线|