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

Spring Cloud 20000 字總結(jié),收藏!

共 15902字,需瀏覽 32分鐘

 ·

2020-07-27 18:54


作者FrancisQ

juejin.im/post/5de2553e5188256e885f4fa3


首先我給大家看一張圖,如果大家對這張圖有些地方不太理解的話,我希望你們看完我這篇文章會恍然大悟。

什么是Spring cloud

構(gòu)建分布式系統(tǒng)不需要復(fù)雜和容易出錯。Spring Cloud 為最常見的分布式系統(tǒng)模式提供了一種簡單且易于接受的編程模型,幫助開發(fā)人員構(gòu)建有彈性的、可靠的、協(xié)調(diào)的應(yīng)用程序。Spring Cloud 構(gòu)建于 Spring Boot 之上,使得開發(fā)者很容易入手并快速應(yīng)用于生產(chǎn)中。

官方果然官方,介紹都這么有板有眼的。

我所理解的 Spring Cloud 就是微服務(wù)系統(tǒng)架構(gòu)的一站式解決方案,在平時我們構(gòu)建微服務(wù)的過程中需要做如 服務(wù)發(fā)現(xiàn)注冊 、配置中心 、消息總線 、負載均衡斷路器 、數(shù)據(jù)監(jiān)控 等操作,而 Spring Cloud 為我們提供了一套簡易的編程模型,使我們能在 Spring Boot 的基礎(chǔ)上輕松地實現(xiàn)微服務(wù)項目的構(gòu)建。

Spring Cloud 的版本

當然這個只是個題外話。

Spring Cloud 的版本號并不是我們通常見的數(shù)字版本號,而是一些很奇怪的單詞。這些單詞均為英國倫敦地鐵站的站名。同時根據(jù)字母表的順序來對應(yīng)版本時間順序,比如:最早 的 Release 版本 Angel,第二個 Release 版本 Brixton(英國地名),然后是 Camden、 Dalston、Edgware、Finchley、Greenwich、Hoxton。

Spring Cloud 的服務(wù)發(fā)現(xiàn)框架——Eureka

Eureka是基于REST(代表性狀態(tài)轉(zhuǎn)移)的服務(wù),主要在AWS云中用于定位服務(wù),以實現(xiàn)負載均衡和中間層服務(wù)器的故障轉(zhuǎn)移。我們稱此服務(wù)為Eureka服務(wù)器。Eureka還帶有一個基于Java的客戶端組件Eureka Client,它使與服務(wù)的交互變得更加容易??蛻舳诉€具有一個內(nèi)置的負載平衡器,可以執(zhí)行基本的循環(huán)負載平衡。在Netflix,更復(fù)雜的負載均衡器將Eureka包裝起來,以基于流量,資源使用,錯誤條件等多種因素提供加權(quán)負載均衡,以提供出色的彈性。

總的來說,Eureka 就是一個服務(wù)發(fā)現(xiàn)框架。何為服務(wù),何又為發(fā)現(xiàn)呢?

舉一個生活中的例子,就比如我們平時租房子找中介的事情。

在沒有中介的時候我們需要一個一個去尋找是否有房屋要出租的房東,這顯然會非常的費力,一你找憑一個人的能力是找不到很多房源供你選擇,再者你也懶得這么找下去(找了這么久,沒有合適的只能將就)。這里的我們就相當于微服務(wù)中的 Consumer ,而那些房東就相當于微服務(wù)中的 Provider 。消費者 Consumer 需要調(diào)用提供者 Provider 提供的一些服務(wù),就像我們現(xiàn)在需要租他們的房子一樣。

但是如果只是租客和房東之間進行尋找的話,他們的效率是很低的,房東找不到租客賺不到錢,租客找不到房東住不了房。所以,后來房東肯定就想到了廣播自己的房源信息(比如在街邊貼貼小廣告),這樣對于房東來說已經(jīng)完成他的任務(wù)(將房源公布出去),但是有兩個問題就出現(xiàn)了。第一、其他不是租客的都能收到這種租房消息,這在現(xiàn)實世界沒什么,但是在計算機的世界中就會出現(xiàn)資源消耗 的問題了。第二、租客這樣還是很難找到你,試想一下我需要租房,我還需要東一個西一個地去找街邊小廣告,麻不麻煩?

那怎么辦呢?我們當然不會那么傻乎乎的,第一時間就是去找 中介 呀,它為我們提供了統(tǒng)一房源的地方,我們消費者只需要跑到它那里去找就行了。而對于房東來說,他們也只需要把房源在中介那里發(fā)布就行了。

那么現(xiàn)在,我們的模式就是這樣的了。

但是,這個時候還會出現(xiàn)一些問題。

  1. 房東注冊之后如果不想賣房子了怎么辦?我們是不是需要讓房東定期續(xù)約 ?如果房東不進行續(xù)約是不是要將他們從中介那里的注冊列表中移除 。
  2. 租客是不是也要進行注冊 呢?不然合同乙方怎么來呢?
  3. 中介可不可以做連鎖店 呢?如果這一個店因為某些不可抗力因素而無法使用,那么我們是否可以換一個連鎖店呢?

針對上面的問題我們來重新構(gòu)建一下上面的模式圖

好了,舉完這個?我們就可以來看關(guān)于 Eureka 的一些基礎(chǔ)概念了,你會發(fā)現(xiàn)這東西理解起來怎么這么簡單。???

服務(wù)發(fā)現(xiàn) :其實就是一個“中介”,整個過程中有三個角色:服務(wù)提供者(出租房子的)、服務(wù)消費者(租客)、服務(wù)中介(房屋中介) 。

服務(wù)提供者 :就是提供一些自己能夠執(zhí)行的一些服務(wù)給外界。

服務(wù)消費者 :就是需要使用一些服務(wù)的“用戶”。

服務(wù)中介 :其實就是服務(wù)提供者和服務(wù)消費者之間的“橋梁”,服務(wù)提供者可以把自己注冊到服務(wù)中介那里,而服務(wù)消費者如需要消費一些服務(wù)(使用一些功能)就可以在服務(wù)中介中尋找注冊在服務(wù)中介的服務(wù)提供者。

服務(wù)注冊 Register

官方解釋:當 Eureka 客戶端向 Eureka Server 注冊時,它提供自身的元數(shù)據(jù),比如IP地址、端口,運行狀況指示符URL,主頁等。

結(jié)合中介理解:房東 (提供者 Eureka Client Provider)在中介 (服務(wù)器 Eureka Server) 那里登記房屋的信息,比如面積,價格,地段等等(元數(shù)據(jù) metaData)。

服務(wù)續(xù)約 Renew

官方解釋:Eureka 客戶會每隔30秒(默認情況下)發(fā)送一次心跳來續(xù)約。通過續(xù)約來告知 Eureka ServerEureka 客戶仍然存在,沒有出現(xiàn)問題。正常情況下,如果 Eureka Server 在90秒沒有收到 Eureka 客戶的續(xù)約,它會將實例從其注冊表中刪除。

結(jié)合中介理解:房東 (提供者 Eureka Client Provider) 定期告訴中介 (服務(wù)器 Eureka Server) 我的房子還租(續(xù)約) ,中介 (服務(wù)器Eureka Server) 收到之后繼續(xù)保留房屋的信息。

獲取注冊列表信息 Fetch Registries

官方解釋:Eureka 客戶端從服務(wù)器獲取注冊表信息,并將其緩存在本地??蛻舳藭褂迷撔畔⒉檎移渌?wù),從而進行遠程調(diào)用。該注冊列表信息定期(每30秒鐘)更新一次。每次返回注冊列表信息可能與 Eureka 客戶端的緩存信息不同, Eureka 客戶端自動處理。如果由于某種原因?qū)е伦粤斜硇畔⒉荒芗皶r匹配,Eureka 客戶端則會重新獲取整個注冊表信息。Eureka 服務(wù)器緩存注冊列表信息,整個注冊表以及每個應(yīng)用程序的信息進行了壓縮,壓縮內(nèi)容和沒有壓縮的內(nèi)容完全相同。Eureka 客戶端和 Eureka 服務(wù)器可以使用JSON / XML格式進行通訊。在默認的情況下 Eureka 客戶端使用壓縮 JSON 格式來獲取注冊列表的信息。

結(jié)合中介理解:租客(消費者 Eureka Client Consumer) 去中介 (服務(wù)器 Eureka Server) 那里獲取所有的房屋信息列表 (客戶端列表 Eureka Client List) ,而且租客為了獲取最新的信息會定期向中介 (服務(wù)器 Eureka Server) 那里獲取并更新本地列表。

服務(wù)下線 Cancel

官方解釋:Eureka客戶端在程序關(guān)閉時向Eureka服務(wù)器發(fā)送取消請求。發(fā)送請求后,該客戶端實例信息將從服務(wù)器的實例注冊表中刪除。該下線請求不會自動完成,它需要調(diào)用以下內(nèi)容:DiscoveryManager.getInstance().shutdownComponent();

結(jié)合中介理解:房東 (提供者 Eureka Client Provider) 告訴中介 ?(服務(wù)器 Eureka Server) 我的房子不租了,中介之后就將注冊的房屋信息從列表中剔除。

服務(wù)剔除 Eviction

官方解釋:在默認的情況下,當Eureka客戶端連續(xù)90秒(3個續(xù)約周期)沒有向Eureka服務(wù)器發(fā)送服務(wù)續(xù)約,即心跳,Eureka服務(wù)器會將該服務(wù)實例從服務(wù)注冊列表刪除,即服務(wù)剔除。

結(jié)合中介理解:房東(提供者 Eureka Client Provider) 會定期聯(lián)系 中介 ?(服務(wù)器 Eureka Server) 告訴他我的房子還租(續(xù)約),如果中介 ?(服務(wù)器 Eureka Server) 長時間沒收到提供者的信息,那么中介會將他的房屋信息給下架(服務(wù)剔除)。

下面就是 Netflix 官方給出的 Eureka 架構(gòu)圖,你會發(fā)現(xiàn)和我們前面畫的中介圖別無二致。

當然,可以充當服務(wù)發(fā)現(xiàn)的組件有很多:Zookeeper ,Consul , Eureka 等。

更多關(guān)于 Eureka 的知識(自我保護,初始注冊策略等等)可以自己去官網(wǎng)查看,或者查看我的另一篇文章 [深入理解 Eureka](https://juejin.im/post/5dd497e3f265da0ba7718018)。

負載均衡之 Ribbon

什么是 RestTemplate?

不是講 Ribbon 么?怎么扯到了 RestTemplate 了?你先別急,聽我慢慢道來。

我不聽我不聽我不聽???。

我就說一句!RestTemplateSpring提供的一個訪問Http服務(wù)的客戶端類 ,怎么說呢?就是微服務(wù)之間的調(diào)用是使用的 RestTemplate 。比如這個時候我們 消費者B 需要調(diào)用 提供者A 所提供的服務(wù)我們就需要這么寫。如我下面的偽代碼。

@Autowired
private RestTemplate restTemplate;
// 這里是提供者A的ip地址,但是如果使用了 Eureka 那么就應(yīng)該是提供者A的名稱
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";

@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {
String url = SERVICE_PROVIDER_A + "/service1";
return restTemplate.postForObject(url, request, Boolean.class);
}

如果你對源碼感興趣的話,你會發(fā)現(xiàn)上面我們所講的 Eureka 框架中的 注冊續(xù)約 等,底層都是使用的 RestTemplate 。

為什么需要 Ribbon?

Ribbon ?是 Netflix 公司的一個開源的負載均衡 項目,是一個客戶端/進程內(nèi)負載均衡器,運行在消費者端 。

我們再舉個?,比如我們設(shè)計了一個秒殺系統(tǒng),但是為了整個系統(tǒng)的 高可用 ,我們需要將這個系統(tǒng)做一個集群,而這個時候我們消費者就可以擁有多個秒殺系統(tǒng)的調(diào)用途徑了,如下圖。

如果這個時候我們沒有進行一些 均衡操作 ,如果我們對 秒殺系統(tǒng)1 進行大量的調(diào)用,而另外兩個基本不請求,就會導致 秒殺系統(tǒng)1 崩潰,而另外兩個就變成了傀儡,那么我們?yōu)槭裁催€要做集群,我們高可用體現(xiàn)的意義又在哪呢?

所以 Ribbon 出現(xiàn)了,注意我們上面加粗的幾個字——運行在消費者端 。指的是,Ribbon 是運行在消費者端的負載均衡器,如下圖。

其工作原理就是 Consumer 端獲取到了所有的服務(wù)列表之后,在其內(nèi)部 使用負載均衡算法 ,進行對多個系統(tǒng)的調(diào)用。

Nginx 和 Ribbon 的對比

提到 負載均衡 就不得不提到大名鼎鼎的 Nignx 了,而和 Ribbon 不同的是,它是一種集中式 的負載均衡器。

何為集中式呢?簡單理解就是 將所有請求都集中起來,然后再進行負載均衡 。如下圖。

我們可以看到 Nginx 是接收了所有的請求進行負載均衡的,而對于 Ribbon 來說它是在消費者端進行的負載均衡。如下圖。

請注意 Request 的位置,在 Nginx 中請求是先進入負載均衡器,而在 Ribbon 中是先在客戶端進行負載均衡才進行請求的。

Ribbon 的幾種負載均衡算法

負載均衡,不管 Nginx 還是 Ribbon 都需要其算法的支持,如果我沒記錯的話 Nginx 使用的是 輪詢和加權(quán)輪詢算法。而在 Ribbon 中有更多的負載均衡調(diào)度算法,其默認是使用的 RoundRobinRule 輪詢策略。

  • RoundRobinRule :輪詢策略。Ribbon 默認采用的策略。若經(jīng)過一輪輪詢沒有找到可用的 provider,其最多輪詢 10 輪。若最終還沒有找到,則返回 null。
  • RandomRule : 隨機策略,從所有可用的 provider 中隨機選擇一個。
  • RetryRule : 重試策略。先按照 RoundRobinRule 策略獲取 provider,若獲取失敗,則在指定的時限內(nèi)重試。默認的時限為 500 毫秒。

??? 還有很多,這里不一一舉?了,你最需要知道的是默認輪詢算法,并且可以更換默認的負載均衡算法,只需要在配置文件中做出修改就行。

providerName:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

當然,在 Ribbon 中你還可以自定義負載均衡算法 ,你只需要實現(xiàn) IRule 接口,然后修改配置文件或者自定義 Java Config 類。

什么是 Open Feign

有了 Eureka,RestTemplate,Ribbon 我們就可以?愉快地進行服務(wù)間的調(diào)用了,但是使用 RestTemplate 還是不方便,我們每次都要進行這樣的調(diào)用。

@Autowired
private RestTemplate restTemplate;
// 這里是提供者A的ip地址,但是如果使用了 Eureka 那么就應(yīng)該是提供者A的名稱
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";

@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {
String url = SERVICE_PROVIDER_A + "/service1";
// 是不是太麻煩了???每次都要 url、請求、返回類型的
return restTemplate.postForObject(url, request, Boolean.class);
}

這樣每次都調(diào)用 RestRemplateAPI 是否太麻煩,我能不能像調(diào)用原來代碼一樣進行各個服務(wù)間的調(diào)用呢?

???聰明的小朋友肯定想到了,那就用 映射 呀,就像域名和IP地址的映射。我們可以將被調(diào)用的服務(wù)代碼映射到消費者端,這樣我們就可以 “無縫開發(fā)” 啦。

OpenFeign 也是運行在消費者端的,使用 Ribbon 進行負載均衡,所以 OpenFeign 直接內(nèi)置了 Ribbon。

在導入了 Open Feign 之后我們就可以進行愉快編寫 ?Consumer 端代碼了。

// 使用 @FeignClient 注解來指定提供者的名字
@FeignClient(value = "eureka-client-provider")
public interface TestClient {
// 這里一定要注意需要使用的是提供者那端的請求相對路徑,這里就相當于映射了
@RequestMapping(value = "/provider/xxx",
method = RequestMethod.POST)
CommonResponse> getPlans(@RequestBody planGetRequest request);
}

然后我們在 Controller 就可以像原來調(diào)用 Service 層代碼一樣調(diào)用它了。

@RestController
public class TestController {
// 這里就相當于原來自動注入的 Service
@Autowired
private TestClient testClient;
// controller 調(diào)用 service 層代碼
@RequestMapping(value = "/test", method = RequestMethod.POST)
public CommonResponse> get(@RequestBody planGetRequest request) {
return testClient.getPlans(request);
}
}

必不可少的 Hystrix

什么是 Hystrix之熔斷和降級

在分布式環(huán)境中,不可避免地會有許多服務(wù)依賴項中的某些失敗。Hystrix是一個庫,可通過添加等待時間容限和容錯邏輯來幫助您控制這些分布式服務(wù)之間的交互。Hystrix通過隔離服務(wù)之間的訪問點,停止服務(wù)之間的級聯(lián)故障并提供后備選項來實現(xiàn)此目的,所有這些都可以提高系統(tǒng)的整體彈性。

總體來說?Hystrix?就是一個能進行?熔斷?和?降級?的庫,通過使用它能提高整個系統(tǒng)的彈性。

那么什么是 熔斷和降級 呢?再舉個?,此時我們整個微服務(wù)系統(tǒng)是這樣的。服務(wù)A調(diào)用了服務(wù)B,服務(wù)B再調(diào)用了服務(wù)C,但是因為某些原因,服務(wù)C頂不住了,這個時候大量請求會在服務(wù)C阻塞。

服務(wù)C阻塞了還好,畢竟只是一個系統(tǒng)崩潰了。但是請注意這個時候因為服務(wù)C不能返回響應(yīng),那么服務(wù)B調(diào)用服務(wù)C的的請求就會阻塞,同理服務(wù)B阻塞了,那么服務(wù)A也會阻塞崩潰。

請注意,為什么阻塞會崩潰。因為這些請求會消耗占用系統(tǒng)的線程、IO 等資源,消耗完你這個系統(tǒng)服務(wù)器不就崩了么。

這就叫 服務(wù)雪崩 。媽耶,上面兩個 熔斷降級 你都沒給我解釋清楚,你現(xiàn)在又給我扯什么 服務(wù)雪崩 ????

別急,聽我慢慢道來。

不聽我也得講下去!

所謂 熔斷 就是服務(wù)雪崩的一種有效解決方案。當指定時間窗內(nèi)的請求失敗率達到設(shè)定閾值時,系統(tǒng)將通過 斷路器 直接將此請求鏈路斷開。
也就是我們上面服務(wù)B調(diào)用服務(wù)C在指定時間窗內(nèi),調(diào)用的失敗率到達了一定的值,那么 Hystrix 則會自動將 服務(wù)B與C 之間的請求都斷了,以免導致服務(wù)雪崩現(xiàn)象。


其實這里所講的 熔斷 就是指的 Hystrix 中的 斷路器模式 ,你可以使用簡單的 @HystrixCommand 注解來標注某個方法,這樣 Hystrix 就會使用 斷路器 來“包裝”這個方法,每當調(diào)用時間超過指定時間時(默認為1000ms),斷路器將會中斷對這個方法的調(diào)用。

當然你可以對這個注解的很多屬性進行設(shè)置,比如設(shè)置超時時間,像這樣。

@HystrixCommand(
commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1200")}
)
public List getXxxx() {
// ...省略代碼邏輯
}

但是,我查閱了一些博客,發(fā)現(xiàn)他們都將 熔斷降級 的概念混淆了,以我的理解,降級是為了更好的用戶體驗,當一個方法調(diào)用異常時,通過執(zhí)行另一種代碼邏輯來給用戶友好的回復(fù) 。這也就對應(yīng)著Hystrix后備處理 模式。你可以通過設(shè)置 fallbackMethod 來給一個方法設(shè)置備用的代碼邏輯。比如這個時候有一個熱點新聞出現(xiàn)了,我們會推薦給用戶查看詳情,然后用戶會通過id去查詢新聞的詳情,但是因為這條新聞太火了(比如最近什么*易對吧),大量用戶同時訪問可能會導致系統(tǒng)崩潰,那么我們就進行 服務(wù)降級 ,一些請求會做一些降級處理比如當前人數(shù)太多請稍后查看等等。

// 指定了后備方法調(diào)用
@HystrixCommand(fallbackMethod = "getHystrixNews")
@GetMapping("/get/news")
public News getNews(@PathVariable("id") int id) {
// 調(diào)用新聞系統(tǒng)的獲取新聞api 代碼邏輯省略
}
//
public News getHystrixNews(@PathVariable("id") int id) {
// 做服務(wù)降級
// 返回當前人數(shù)太多,請稍后查看
}

什么是Hystrix之其他

我在閱讀 《Spring微服務(wù)實戰(zhàn)》這本書的時候還接觸到了一個艙壁模式 的概念。在不使用艙壁模式的情況下,服務(wù)A調(diào)用服務(wù)B,這種調(diào)用默認的是使用同一批線程來執(zhí)行 的,而在一個服務(wù)出現(xiàn)性能問題的時候,就會出現(xiàn)所有線程被刷爆并等待處理工作,同時阻塞新請求,最終導致程序崩潰。而艙壁模式會將遠程資源調(diào)用隔離在他們自己的線程池中,以便可以控制單個表現(xiàn)不佳的服務(wù),而不會使該程序崩潰。

具體其原理我推薦大家自己去了解一下,本篇文章中對艙壁模式 不做過多解釋。當然還有 Hystrix?儀表盤 ,它是用來實時監(jiān)控Hystrix?的各項指標信息的 ,這里我將這個問題也拋出去,希望有不了解的可以自己去搜索一下。

微服務(wù)網(wǎng)關(guān)——Zuul

ZUUL 是從設(shè)備和 web 站點到 Netflix 流應(yīng)用后端的所有請求的前門。作為邊界服務(wù)應(yīng)用,ZUUL 是為了實現(xiàn)動態(tài)路由、監(jiān)視、彈性和安全性而構(gòu)建的。它還具有根據(jù)情況將請求路由到多個 Amazon Auto Scaling Groups(亞馬遜自動縮放組,亞馬遜的一種云計算方式) 的能力

在上面我們學習了 Eureka 之后我們知道了 服務(wù)提供者消費者 通過 Eureka Server 進行訪問的,即 EurekaServer服務(wù)提供者 的統(tǒng)一入口。那么整個應(yīng)用中存在那么多 消費者 需要用戶進行調(diào)用,這個時候用戶該怎樣訪問這些 消費者工程 呢?當然可以像之前那樣直接訪問這些工程。但這種方式?jīng)]有統(tǒng)一的消費者工程調(diào)用入口,不便于訪問與管理,而 Zuul 就是這樣的一個對于 消費者 的統(tǒng)一入口。

如果學過前端的肯定都知道 Router 吧,比如 Flutter 中的路由,Vue,React中的路由,用了 Zuul 你會發(fā)現(xiàn)在路由功能方面和前端配置路由基本是一個理。? 我偶爾擼擼 Flutter。

大家對網(wǎng)關(guān)應(yīng)該很熟吧,簡單來講網(wǎng)關(guān)是系統(tǒng)唯一對外的入口,介于客戶端與服務(wù)器端之間,用于對請求進行鑒權(quán) 、限流 、 路由 、監(jiān)控 等功能。

沒錯,網(wǎng)關(guān)有的功能,Zuul 基本都有。而 Zuul 中最關(guān)鍵的就是 路由和過濾器 了,在官方文檔中 Zuul 的標題就是

Router and Filter : Zuul

Zuul 的路由功能

簡單配置

本來想給你們復(fù)制一些代碼,但是想了想,因為各個代碼配置比較零散,看起來也比較零散,我決定還是給你們畫個圖來解釋吧。

請不要因為我這么好就給我點贊 ? 。瘋狂暗示。

比如這個時候我們已經(jīng)向 Eureka Server 注冊了兩個 Consumer 、三個 Provicer ,這個時候我們再加個 Zuul 網(wǎng)關(guān)應(yīng)該變成這樣子了。

emmm,信息量有點大,我來解釋一下。關(guān)于前面的知識我就不解釋了? 。

首先,Zuul 需要向 Eureka 進行注冊,注冊有啥好處呢?

你傻呀,Consumer 都向 Eureka Server 進行注冊了,我網(wǎng)關(guān)是不是只要注冊就能拿到所有 Consumer 的信息了?

拿到信息有什么好處呢?

我拿到信息我是不是可以獲取所有的 Consumer 的元數(shù)據(jù)(名稱,ip,端口)?

拿到這些元數(shù)據(jù)有什么好處呢?拿到了我們是不是直接可以做路由映射 ?比如原來用戶調(diào)用 Consumer1 的接口 localhost:8001/studentInfo/update 這個請求,我們是不是可以這樣進行調(diào)用了呢?localhost:9000/consumer1/studentInfo/update 呢?你這樣是不是恍然大悟了?

這里的url為了讓更多人看懂所以沒有使用 restful 風格。

上面的你理解了,那么就能理解關(guān)于 Zuul 最基本的配置了,看下面。

server:
port: 9000
eureka:
client:
service-url:
# 這里只要注冊 Eureka 就行了
defaultZone: http://localhost:9997/eureka

然后在啟動類上加入 @EnableZuulProxy 注解就行了。沒錯,就是那么簡單?。

統(tǒng)一前綴

這個很簡單,就是我們可以在前面加一個統(tǒng)一的前綴,比如我們剛剛調(diào)用的是 localhost:9000/consumer1/studentInfo/update,這個時候我們在 yaml 配置文件中添加如下。

zuul:
prefix: /zuul

這樣我們就需要通過 localhost:9000/zuul/consumer1/studentInfo/update 來進行訪問了。

路由策略配置

你會發(fā)現(xiàn)前面的訪問方式(直接使用服務(wù)名),需要將微服務(wù)名稱暴露給用戶,會存在安全性問題。所以,可以自定義路徑來替代微服務(wù)名稱,即自定義路由策略。

zuul:
routes:
consumer1: /FrancisQ1/**
consumer2: /FrancisQ2/**

這個時候你就可以使用 localhost:9000/zuul/FrancisQ1/studentInfo/update 進行訪問了。

服務(wù)名屏蔽

這個時候你別以為你好了,你可以試試,在你配置完路由策略之后使用微服務(wù)名稱還是可以訪問的,這個時候你需要將服務(wù)名屏蔽。

zuul:
ignore-services: "*"

路徑屏蔽

Zuul 還可以指定屏蔽掉的路徑 URI,即只要用戶請求中包含指定的 URI 路徑,那么該請求將無法訪問到指定的服務(wù)。通過該方式可以限制用戶的權(quán)限。

zuul:
ignore-patterns: **/auto/**

這樣關(guān)于 auto 的請求我們就可以過濾掉了。

** 代表匹配多級任意路徑

*代表匹配一級任意路徑

敏感請求頭屏蔽

默認情況下,像 Cookie、Set-Cookie 等敏感請求頭信息會被 zuul 屏蔽掉,我們可以將這些默認屏蔽去掉,當然,也可以添加要屏蔽的請求頭。

Zuul 的過濾功能

如果說,路由功能是 Zuul 的基操的話,那么過濾器 就是 Zuul的利器了。畢竟所有請求都經(jīng)過網(wǎng)關(guān)(Zuul),那么我們可以進行各種過濾,這樣我們就能實現(xiàn) 限流 ,灰度發(fā)布 ,權(quán)限控制 等等。

簡單實現(xiàn)一個請求時間日志打印

要實現(xiàn)自己定義的 Filter 我們只需要繼承 ZuulFilter 然后將這個過濾器類以 @Component 注解加入 Spring 容器中就行了。

在給你們看代碼之前我先給你們解釋一下關(guān)于過濾器的一些注意點。

過濾器類型:Pre、Routing、Post。前置Pre就是在請求之前進行過濾,Routing路由過濾器就是我們上面所講的路由策略,而Post后置過濾器就是在 Response 之前進行過濾的過濾器。你可以觀察上圖結(jié)合著理解,并且下面我會給出相應(yīng)的注釋。

// 加入Spring容器
@Component
public class PreRequestFilter extends ZuulFilter {
// 返回過濾器類型 這里是前置過濾器
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
// 指定過濾順序 越小越先執(zhí)行,這里第一個執(zhí)行
// 當然不是只真正第一個 在Zuul內(nèi)置中有其他過濾器會先執(zhí)行
// 那是寫死的 比如 SERVLET_DETECTION_FILTER_ORDER = -3
@Override
public int filterOrder() {
return 0;
}
// 什么時候該進行過濾
// 這里我們可以進行一些判斷,這樣我們就可以過濾掉一些不符合規(guī)定的請求等等
@Override
public boolean shouldFilter() {
return true;
}
// 如果過濾器允許通過則怎么進行處理
@Override
public Object run() throws ZuulException {
// 這里我設(shè)置了全局的RequestContext并記錄了請求開始時間
RequestContext ctx = RequestContext.getCurrentContext();
ctx.set("startTime", System.currentTimeMillis());
return null;
}
}

// lombok的日志
@Slf4j
// 加入 Spring 容器
@Component
public class AccessLogFilter extends ZuulFilter {
// 指定該過濾器的過濾類型
// 此時是后置過濾器
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
// SEND_RESPONSE_FILTER_ORDER 是最后一個過濾器
// 我們此過濾器在它之前執(zhí)行
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
// 過濾時執(zhí)行的策略
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
// 從RequestContext獲取原先的開始時間 并通過它計算整個時間間隔
Long startTime = (Long) context.get("startTime");
// 這里我可以獲取HttpServletRequest來獲取URI并且打印出來
String uri = request.getRequestURI();
long duration = System.currentTimeMillis() - startTime;
log.info("uri: " + uri + ", duration: " + duration / 100 + "ms");
return null;
}
}

上面就簡單實現(xiàn)了請求時間日志打印功能,你有沒有感受到 Zuul 過濾功能的強大了呢?

沒有?好的、那我們再來。

令牌桶限流

當然不僅僅是令牌桶限流方式,Zuul 只要是限流的活它都能干,這里我只是簡單舉個?。

我先來解釋一下什么是 令牌桶限流 吧。

首先我們會有個桶,如果里面沒有滿那么就會以一定 固定的速率 會往里面放令牌,一個請求過來首先要從桶中獲取令牌,如果沒有獲取到,那么這個請求就拒絕,如果獲取到那么就放行。很簡單吧,啊哈哈、

下面我們就通過 Zuul 的前置過濾器來實現(xiàn)一下令牌桶限流。

@Component
@Slf4j
public class RouteFilter extends ZuulFilter {
// 定義一個令牌桶,每秒產(chǎn)生2個令牌,即每秒最多處理2個請求
private static final RateLimiter RATE_LIMITER = RateLimiter.create(2);
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}

@Override
public int filterOrder() {
return -5;
}

@Override
public Object run() throws ZuulException {
log.info("放行");
return null;
}

@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
if(!RATE_LIMITER.tryAcquire()) {
log.warn("訪問量超載");
// 指定當前請求未通過過濾
context.setSendZuulResponse(false);
// 向客戶端返回響應(yīng)碼429,請求數(shù)量過多
context.setResponseStatusCode(429);
return false;
}
return true;
}
}

這樣我們就能將請求數(shù)量控制在一秒兩個,有沒有覺得很酷?

關(guān)于 Zuul ?的其他

Zuul 的過濾器的功能肯定不止上面我所實現(xiàn)的兩種,它還可以實現(xiàn) 權(quán)限校驗 ,包括我上面提到的 灰度發(fā)布 等等。

當然,Zuul 作為網(wǎng)關(guān)肯定也存在 單點問題 ,如果我們要保證 Zuul 的高可用,我們就需要進行 Zuul 的集群配置,這個時候可以借助額外的一些負載均衡器比如 Nginx 。

Spring Cloud配置管理——Config

為什么要使用進行配置管理?

當我們的微服務(wù)系統(tǒng)開始慢慢地龐大起來,那么多 Consumer 、ProviderEureka?Server 、Zuul 系統(tǒng)都會持有自己的配置,這個時候我們在項目運行的時候可能需要更改某些應(yīng)用的配置,如果我們不進行配置的統(tǒng)一管理,我們只能去每個應(yīng)用下一個一個尋找配置文件然后修改配置文件再重啟應(yīng)用 。

首先對于分布式系統(tǒng)而言我們就不應(yīng)該去每個應(yīng)用下去分別修改配置文件,再者對于重啟應(yīng)用來說,服務(wù)無法訪問所以直接拋棄了可用性,這是我們更不愿見到的。

那么有沒有一種方法既能對配置文件統(tǒng)一地進行管理,又能在項目運行時動態(tài)修改配置文件呢?

那就是我今天所要介紹的 Spring Cloud Config 。

能進行配置管理的框架不止 Spring Cloud Config 一種,大家可以根據(jù)需求自己選擇(disconf,阿波羅等等)。而且對于 Config 來說有些地方實現(xiàn)的不是那么盡人意。

Config 是什么

Spring Cloud Config 為分布式系統(tǒng)中的外部化配置提供服務(wù)器和客戶端支持。使用 Config 服務(wù)器,可以在中心位置管理所有環(huán)境中應(yīng)用程序的外部屬性。

簡單來說,Spring Cloud Config 就是能將各個 應(yīng)用/系統(tǒng)/模塊 的配置文件存放到 統(tǒng)一的地方然后進行管理 (Git 或者 SVN)。

你想一下,我們的應(yīng)用是不是只有啟動的時候才會進行配置文件的加載,那么我們的 Spring Cloud Config 就暴露出一個接口給啟動應(yīng)用來獲取它所想要的配置文件,應(yīng)用獲取到配置文件然后再進行它的初始化工作。就如下圖。

當然這里你肯定還會有一個疑問,如果我在應(yīng)用運行時去更改遠程配置倉庫(Git)中的對應(yīng)配置文件,那么依賴于這個配置文件的已啟動的應(yīng)用會不會進行其相應(yīng)配置的更改呢?

答案是不會的。

什么?那怎么進行動態(tài)修改配置文件呢?這不是出現(xiàn)了 配置漂移 嗎?你個渣男?,你又騙我!

別急嘛,你可以使用 Webhooks ,這是 ?github 提供的功能,它能確保遠程庫的配置文件更新后客戶端中的配置信息也得到更新。

噢噢,這還差不多。我去查查怎么用。

慢著,聽我說完,Webhooks 雖然能解決,但是你了解一下會發(fā)現(xiàn)它根本不適合用于生產(chǎn)環(huán)境,所以基本不會使用它的。

而一般我們會使用 Bus 消息總線 + Spring Cloud Config 進行配置的動態(tài)刷新。

引出 Spring Cloud Bus

用于將服務(wù)和服務(wù)實例與分布式消息系統(tǒng)鏈接在一起的事件總線。在集群中傳播狀態(tài)更改很有用(例如配置更改事件)。

你可以簡單理解為 Spring Cloud Bus 的作用就是管理和廣播分布式系統(tǒng)中的消息 ,也就是消息引擎系統(tǒng)中的廣播模式。當然作為 消息總線Spring Cloud Bus 可以做很多事而不僅僅是客戶端的配置刷新功能。

而擁有了 Spring Cloud Bus 之后,我們只需要創(chuàng)建一個簡單的請求,并且加上 @ResfreshScope 注解就能進行配置的動態(tài)修改了,下面我畫了張圖供你理解。

總結(jié)

這篇文章中我?guī)Т蠹页醪搅私饬?Spring Cloud 的各個組件,他們有

  • Eureka 服務(wù)發(fā)現(xiàn)框架
  • Ribbon 進程內(nèi)負載均衡器
  • Open Feign 服務(wù)調(diào)用映射
  • Hystrix 服務(wù)降級熔斷器
  • Zuul 微服務(wù)網(wǎng)關(guān)
  • Config 微服務(wù)統(tǒng)一配置中心
  • Bus 消息總線

如果你能這個時候能看懂下面那張圖,也就說明了你已經(jīng)對 Spring Cloud 微服務(wù)有了一定的架構(gòu)認識。

(完)

·END·

如果您喜歡本文,歡迎點擊右上角,把文章分享到朋友圈~~



如有收獲,請劃至底部,點擊“在看”,謝!

歡迎長按下圖關(guān)注公眾號

瀏覽 38
點贊
評論
收藏
分享

手機掃一掃分享

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

手機掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 在线日韩国产| 成人免看一级a一片| 在线观看亚| 亚洲日本高清| 1插菊花综合网| 日韩午夜在线观看| 人人澡人人爽人人精品| 色婷婷黄色| 成人在线一区二区三区| 日韩一二三四区| 大香蕉一区二区| 精品免费一区二区三区四区| 无码爱爱视频| 无套内射在线免费观看| 日韩中文无码字幕| 狼友视频在线观看18| 成人黄网站在线观看| 密臀AV在线| 女侠吕四娘第二部| 久草久热| 欧美精品99久久久| 精品一区二区三区四区学生| 大香蕉网伊| 亚洲综合社区在线| 中文无码观看| 特级西西西西4444级酉西88wwww特| 91视频黄| 台湾一区二区| 日本成片网| 天天搞天天搞| 亚洲视频在线观看免费| 国产成人777777精品综合| 天天操综合| 亚洲成人第一网站| 日韩精品91| www日韩无码| 欧美日韩免费视频| 色五月激情五月| 躁BBB躁BBB躁BBBBBB日视频| 日韩福利电影| 国产婬片一级A片AAA毛片AⅤ | 手机av在线观看| 婷婷久久久| 欧美日韩字幕| 操逼在线视频| 欧美高潮| 婷婷色图| 亚洲视频大全| 夜夜骚精品人妻av一区| 蜜臀久久久99久久久久久久| 亚洲精品乱码| 麻豆www| 影音AV| 操逼操逼操逼操逼操逼操逼| 国产香蕉网| 久久五月天视频| 成人AV中文解说水果派| 大鸡巴操小逼视频| 中文字幕不卡在线| 久久艹精品视频| 中文字幕AⅤ在线| 青草在线视频| 一区二区三区高清| 五月婷婷五月丁香| 大香蕉91| 97免费在线观看视频| 操少妇| 97免费视频在线观看| 九九九精品视频| 午夜专区| 这里只有精品视频| 毛片久久久| 日韩99在线观看| 午夜成人鲁丝片午夜精品| 婷婷五月18永久免费视频| 插菊花综合网3| 亚洲香蕉视频网站| 国产精品久久久久久久久久王安宇| 九色91PORNY国产| 91狠狠综合久久| 人人超碰在线| 丁香六月婷婷| 亚洲毛片在线| 日逼老女人| 伊人网视频在线| 高清无码视频免费在线观看| 免费超碰| 撸久久| 日韩欧美黄色片| 图片区视频区小说区| A片在线观看网站| 欧美激情伊人久久五月天| 青草福利在线| 久久久老熟女一区二区三区91| 中文字幕人妻无码| 免费人成在线观看视频播放| 人妻无码中文字幕免费视频蜜桃| 国产中文在线视频| 99久99| 一级黄色视频网站| 五月婷婷色播| 日韩va亚洲va欧美va高清| 怡红院视频| 欧美69p| 成人精东影业JDAV3密友| 99伊人网| 91原创国产内射| 姐弟乱伦性爱| 男人天堂社区| 视频你懂的| 黄色视频| 嫩BBB揍BBB揍BBB| 精品人妻在线| 日韩人妻无码专区一区二区| 免费黄片网站在线观看| 91精品久久久久久久久久久久| 综合导航无码| 亚洲午夜成人| 精品人伦一区二区三区| 91无码高清视频| 强伦轩一区二区三区四区播放方式 | 一区二区三区国产精品| 夜夜骚AV一二三区无码| 超碰99热| 国产成人一区二区无码| 激情男人网| 国产毛片基地| 亚洲草逼| 一卡二卡三卡无码| 国产精品成人国产乱| 亚洲免费黄色片| 蝌蚪窝视频在线观看| 综合天堂| 俺来也俺去也| 亚洲精品久久久蜜桃| 男女网站在线观看| 成人性生活免费视频| 淫荡人妻视频| 大地中文资源5页的更新内容| www.97yy| 韩国精品无码一区二区三区18 | 人妻丰满熟妇av无码| 欧美猛男的大鷄巴| 黄色视频网站免费在线观看| 9999国产精品| 伊人大香蕉精品| 国产青娱乐在线视频| 大香蕉国产在线| 国产黄色精品视频| 天天视频国产| 波多野结衣操逼| 超碰在线网| 91人人澡| 亚洲AV观看| 熟女人妻在线观看| 91亚洲国产成人精品一区二区三 | 黄色国产网站| 无码九九九| 欧美成人片免费看| 99激情| 蜜桃91精品秘成人取精库| 东方av在线免费观看| 蜜桃久久精品成人无码AV| 佐山爱人妻无码蜜桃| 国产在线一区二区| 操逼大香蕉| 久久免费国产视频| 波多野结衣高清视频| 欧美性爱在线网站| 18禁黄网站| 国模精品无码一区二区免费蜜桃| 欧洲亚洲视频| 亚洲精选一区二区三区| 荫蒂添的高潮免费视频| 久久久久久黄片| 黄色片免费视频网站| 国产a区| 国产亚洲视频在线观看| 在线播放JUY-925被丈夫上司侵犯的第7天 | 色呦呦中文字幕| 风流少妇一区二区三区91| 国产精品内射视频| 人人妻人人上| 人人操人人爱人人摸| 男人天堂成人| 五月婷婷丁香| 国产精品毛片久久久久久久| 草逼的视频| 婷婷色色婷婷| av免费网址| 精品久久一区二区三区四区| 99久热在线精品| 影音先锋黄色资源| 天天色人人| 麻豆传媒一区| 欧美日韩高清一区| 超碰在线观看2407| 久久久久久久久国产| 欧美黄色精品| 色色激情五月天| 久久综合17p| 中文字幕国产在线观看| 狼友在线播放| 欧美试看| 99久久人妻无码中文字幕系列| 91视频美女| 日本少妇性爱视频| 亚洲视频99| 天天日天天爱| 成人三级片视频| 国产乱婬AV片免费| 日韩毛片在线视频x| 国产欧美激情| 米奇7777狠狠狠狠| 久操播放器| 日韩在线| 操一炮在线视频| 欧美激情伊人久久五月天| 美女网站黄| 日韩精品在线视频| 亚洲无码在线播放| 女人卖婬视频播放| 亚洲福利视频电影精| 亚洲福利视频电影精| 日本高清视频网站网wwwwww| 国产美女精品久久AV爽| 麻豆蜜桃wwww精品无码| 1024黄| 日韩插插| 东京热网站在线观看| 精品国产一区二区三区性色AV| 91国黄色毛片在线观看| 天天躁狠狠躁av| 日韩二| 国产激情内射| 亚洲视频A| 欧美日韩综合网| 小草一区| 久久婷婷国产麻豆91天堂| 免费无码在线播放| 日韩a片在线观看| 奇米色五月| 青娱乐91| 大香蕉操逼| 亚洲综合伊人| 欧美在线国产| 免费观看成人毛片A片直播千姿| 女公务员人妻呻吟求饶| 国产成人tv| 九九re精品视频在线观看| 免费在线观看亚洲| 国产中文字幕av| av网站在线免费观看| 淫色淫香综合网| 91亚洲一线产区二线产区| 黄色视频视频| 九九色综合| A区性愛社区| 小黄片在线免费观看| 蜜桃人妻无码AV天堂二区| 国产成人综合在线| 做爰视频毛片下载蜜桃视频。| 黄色毛片电影| 免费性爱视频网站| 操逼的视频| 精品中文在线视频| 中文无码高清在线| 国产av日韩av| 亚洲中文字幕视频在线| 五月婷婷网站| 图片区视频区小说区| 中文字幕免费观看| 国产精品成人3p一区二区三区| 欧亚一区二区| 日日操日日摸| 亚洲制服在线观看| 欧美自拍偷拍| 欧美国产成人在线| 欧美中文网| 人妻AV一区| 九九操逼| 欧美性爱一区| 肏逼网站在线观看| 在线观看不卡av| 一区二区经典| 色爽av| 免费日逼| 五月影院| 国产日韩欧美91| 亚洲成人内射| 九九色影院| 影音先锋人妻限定| 嫩草A片www在线观看| 另类老妇奶性BBWBBwBBw| 亚洲精品成AV人片天堂无码| 人妻AV在线| 欧美成人精品无| 91成人视频免费观看| 综合久久中文字幕| 成人在线视频播放| 亚洲精品成人av| a片网站在线观看| 国产又爽又黄A片| 男女拍拍免费视频| 欧美老妇另类老屁XXX| 亚洲国产成人在线| 中文字幕巨肉乱码中文乱码| 亚洲无码成人在线观看| 99在线免费观看视频| 国产色自拍| 精品乱子伦| 97国产精品视频| 午夜操p| 亚洲AV毛片成人精品网站| 亚洲黄色视频在线| 日本无码一区二区三三| 熟女视频一区二区| 人人妻人人插| 手机看片久久| 国产人妻人伦精品1国产丝袜| 日韩黄网站| 草逼网址| 91成人毛片| 婷婷五月色综合| 大香蕉在线精品视频| 福利黄色片:片| 亚洲性爱在线视频| 欧美精品99久久久| 围内精品久久久久久久久白丝制服 | 无码一区二区区| 一区二区三区无码免费| 91精产国品一二| 亚洲AV无码久久寂寞少妇多毛| 亚洲视频免费播放| 91免费在线视频观看| 亚洲aⅴ| 男人的天堂在线视频| 97爱视频| 亚洲无码一区二区三区| 日韩视频免费观看高清完整版在线观| 黄色国产网站| 久久久福利| 国产欧美一区二区三区特黄手机版| 色九九九九| 日批视频| 国产一区在线看| 日韩A片在线观看| 黄片网站入口| 色五月婷婷综合| 青娱乐亚洲精品视频| 亚洲福利视频网站| 午夜操逼| chinese搡老熟老妇人| 亚洲欧美在线播放| 一级a免一级a做免费线看内裤| 一级片学生妹| 小處女末发育嫩苞AV| a片视频免费观看| 安微妇搡BBBB搡BBBB| 亚洲福利| 草久热| 夜色福利在线| www.a日逼| 激情五月婷婷综合| 久久亚洲成人| 蜜桃人妻无码AV天堂二区| 久热婷婷| 99精品色| 黄色片免费视频网站| 北条麻妃99精品| 亚洲AAA电影| 女生自慰网站免费| 乱伦三区| 91成人A片| 国产艹逼| 国产一级免费在线观看| 欧美丰满人妻| 天堂网中文在线| 大香蕉网伊| 国产精品亚洲一区| 精品人妻二区中文字幕| 国产精品色情A级毛片| 人妻少妇无码视频| 扒开让我91看片在线看| 江苏妇搡BBB搡BBBB| 一区二区三区电影| 亚洲va在线∨a天堂va欧美va | www.操逼网| 国产在线观看国产精品产拍| 免费无码一区二区三区四区五区 | 欧美成人精品欧美一级乱黄| 免费在线观看黄片视频| 午夜小电影| 成人动漫免费观看| 亚洲激情综合网| 精品一区二区三区四区五区| 成人肏屄视频| 一本色道久久88亚洲精品综合| 欧美一级黄色电影| 久久久久99精品成人片三人毛片 | 99久久爱re热6在播放| 人人草人人看| 日韩一级片在线| 91视频在线观看| 午夜天堂精品久久| 夜夜嗨av一区二区三区| 久久久精品人妻| 亚洲福利视频网站| 51午夜福利| 亚洲一级Av无码毛片久久精品| 不卡日韩| www人人操| 熟女人妻人妻の视频| 久久er99| 日韩性爱视频在线播放| 国产又粗又长的视频| 豆花视频在线看| 加勒比日韩在线| 国产噜噜噜噜久久久久久久久| 亚洲操逼逼| 国产一区二区免费在线观看| 三级片无码在线播放| 日本熟妇无码一区二区| 麻豆三级电影| 亚洲av自拍| 少妇二区| 国产成人AV网站| 天堂在线中文网| 影音先锋成人| 黄色av免费观看| 影音先锋男人| 操b在线观看| 婷婷午夜福利| 青青草手机在线视频| 日本一级婬片免费放| 操青青| 日韩性爱视频在线观看| 久久久久久久AV| www.色老板| 日产精品久久久久| 欧美爱爱试看| 亚洲中文字幕免费观看| 囯产一级a一级a免费视频| 国产XXXXX| 国产无码AV| 黄色A片在线观看| av東熱激情东京热| 亚洲成人无码视频| 91视频在线免费看| 三级视频网址| 日本欧美一级| 激情五月丁香花| 欧美老妇另类老屁XXX| 五月天AV在线| 国产夫妻露脸| 国产精品成人影视| 中日韩精品A片中文字幕| 天天日天天操天天射| 影音先锋自拍| 激情综合网五月| 在线观看一区二区视频| 亚洲熟女av中文字幕| 毛片黄片| 51成人网站免费| 青青草手机在线观看| 337p粉嫩噜噜噜| 色色99| 波多野结衣av在线播放| 天天色色婷婷| 人人操超碰在线| 亚洲精品乱码久久久久久蜜桃欧美| 亚洲成人网站在线| 在线观看视频免费无码免费视频 | 国产成人视频在线播放| www操逼| 豆花av在线| 狼友视频一国产| 亚洲人妻一区二区| 91人人妻人人澡人人爽人人精品| 国产精品秘久久久久久网站| 大地av| 自拍偷拍无码| 亚洲日韩三级片| 亚洲Av秘无码一区二区| 亚洲青草视频| 亚洲欧洲免费视频| 91久久综合| 日韩欧美小电影| 久久精品视频在线免费观看| 日本免费A片| 激情久久久| 做爰视频毛片下载蜜桃视频| 国产精品视频导航| 亚洲无码视频在线观看高清 | 91蜜桃传媒在线观看| 在线播放毛片| 亚洲第一网无码性色| 久久久噜噜噜久久中文字幕色伊伊| 无码在线观看免费视频| 人人操人人看人人摸| 欧美三级精品| 成人做爰黄A片免费视频网站野外| 精品国产999久久久免费| 午夜操逼| 无码人妻丰满熟妇| 亚州天堂网| 天堂亚洲AV无码精品成人| 香蕉视频亚洲| 黄片视频在线播放| 日韩极品视频在线| 亚洲涩情91日韩一区二区| 国产系列精品AV| 99久久99久久99久久久99国产 | 亚洲成人视频网| 中国熟女网站| 国产乱伦电影| 久久精品视频99| 丝袜一区二区三区| 国产无码电影在线观看| 2025天天操夜夜操| 日本操逼视频| 国产AV三级片| 99热这里有精品| yw在线播放| 色综合久久88色综合| 亚洲在线视频网站| 天堂网址激情网址| 国产成人秘免费观看一区二区三区| 性满足BBWBBWBBW| 欧美日韩成人一区二区三区| 亚洲日韩欧美色图| 亚洲激情综合视频| 中字一区人妻水多多| 亚洲无码免费在线观看| 午夜福利电影AV| 东北女人毛多又黑A片| 成人午夜黄色| 成人免费无码婬片在线| 亚洲精品在线看| 红桃视频无码| 丁香婷婷综合网| 五月天婷婷在线观看视频| 亚洲AV五月天在线| 午夜福利1000| 精品亚洲一区二区三区四区五区 | 偷拍九九热| 亚洲欧美成人| 麻豆乱码国产一区二区三区| 成人毛片在线| 中文字幕在线网| 91久久精品无码一区| 国产精品久久久久久久久久久久久久久久 | 51嘿嘿嘿国产精品伦理| 久热9191| 国产黄色视频在线观看| AAA黄片| 国产一级a爱做片免费☆观看| 强开小嫩苞一区二区电影| 在线免费看黄网站| 丝瓜视频污APP| 欧美做爱网站| 另类罕见稀奇videos| 少妇搡BBBB搡BBB搡造水多| 久久午夜无码鲁丝片主演是谁| 免费看黄色的网站| 中文字幕无码精品三级在线欧美| 手机看片福利永久| 亚洲日韩精品中文字幕| 欧美日韩色图| 97国产精品视频人人做人人爱| 走光无码一区二区三区| 91新婚人妻偷拍| 亚洲去干网| 亚洲一区二区黄色电影视频网站 | www.俺去| 欧美日韩精品一区二区三区视频播放 | 黄色大片AV在线| 91成人视频在线观看| 亚洲视频在线看| 韩国高清无码视频| 无码人妻精品一区二区三千菊电影 | 亚洲欧美久久久久久久久久久久| 亚洲视频456| 超级碰碰碰碰碰碰碰碰碰| 欧美91| 中国女人操逼视频| 黄片99| 久热re| 中国操逼毛片| 夜夜操天天| 欧美大鸡吧视频| 性欧美成人播放77777| 國產美女AV操逼網站| 在线不卡视频| 69成人视频| 内射网站在线看| 婷婷色色五月| 五月丁香综合网| 四川女人毛多水多A片| 91在线免费视频观看| 国产女人18水真多18精品一级做 | 国产性猛交╳XXX乱大交| 黄色国产视频在线观看| 日本色中文字幕| 色五月婷婷丁香五月| 亚洲成人大香蕉视频| 北条麻妃一区二区三区-免费免费高清观看 | 在线一级片| 国精产品一区一区三区| 亚洲无码一二三区| 亚洲av| 性饥渴熟妇乱子伦| 欧美日色| 国产精品五月天| 三级片网站在线观看| 黄色视频在线免费观看网站| 日本黄色三级| 免费三级怡红院| 四虎最新地址| 成人中文字幕在线视频| 婷婷色大师| 久久国产精品影院| 国产AV日韩AⅤ亚洲AV中文| 在线免费观看国产| 一道本一区二区三区免费视频| 五月丁香啪啪啪| 国产欧美一区二区精品性色超碰 | av黄色网| 麻豆91精品91久久久停运原因| 少妇无码一区| 成人免费毛片片v| 中文字幕乱伦性爱| 午夜艹 | 男人操女人免费网站| jlzz18| 欧美黄色一级网站| 亚洲婷婷在线观看| 亚洲午夜福利视频在线观看| 18禁网站在线播放| 亚洲加勒比久久88色综合| 亚洲欧美日韩成人| 欧美中文字| 久久精品视频免费看| 免费观看黄片网站| 黄色视频大全在线观看| 人人爽人人爽人人| 无码国产99精品久久久久网站| 国产成人自拍视频在线| 日韩午夜无码| 操美女的网站| www.jiujiujiu| 懂色AV无码中字幕一区| 天天干天天日天天干天天日| 日本成人一区二区| 亚洲阿v天堂| 五月婷婷综合激情| 亚洲日韩欧美色图| 黄色一级视频在线观看| 国产aaaaaa| 久久婷婷婬片A片AAA| 色哟哟在线观看| 黄色电影天堂网| 国产老熟女久久久| 久久九热| 婷婷爱五月| 中文字幕日韩高清| 国产精品国产精品国产专区不| 久久久久久久久国产| 中文无码日本一级A片久久影视 | 欧美日韩高清无码| 亚洲综合视频在线观看| 99久视频| 青青草操逼视频| 色婷婷基地| 精品福利在线观看| 在线无码视频| 青青操成人| 久久大伊人| 国产乱伦影片| 婷婷另类小说| 日日夜夜精品| 韩国无码视频| 中文字幕在线看成人电影| 午夜AV大片| 国产AV无遮挡| 插菊花综合网亚洲| 淫色网址| 国产A片一区| 在线观看免费a片| 四虎www| 色猫咪av| 精品日逼| 精品77777| 欧美成人内射| 免费观看成人| 日韩久久免费视频| 91AV在线看| 亚洲成人A片| 午夜av在线| 亚洲免费网站| 亚洲s在线| 91黄色在线视频| 欧美日韩国产三级| 国产无遮挡又黄又爽又色视频软件 | 亚洲免费高清视频| 激情操逼| 一区二区视频免费| 日本AI高清无码在线观看网址| 农村新婚夜一级A片| 日韩高清一级免费| 日韩天堂在线播放| 国产精品卡一| 国产精品久久久久久无人区| 人妻av无码| 精品一区二区三区视频| 色婷婷AV一区二区三区之e本道| 97人妻在线视频| 欧美精品一二三区| 亚洲日韩视频在线观看| 亚洲成人av| 免费一级婬片AA片观看| 亚洲激情偷拍| 国产suv精品一区二区6精华液 | 黄色国产免费| 一级AA毛片| 精品欧美| 欧美成人免费| 激情小说亚洲图片:伦| 免费福利在线视频| 西西人体444www| 丰满人妻| 狠狠色五月亚洲91| 久久久久久久久久久成人| 日韩人妻在线视频| 日韩一级黄| 天堂一区| 91丝袜足交| 日本少妇高潮喷水XXXXXXX| 国产三级性爱视频| 国产三级片无码| 91黄色在线观看| 国产欧美综合视频| 日本三级在线| 黄色操逼网站?| 激情小视频在线| 国产精品视频导航| 国产av播放| 91无码AⅤ在线| 中文字幕五月久久| 亚州无码视频| 夜夜骚AV一二三区无码| 污视频在线| 亚洲天堂在线免费观看视频| 亚洲av大全| 青青草手机在线观看| 亚洲无码av在线播放| 大香蕉一区二区三区| 精品无码一区二区三区四区久久久软件 | 操少妇视频| 91视频播放| 正在播放亚洲| 日韩A级视频| 99免费小视频| 欧美性爱怡红院| 99热在线免费| 天天干天天日天天干| 婷婷免费| 欧美成人性爱影院| 91黑人丨人妻丨国产丨| 尤物com| 亚洲免费在线视频观看| 69视频在线观看| 黄网免费看| 特级西西WWW无码| 肏屄视频在线播放| 欧美熟妇性爱| 欧美操逼逼| 美女插插| 久久久久久久久毛片| 九九热8| 99无码国产成人精品| 强伦轩农村人妻| 中韩一区二区| 先锋AV资源在线| 无码专区中文字幕| 亚洲精品在线看| 91传媒在线观看| 国产18女人水真多免费看| 亚洲一区二区视频在线观看| 日本aa视频| 免费视频91蜜桃| 99中文字幕| 91免费在线视频观看| 激情小说在线视频| JULIA超乳JULIA无码| 翔田千里无码XXXXXX| 性色aV中文字幕| 狠狠se| 亚洲成人精品一区二区| 日韩小电影免费观看高清完整版在线观 | 怡春院在线| 嫩草在线观看| 午夜AV福利影院| 国产网站免费| 青青草在线播放| 国产成人精品一区二区| 99精品视频北条麻妃国产版| 成人精品一区日本无码网站suv/| 国产三级小视频| 男人网站| 日本三级片免费观看| 国产女人十八水真多| 欧美成人在线免费视频| 成人做爰黄A片免费看直播室动漫| 一区二区三区四区五区六区高清无吗视频| 一本大道久久久久| 69av在线观看视频| 无码精品人妻一区二区三区漫画| 丁香花在线小说免费全文| 天堂视频中文在线| 日产精品久久久一区二区| 777免费视频| 99精品在线观看| 伊人影院在线免费观看| 特黄AAAAAAAAA真人毛片| 搡BBBB| 18禁网址| 东北骚妇大战黑人视频| 人人插人人射| 成人无码网站| 麻豆成人片| 91.xxxx| 欧美丰满美乳XXⅩ高潮www| 人人看人人爽| 久久A√一区二区| 久久国产免费视频| 激情五月天影院| 辽宁模特张雪馨视频最新| 水蜜桃视频在线播放| 2025av在线| 亚洲综合中文| 狠狠撸狠狠撸| 成人免费在线网站| 欧美日韩操逼视频| 成人片成人网久久蜜桃臀| 俺来也俺去www色情网| AV天天看| 黄色电影免费在线观看| 亚洲日韩AV电影| 中文字幕35页| 亚洲秘无码一区二区三区av| 可以看的三级网站| 一级性爱毛片| 午夜成人在线观看| 日本在线一级片| 韩国无码一区二区| 北京熟妇槡BBBB槡BBBB| 免费中文视频| 18网站视频| 日韩中文字幕高清| 大香蕉电影网| 躁BBB躁BBB躁BBBBBB日视频| 色婷婷一区二区三区久久午夜| 51成人网站| 日韩无码一卡二卡| 久久嫩草国产成人一区| 亚洲视频第一页| 一级a黄片| 精品一区二区三区视频| 高潮喷水在线观看| 97超碰在线视| 一级黄色操逼视频| 中文无码在线播放| 国产极品无码| 日韩性做爰免费A片AA片| 久操大香蕉| 欧美色图在线观看视频| 日韩高清无码人妻| 国产又爽又黄免费视频免费观看 | 超碰97在线免费观看| 亚洲高清无码免费| 婷婷久久久久久| 五月婷婷色综合| 国产成人av| 国产淫荡视频| 国产妞干网| 草免费视频| 一级性爱毛片| 欧洲一区二区| 久久艹精品视频| 国产成人免费做爰视频| 黄片AV| 99精品在线播放| 性爱福利视频| 天天日毛片| 五月丁香婷婷基地| 草视频| 欧美熟女一区| 杨贵妃一级婬片90分钟| 国产熟妇码视频户外直播|