免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Spring Cloud Gateway動態(tài)路由實戰(zhàn):基于Nacos實現(xiàn)不重啟配置熱更新

Spring Cloud Gateway動態(tài)路由實戰(zhàn):基于Nacos實現(xiàn)不重啟配置熱更新 接手這個項目的時候我第一反應(yīng)是路由嘛寫死在配置文件里不就行了。直到有一次線上有一個新服務(wù)要接入網(wǎng)關(guān)按老流程改完application.yml重新發(fā)布結(jié)果恰好趕上業(yè)務(wù)高峰網(wǎng)關(guān)重啟那幾十秒所有經(jīng)過網(wǎng)關(guān)的請求直接502。從那之后我就明白了網(wǎng)關(guān)路由如果只能靠重啟生效那它就是整個微服務(wù)架構(gòu)里最脆弱的一環(huán)。這也是我為什么花時間把Spring Cloud Gateway的動態(tài)路由徹底捋了一遍。這篇文章是SpringCloud實戰(zhàn)系列的第十三篇專注講清楚一件事怎么讓Gateway在不重啟的情況下把新路由、改路由、刪路由全部在線完成。內(nèi)容會覆蓋動態(tài)路由的動機(jī)、三條主流實現(xiàn)路線的對比、基于Nacos落地動態(tài)路由的核心代碼、路由刷新的底層機(jī)制以及我上線后踩過的一堆坑。適合已經(jīng)跑通Gateway基礎(chǔ)用法、想把網(wǎng)關(guān)做得更工程化的同學(xué)參考。1. 靜態(tài)路由的僵局一次配置變更引發(fā)的連鎖反應(yīng)1.1 網(wǎng)關(guān)路由配置的真實痛點Spring Cloud Gateway最基礎(chǔ)的用法是在application.yml里這樣寫spring: cloud: gateway: routes: - id: order-service uri: lb://order-service predicates: - Path/order/** filters: - StripPrefix1這本身沒什么問題小規(guī)模項目完全夠用。但一旦微服務(wù)數(shù)量上來了你會碰到幾個很現(xiàn)實的問題。第一改動成本高。只要新增一個服務(wù)、調(diào)整一個路徑前綴、修改一次超時時間都得改配置然后重啟網(wǎng)關(guān)。微服務(wù)架構(gòu)里服務(wù)是高頻變動的新服務(wù)上線、舊服務(wù)拆分、接口路徑調(diào)整都是家常便飯每次都要重啟網(wǎng)關(guān)整個系統(tǒng)的入口就跟著抖動一次。第二配置膨脹嚴(yán)重。幾十上百條路由堆在application.yml里誰改過什么、為什么改、什么時候改的完全沒法追溯。我見過最夸張的項目路由配置文件三千多行review的時候根本沒人敢動。第三環(huán)境隔離差。開發(fā)、測試、生產(chǎn)環(huán)境的網(wǎng)關(guān)配置往往有差異靠profile區(qū)分還行但一旦某些公共路由需要保持一致配置維護(hù)就跟復(fù)制粘貼一樣痛苦。第四發(fā)布窗口限制。網(wǎng)關(guān)屬于核心基礎(chǔ)組件重啟需要走變更流程、評估影響面、選低峰期發(fā)布。一個新服務(wù)想接入網(wǎng)關(guān)要等一次完整的發(fā)版窗口這在業(yè)務(wù)快速迭代的團(tuán)隊里非常難受。1.2 動態(tài)路由到底解決什么問題所謂動態(tài)路由核心就一句話路由規(guī)則的增刪改查不依賴應(yīng)用重啟而是在運行期通過外部配置源實時生效。它解決的問題可以拆成幾個層面接入效率新服務(wù)上線往配置中心寫一條路由網(wǎng)關(guān)秒級刷新不用排隊等發(fā)布配置治理路由集中放到配置中心或數(shù)據(jù)庫有版本管理、有操作審計、可以回滾網(wǎng)關(guān)穩(wěn)定性避免因路由變更而重啟網(wǎng)關(guān)保障入口流量持續(xù)可用灰度與應(yīng)急可以在線把某個服務(wù)摘掉、掛維護(hù)頁、切流量到新集群從業(yè)務(wù)價值來看動態(tài)路由最大的意義不是省了一次重啟而是讓網(wǎng)關(guān)從靜態(tài)基礎(chǔ)設(shè)施變成了可實時編排的流量入口。你可以在大促前臨時加一條分流規(guī)則也可以在服務(wù)異常時快速摘流量這種靈活性在復(fù)雜環(huán)境里幾乎是剛需。2. 動態(tài)路由的三條路線輪詢、推送與事件監(jiān)聽確定要做動態(tài)路由之后接下來的問題是怎么讓Gateway拿到最新的路由配置。我調(diào)研和試過的主流方案大致可以分成三條路線。每條路線的取舍都不一樣這里把對比展開講講。2.1 路線一數(shù)據(jù)庫存儲加定時輪詢這個方案的思想很樸素路由配置存到MySQL里網(wǎng)關(guān)起一個定時任務(wù)每隔幾秒查一次路由表發(fā)現(xiàn)變化就刷新內(nèi)存中的路由定義。優(yōu)點很直接——實現(xiàn)簡單不用引入額外中間件只要你項目里本來就有MySQL就能跑。而且數(shù)據(jù)庫天然支持復(fù)雜的查詢和管理界面運營同學(xué)可以直接通過管理后臺增刪改路由。但它的問題也很明顯。輪詢間隔不好設(shè)間隔太短數(shù)據(jù)庫壓力大、網(wǎng)關(guān)頻繁重建路由間隔太長路由變更生效太慢失去了動態(tài)的意義。另外每次全量拉取路由表再對比差異在路由數(shù)量大的時候?qū)?shù)據(jù)庫和網(wǎng)關(guān)都是一個不小的負(fù)擔(dān)。還有一個隱患多實例網(wǎng)關(guān)部署時每個實例的輪詢時間點不一樣會導(dǎo)致一段時間內(nèi)各實例路由不一致流量被分發(fā)到不同規(guī)則上去。這個方案適合對生效延遲不敏感分鐘級可接受、團(tuán)隊不想引入額外中間件的場景。但如果你的網(wǎng)關(guān)是多實例部署我建議謹(jǐn)慎考慮一致性會讓你很頭疼。2.2 路線二Redis發(fā)布訂閱加主動刷新為了解決輪詢的延遲和一致性問題有人把路由配置放Redis利用Redis的Pub/Sub機(jī)制做變更通知。網(wǎng)關(guān)啟動時把路由數(shù)據(jù)加載到內(nèi)存訂閱一個專門的channel管理端修改路由后往channel里發(fā)一條消息所有網(wǎng)關(guān)實例收到消息后重新從Redis拉取路由并刷新。這個方案的延遲可以做到毫秒級而且通過Redis的訂閱發(fā)布天然實現(xiàn)了一對多的廣播多實例網(wǎng)關(guān)能同時刷新比輪詢的一致性要好很多。但落地時要注意幾個細(xì)節(jié)Redis里的路由數(shù)據(jù)結(jié)構(gòu)需要自己設(shè)計相當(dāng)于把配置中心的一部分功能搬到了Redis里Pub/Sub消息是即發(fā)即棄的如果網(wǎng)關(guān)實例剛好在消息發(fā)出時斷連或重啟這條變更通知就丟了得靠啟動時全量加載機(jī)制來兜底Redis的持久化和配置版本管理能力弱操作審計之類的功能需要自己另做2.3 路線三配置中心監(jiān)聽加事件驅(qū)動這就是我最終采用并會詳細(xì)展開的方案。思路是路由配置放在Nacos或Apollo配置中心里網(wǎng)關(guān)通過監(jiān)聽配置變更事件觸發(fā)RouteDefinitionRepository的更新邏輯最終由Gateway內(nèi)部的事件機(jī)制完成路由重建。這個方案的優(yōu)勢在于Nacos本身就承擔(dān)了配置管理的職責(zé)版本管理、回滾、權(quán)限控制、操作審計開箱即用監(jiān)聽機(jī)制是服務(wù)端主動推送生效延遲低且Nacos客戶端有重連和補(bǔ)償邏輯比Redis Pub/Sub可靠配置的變更歷史可以追溯哪條路由什么時候被誰改過一清二楚三條路線對比下來我的建議是如果你的團(tuán)隊已經(jīng)在用Nacos或Apollo做配置中心直接走第三條路線如果沒有配置中心從零搭建的話可以考慮Redis方案數(shù)據(jù)庫輪詢只作為兜底或過渡方案。3. Nacos落地動態(tài)路由從監(jiān)聽配置到刷新內(nèi)存路由表3.1 前置準(zhǔn)備與依賴引入我的項目里Nacos本來就在承擔(dān)配置中心和注冊中心的職責(zé)所以動態(tài)路由直接復(fù)用了這套設(shè)施沒有新增組件。網(wǎng)關(guān)服務(wù)需要引入以下依賴!-- Spring Cloud Gateway 核心 -- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency !-- Nacos 配置中心 -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency !-- Nacos 服務(wù)發(fā)現(xiàn) -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency版本上我用的是Spring Cloud 2021.0.x搭配Spring Cloud Alibaba 2021.x對應(yīng)Nacos Client 2.x。不同版本之間API有差異老項目如果用的是Spring Cloud Greenwich或Hoxton代碼可能需要微調(diào)下文我會標(biāo)注出來。3.2 路由數(shù)據(jù)模型設(shè)計動態(tài)路由的第一步是要確定路由配置在Nacos里以什么格式存放。我采用的是JSON數(shù)組格式一個路由一個JSON對象結(jié)構(gòu)對齊Spring Cloud Gateway的RouteDefinition模型[ { id: order-service-route, uri: lb://order-service, predicates: [ { name: Path, args: { pattern: /order/** } } ], filters: [ { name: StripPrefix, args: { parts: 1 } } ], metadata: { source: nacos, owner: middleware-team }, order: 0 } ]為什么直接對齊RouteDefinition模型因為Gateway內(nèi)部的RouteDefinition就是長這樣我拿到JSON后直接做反序列化省去了字段映射的麻煩。Nacos里對應(yīng)的Data ID我命名為gateway-routes.jsonGroup用DEFAULT_GROUP配置文件類型選JSON。這里有個設(shè)計取舍想提一下你也可以把路由配置放在YAML里用spring.cloud.gateway.routes這個key然后通過RefreshScope配合PropertiesRouteDefinitionLocator實現(xiàn)動態(tài)刷新。但這種方式有個局限——它本質(zhì)上是讓Spring容器重新綁定配置屬性如果配置內(nèi)容較大刷新時容易出幺蛾子而且對路由的增刪操作要通過比對前后配置來實現(xiàn)邏輯不夠干凈。直接維護(hù)RouteDefinition列表的方式更可控推薦優(yōu)先考慮。3.3 核心代碼路由加載與監(jiān)聽我寫了一個DynamicRouteService負(fù)責(zé)從Nacos拉取路由配置、把配置轉(zhuǎn)換成RouteDefinition、注冊到Gateway并在配置變更時完成更新。核心邏輯如下Component public class DynamicRouteService implements ApplicationEventPublisherAware { private static final Logger log LoggerFactory.getLogger(DynamicRouteService.class); public static final String DATA_ID gateway-routes.json; public static final String GROUP DEFAULT_GROUP; private final RouteDefinitionWriter routeDefinitionWriter; private final RouteDefinitionLocator routeDefinitionLocator; private ApplicationEventPublisher applicationEventPublisher; Autowired public DynamicRouteService(RouteDefinitionWriter routeDefinitionWriter, RouteDefinitionLocator routeDefinitionLocator) { this.routeDefinitionWriter routeDefinitionWriter; this.routeDefinitionLocator routeDefinitionLocator; } Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.applicationEventPublisher applicationEventPublisher; } /** * 全量刷新路由先清空舊路由再批量添加新路由 */ public void refreshRoutes(ListRouteDefinition definitions) { // 1. 獲取當(dāng)前所有已加載的路由定義 ListRouteDefinition existing routeDefinitionLocator.getRouteDefinitions() .collectList().block(); if (existing ! null !existing.isEmpty()) { existing.forEach(routeDefinition - { try { routeDefinitionWriter.delete(Mono.just(routeDefinition.getId())).subscribe(); } catch (Exception e) { log.error(刪除路由失敗, id{}, routeDefinition.getId(), e); } }); } // 2. 批量添加新路由 definitions.forEach(definition - { try { routeDefinitionWriter.save(Mono.just(definition)).subscribe(); } catch (Exception e) { log.error(保存路由失敗, id{}, definition.getId(), e); } }); // 3. 發(fā)布路由刷新事件觸發(fā)RouteRefreshListener重建路由 this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); log.info(動態(tài)路由刷新完成, 共 {} 條路由, definitions.size()); } /** * 增量更新單條路由 */ public void updateRoute(RouteDefinition definition) { try { routeDefinitionWriter.delete(Mono.just(definition.getId())).subscribe(); routeDefinitionWriter.save(Mono.just(definition)).subscribe(); this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); log.info(路由增量更新完成, id{}, definition.getId()); } catch (Exception e) { log.error(更新路由失敗, id{}, definition.getId(), e); } } /** * 刪除單條路由 */ public void deleteRoute(String id) { try { routeDefinitionWriter.delete(Mono.just(id)).subscribe(); this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); log.info(路由刪除完成, id{}, id); } catch (Exception e) { log.error(刪除路由失敗, id{}, id, e); } } }然后寫一個NacosRouteConfigWatcher在網(wǎng)關(guān)啟動完成后從Nacos拉取配置并注冊監(jiān)聽器Component public class NacosRouteConfigWatcher implements ApplicationRunner, InitializingBean { private static final Logger log LoggerFactory.getLogger(NacosRouteConfigWatcher.class); private final DynamicRouteService dynamicRouteService; private final ObjectMapper objectMapper; Autowired private NacosConfigManager nacosConfigManager; Autowired private NacosConfigProperties nacosConfigProperties; public NacosRouteConfigWatcher(DynamicRouteService dynamicRouteService, ObjectMapper objectMapper) { this.dynamicRouteService dynamicRouteService; this.objectMapper objectMapper; } Override public void run(ApplicationArguments args) { initAndWatch(); } private void initAndWatch() { try { // 1. 先獲取配置確保網(wǎng)關(guān)啟動時路由就位 ConfigService configService nacosConfigManager.getConfigService(); String config configService.getConfig(DynamicRouteService.DATA_ID, DynamicRouteService.GROUP, 60000); if (StringUtils.hasText(config)) { parseAndApply(config); } // 2. 訂閱配置變更事件 Listener listener new Listener() { Override public void receiveConfigInfo(String configInfo) { log.info(檢測到Nacos路由配置變更, 開始刷新); parseAndApply(configInfo); } Override public Executor getExecutor() { return Executors.newSingleThreadExecutor(r - { Thread t new Thread(r, nacos-route-listener); t.setDaemon(true); return t; }); } }; configService.addListener(DynamicRouteService.DATA_ID, DynamicRouteService.GROUP, listener); log.info(Nacos動態(tài)路由監(jiān)聽器注冊完成); } catch (Exception e) { log.error(初始化Nacos動態(tài)路由監(jiān)聽器失敗, e); } } private void parseAndApply(String config) { try { ListRouteDefinition definitions objectMapper.readValue(config, new TypeReferenceListRouteDefinition() {}); if (definitions null || definitions.isEmpty()) { log.warn(路由配置為空, 跳過刷新); return; } dynamicRouteService.refreshRoutes(definitions); } catch (JsonProcessingException e) { log.error(路由配置解析失敗, 內(nèi)容{}, config, e); } } }這里有一個很關(guān)鍵的點監(jiān)聽器里的ConfigService不能直接用NacosConfigManager.getConfigService()在構(gòu)造時獲取因為Nacos配置中心的初始化可能還沒完成。所以我用InitializingBean或者ApplicationRunner延遲到Spring容器啟動后期再注冊監(jiān)聽器確保ConfigService可用。這是我踩過的第一個坑后面會詳細(xì)說。3.4 為什么選擇全量刷新而不是增量更新我在代碼里默認(rèn)實現(xiàn)了refreshRoutes全量刷新同時保留了updateRoute和deleteRoute的增量接口。實際生產(chǎn)環(huán)境中我首選全量刷新。理由有三點第一配置中心里的內(nèi)容就是一個完整的路由表全量刷新邏輯最簡單不容易出錯。增量更新需要對比前后差異這個對比邏輯本身就有bug的容身之地。第二網(wǎng)關(guān)的路由表通常不會特別大幾十條到上百條的量級全量刷新的耗時在毫秒級到十毫秒級完全可以接受。第三全量刷新天然冪等重復(fù)執(zhí)行不會產(chǎn)生臟數(shù)據(jù)。增量更新如果出現(xiàn)一次失敗網(wǎng)關(guān)內(nèi)就可能殘留一條錯誤的路由。當(dāng)然全量刷新也有它的副作用清空再重建的間隙理論上路由表是空的。但因為整個刷新過程是在單線程里順序執(zhí)行delete和save加上最后publish的RefreshRoutesEvent是同一個事務(wù)上下文里觸發(fā)的實際影響窗口非常小。后面我會講到怎么用并行刷新和原子切換來進(jìn)一步縮小這個窗口。4. 路由刷新機(jī)制拆解事件驅(qū)動下Gateway怎么重建路由4.1 Gateway的路由存儲結(jié)構(gòu)要理解動態(tài)路由為什么刷新一下就能生效得先搞清楚Spring Cloud Gateway內(nèi)部是怎么存路由的。Gateway里有兩個核心接口RouteDefinitionLocator負(fù)責(zé)加載路由定義。它返回的是RouteDefinition也就是配置解析后的原始對象RouteDefinitionWriter負(fù)責(zé)新增和刪除路由定義默認(rèn)情況下Gateway會組合多個RouteDefinitionLocator來加載路由包括從配置文件讀取的PropertiesRouteDefinitionLocator、從注冊中心服務(wù)發(fā)現(xiàn)的DiscoveryClientRouteDefinitionLocator等。路由定義加載之后RouteDefinitionRouteLocator會把這些RouteDefinition轉(zhuǎn)換成真正的Route對象放進(jìn)一個FluxRoute的緩存里。Route對象里包含了具體的斷言Predicate和過濾器Filter實例是真正參與請求匹配和轉(zhuǎn)發(fā)的對象。當(dāng)你通過RouteDefinitionWriter.save()新增或刪除一條路由定義后如果不做任何額外操作Gateway內(nèi)存里的Route緩存是不會自動更新的。這時候就需要RefreshRoutesEvent出場。4.2 RefreshRoutesEvent如何觸發(fā)路由重建看一下RouteRefreshListener的源碼邏輯不同版本略有差異但核心一致public class RouteRefreshListener implements ApplicationListenerRefreshRoutesEvent { Override public void onApplicationEvent(RefreshRoutesEvent event) { // 跳過未啟動的路由刷新 if (!this.gatewayProperties.isStartup()) { return; } // 清除路由緩存 routeDefinitionRouteLocator.reset(); } }reset()方法清空了RouteDefinitionRouteLocator內(nèi)部的緩存Map。這樣下一次請求進(jìn)來時RouteDefinitionRouteLocator發(fā)現(xiàn)緩存為空就會重新從所有RouteDefinitionLocator加載路由定義再走一遍RouteDefinition到Route的組裝過程。也就是說動態(tài)刷新的鏈路是這樣的Nacos配置變更 → ConfigService監(jiān)聽器觸發(fā) → DynamicRouteService.refreshRoutes() → RouteDefinitionWriter 刪除舊定義 保存新定義 → 發(fā)布 RefreshRoutesEvent → RouteRefreshListener.reset() → 清空 Route 緩存 → 下次請求重新加載路由定義并組裝 Route → 新路由生效這一整條鏈路里RouteDefinitionWriter和RefreshRoutesEvent是兩個關(guān)鍵的把手。前者負(fù)責(zé)改數(shù)據(jù)后者負(fù)責(zé)通知Gateway重新計算。4.3 刷新期間的性能問題與優(yōu)化搞清楚刷新機(jī)制之后你會發(fā)現(xiàn)一個問題reset()清空緩存后下一個請求觸發(fā)重新加載這個加載過程是同步阻塞的。如果路由數(shù)量很大或者路由斷言邏輯很復(fù)雜比如每個路由都要遠(yuǎn)程調(diào)用某個系統(tǒng)判斷流量重建時延會直接影響第一個請求的耗時。我在壓測里碰到過這個情況100條路由全量刷新后第一個請求的P99從正常的20ms直接飆到300ms。這個現(xiàn)象叫緩存擊穿式冷啟動本質(zhì)上是因為新路由還沒準(zhǔn)備好請求就已經(jīng)到了。解決方案有兩個方向方向一預(yù)熱。在發(fā)布刷新事件之前先手動觸發(fā)一次路由加載讓緩存先重建然后再發(fā)布事件。但Gateway沒有提供官方的預(yù)熱API實現(xiàn)起來相對麻煩。方向二控制刷新頻率和粒度。把路由按業(yè)務(wù)域拆成多個配置文件哪個域變了就刷新哪個域的配置避免全量刷新帶來的全局冷啟動。我最終采用的就是這個方案把公共路由和業(yè)務(wù)路由拆到不同Data ID下各自維護(hù)監(jiān)聽器。實測下來單次刷新涉及的路由數(shù)量從100降到20左右P99影響可以忽略不計。另外補(bǔ)充一個細(xì)節(jié)RouteDefinitionWriter的save和delete返回的都是MonoVoid我用的是subscribe()這意味著操作是異步觸發(fā)的。如果你在refreshRoutes方法里調(diào)完save立刻publishEvent理論上前面的寫操作可能還沒真正完成。穩(wěn)妥的做法是先把所有Mono收集起來等它們?nèi)客瓿珊笤侔l(fā)布刷新事件。寫法可以參考這樣public void refreshRoutes(ListRouteDefinition definitions) { // 刪除舊的 ListMonoVoid deleteMonos existing.stream() .map(rd - routeDefinitionWriter.delete(Mono.just(rd.getId()))) .collect(Collectors.toList()); // 保存新的 ListMonoVoid saveMonos definitions.stream() .map(rd - routeDefinitionWriter.save(Mono.just(rd))) .collect(Collectors.toList()); // 等待全部完成后發(fā)布事件 Flux.concat(Flux.fromIterable(deleteMonos), Flux.fromIterable(saveMonos)) .then() .doOnSuccess(v - applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this))) .subscribe(); }這樣用Flux.concat串行執(zhí)行并等待完成再發(fā)事件能避免異步競態(tài)。這也是我在生產(chǎn)環(huán)境收到過路由刷新后部分請求匹配到舊路由的bug報告后做的修復(fù)。5. 上線三個月的踩坑實錄從路由不生效到雪崩邊緣5.1 坑一修改配置后路由紋絲不動這是我遇到的第一個問題。Nacos配置改了網(wǎng)關(guān)日志里也打印了檢測到Nacos路由配置變更但實際請求還是按老路由走新路由完全沒生效。排查了很長時間最后定位到兩個原因。第一個原因是RouteDefinitionRouteLocator和RefreshRoutesEvent的事件發(fā)布不在同一個線程里我第一版代碼用的是EventBus的異步監(jiān)聽導(dǎo)致reset()執(zhí)行時路由定義還沒寫完。前面4.3里講的Flux.concat方案就是為了解決這個競態(tài)問題。第二個原因更隱蔽Gateway內(nèi)部存在緩存一致性延遲。RouteDefinitionRouteLocator除了內(nèi)部的一個Map緩存外還通過CompositeRouteDefinitionLocator組合了多個RouteDefinitionLocator。其中DiscoveryClientRouteDefinitionLocator會定期從注冊中心拉取服務(wù)列表生成路由如果Nacos配置里的路由ID和注冊中心自動生成的路由ID沖突注冊中心那側(cè)的路由可能覆蓋掉配置中心的路由。解決方式是在Nacos路由配置里避免使用和注冊中心服務(wù)名相同的路由ID。5.2 坑二刪除路由后舊路由依然攔截請求另一個詭異的問題是我在Nacos里刪掉了一條路由網(wǎng)關(guān)日志顯示刪除成功但請求打到老路徑上依然有響應(yīng)。排查后發(fā)現(xiàn)問題出在RouteDefinitionRouteLocator的緩存重置機(jī)制上。reset()清空的是緩存Map但如果請求已經(jīng)被路由到下游服務(wù)連接還在保持中舊路由的自動恢復(fù)邏輯會讓連接繼續(xù)走完。更麻煩的是有些情況下Gateway從緩存里取Route對象時拿到的不是最新一次reset()后的版本。最終的修復(fù)方案是刪除路由后除了發(fā)布RefreshRoutesEvent還要主動調(diào)一次routeDefinitionLocator.getRouteDefinitions()來確認(rèn)當(dāng)前存活的路由定義并且對下游連接做主動斷開。同時給路由增加了metadata里的status字段刪除不是物理刪而是先置為disabled讓斷言不匹配再異步清理定義這樣能避免刪除瞬間仍有請求命中的窗口。5.3 坑三多實例網(wǎng)關(guān)刷新不同步生產(chǎn)環(huán)境的網(wǎng)關(guān)是多實例部署的Nacos配置變更后各實例的監(jiān)聽器幾乎同時觸發(fā)但每個實例執(zhí)行全量刷新的時間點有細(xì)微差異。如果正好有流量打到還沒刷新完成的實例上新路由就是404。這個問題的本質(zhì)是全量刷新不是原子的。后來我把refreshRoutes改成了先保存新路由再刪除舊路由順序調(diào)整后每個實例在任何時刻都至少擁有一個版本的路由表。再加上Nacos配置本身是帶版本號的我在配置內(nèi)容里加了一個version字段刷新時先比較版本號版本號相同就不重復(fù)刷新避免無意義的全量重建。5.4 坑四路由刷新引發(fā)下游雪崩這是最嚴(yán)重的一次事故。某天線上做全量路由刷新過程中Gateway發(fā)出了大量并發(fā)請求到下游的某個核心服務(wù)直接把那個服務(wù)的線程池打滿了引發(fā)連鎖故障。根因有兩層。第一層全量刷新時我做了并行刪除和保存刪掉舊路由后正在處理的請求如果還沒完成路由匹配會重新走一遍路由查找這個查找過程在緩存被清空后會變成同步加載多個請求同時觸發(fā)加載就會產(chǎn)生并發(fā)涌入。第二層我有一條路由的GlobalFilter里做了下游服務(wù)的批量調(diào)用路由刷新導(dǎo)致Filter被重建那些新Filter實例在Spring容器里的初始化邏輯又觸發(fā)了對下游的批量預(yù)熱請求。事后我做了三個調(diào)整刷新路由操作加了分布式鎖保證同一時間只有一個網(wǎng)關(guān)實例在做全量刷新路由加載改為分批進(jìn)行每批50條批次之間sleep 100ms防止一次性加載過多導(dǎo)致下游壓力梳理了自定義GlobalFilter的初始化邏輯把啟動時的批量預(yù)熱調(diào)用改成了惰性加載5.5 踩坑后的最終版配置規(guī)范經(jīng)過三個月的折騰我沉淀了一套自己的動態(tài)路由配置規(guī)范在這里直接分享出來維度規(guī)范配置存儲NacosData ID為gateway-routes.jsonGroup為DEFAULT_GROUP配置格式JSON數(shù)組對齊RouteDefinition模型拆分粒度公共路由和業(yè)務(wù)路由拆到不同Data ID減少全局刷新刷新方式全量為主、增量為輔串行執(zhí)行刪除和保存版本管理配置內(nèi)容帶version字段避免重復(fù)刷新冪等控制刷新前校驗配置CRC值無變化則跳過多實例協(xié)調(diào)刷新操作加分布式鎖避免并發(fā)刷新監(jiān)控告警監(jiān)聽配置刷新耗時和路由數(shù)量變化超出閾值告警回滾預(yù)案Nacos配置歷史保留30天快速回滾配置即可恢復(fù)舊路由這套規(guī)范的核心思路就一句話動態(tài)路由的價值在于快速響應(yīng)變化但越是靈活的東西越需要約束不然靈活性本身就變成了風(fēng)險源。6. 動態(tài)路由以外的兩個擴(kuò)展點路由動態(tài)化只是網(wǎng)關(guān)治理的第一步。跑通之后我順手把下面兩個能力也接入了同一個配置通道這里簡單提一下后續(xù)文章再展開。6.1 動態(tài)限流與熔斷配置路由能動態(tài)了那路由上的限流參數(shù)、熔斷閾值、重試策略理論上也可以動態(tài)化。我在DynamicRouteService里增加了一個擴(kuò)展字段extraConfig專門存放限流閾值、熔斷開關(guān)、超時時間等參數(shù)監(jiān)聽器解析時把這些參數(shù)同步到對應(yīng)的Filter配置中。這樣大促前調(diào)整限流閾值就不需要動代碼了。6.2 路由灰度與流量染色另外一個我比較看重的擴(kuò)展點是利用路由的metadata做灰度標(biāo)識。比如新版本服務(wù)上線后在Nacos里臨時改路由給versionv2的服務(wù)打個標(biāo)簽通過Weight斷言把5%的流量切過去驗證沒問題再逐步放量。整個過程完全不用重啟網(wǎng)關(guān)也不改服務(wù)端代碼灰度發(fā)布對運維來說非常友好。7. 一點個人體會動態(tài)路由這個功能代碼量不算大核心邏輯一百多行但真正把它用好靠的是對Gateway內(nèi)部機(jī)制的充分理解和對生產(chǎn)環(huán)境的敬畏。我剛開始的時候覺得不就是監(jiān)聽配置然后刷新嘛結(jié)果上線后連續(xù)被坑從路由不生效到雪崩每次都是血淚教訓(xùn)。如果你準(zhǔn)備在自己項目里落地動態(tài)路由我最后給三個建議第一先把Gateway的RouteDefinitionRouteLocator、RouteRefreshListener源碼讀一遍搞清楚緩存和刷新的完整鏈路再動手寫代碼能幫你避掉一大半的坑。第二一定要做正反向驗證。正向驗證改一條路由后能否秒級生效反向驗證刪一條路由后流量能否正常摘除。我在測試環(huán)境反復(fù)驗證了兩周才敢上生產(chǎn)。第三不要把動態(tài)路由做成萬能鑰匙。路由的頻繁變動本身說明你的服務(wù)治理可能有問題動態(tài)路由應(yīng)該服務(wù)于灰度、容災(zāi)和快速接入而不是掩蓋架構(gòu)設(shè)計的混亂。這套東西上線幾個月最大的感受就是網(wǎng)關(guān)終于不再是改一次配置提一次心吊膽的瓶頸了。后面我會繼續(xù)更新這個系列把網(wǎng)關(guān)限流、灰度、熔斷的實戰(zhàn)內(nèi)容整理出來希望對你有用。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本99色| 免费碰碰视频久| 亚洲色久| 五月婷婷六月丁香玖玖玫瑰91| 久久婷婷色综合| 九九免费精品在线视频| 91色在线/日韩| 婷婷五月综合激情| 五月天啪啪视频| 色色99色色| 五月天激情黄色网址| 丁香六月色婷婷| 狠狠色综合五月| 久99在线视频| 九九这里是免费的视频5| 麻豆AV一区二区三区| 免费视频无码| 九九热在线观看视频| 国产裸舞福利资源在线视频| 99色婷婷视频| 久久五月激情综合| 七七九色| 色综合九九色综合88| 午夜精品久久久久久久爽| 免费AV在线| 思思热思在线精品视频| 五月丁香婷婷综合在线| 久久视网36| 五月天婷婷色色首页| 国产午夜精品AV一区二区麻豆| 欧洲亚洲免费视频9| 六月色国内综合| 国产伦理精品高清在线观看网站一区二区| 殴美日比视频| 丁香综合婷婷开心激情网| 色停停影院五月天| 亚洲AV永久无码影院黑人| 少妇人妻人伦A片| 久久99精品久久只有精品| 五月天婷婷视频| 日韩精品色| 免费国产VA国产免费| 欧美WW在线网| 亚洲熟女色| 91视频久久久| 五月丁香好婷婷A片网| 色婷小说| 久久精品综合色| 丁香六月色| 色爱爱综合网| 亚洲在线操| 色五月色图| 婷婷欧美激情| 亚洲色情久久| 俺去也在线官网| 激情婷婷五月天伊人在线观看| 99色色爰| 99re这里有精品手机在线| 五月丁色AV| 亚洲午夜av| 丁香激情久久| 97婷婷丁香五月| 婷婷丁香五月天小说| 激情五月亚洲综合网| 影音先锋xfplay资源男人网| 天堂婷婷丁香六月网| 亚洲99视频| 国产精品第一国产精品| 一级AV片| 色婷婷777狠狠| 日韩一级A片黄色| 国産精品| 99色一| 欧美色色色| 婷婷五月天激情视频| 五月天婷婷在线观看精品男人| 婷婷五月天日本国产| 天天爽人人爽| 999激情视频| 色综合激情| www久久99| 激情五月天丁香| 中文字幕丰满孑伦无码专区| 午夜丁香 婷婷| 欧美综合五月丁香六月婷| 97av在线视频| 热99热9| 婷婷五月激情六月| 久草热8精品视频在线观看| 无码少妇高潮喷水A片免费| AV中文网| 亚洲综合久| 热99精品视频观看| 日本不卡中文字幕| 色色哒五月婷婷六月丁香| 激情开心五月天婷婷基地丁香社区| 夜夜骑夜夜撸| 国产精品人人做人人爽人人添| 91无码一区人妻A片蜜| 91久久18| 九九热短视频在线观看| 婷婷丁香人妻天天爽| 国产精产国品一二三在观看| 成人片在线播放| 五月情婷婷五月| 亭亭五月丁香五月天激情| 99精品在这里| 色婷婷综合亚洲| 婷婷中文字幕版| 色噜噜狠狠色综无码久久合欧美| 碰超亚洲| 色婷婷五月天天天干天天操天天爽 | 五月天婷婷日日爱| 久久9精品视频| 丁香六月激情综合| 97福利视频| 开心婷婷五月中文字幕组| 五月久久婷婷| 欧美久久网| 热99久久这里只有精品| 五月天伊人| 亚洲免费在线观看岛国| 天天日夜夜帕| 国产,欧美,学生妹,视频| 中文字幕日韩成人| 激情综合五月天| 成人国产欧美大片一区| 天天模,夜夜模夜夜爽| 大香线蕉伊人| 国产色网站| 无码日本精品XXXXXXXXX | 五月丁香激情啪啪网| 五月夜丁香| 五月激情偷拍| AV在线不卡播放| 第1影院之五月婷婷| 欧日美女Va| 综合激情在线| 97在线/亚洲| 激情丁香图片| 色色五月天com| 激情五月无码| 久久免费高| 第二色AⅤ| 91一起操| 五月丁香五月丁香| 丁香色婷婷色手机免费在线| www.夜夜騎夜夜狠| 中文字幕丰满乱孑伦无码专区| 天天 青草 制服丝袜 在线| 欧美激情综合色综合啪啪五月| 五月天婷婷激情六月久久| 日本色婷婷综合| 天天干,夜夜爽| 99操| 色99综合色88| 色五月婷婷在线观看| 日本美女97在线视频| 玖玖福利视频资源| 色色婷婷婷丁香五月天| 色婷婷操逼| 2017狠狠干| 五月花婷婷| 99热插| 99热免费| 人人色人人摸人人看| 泰州成人视频| 婷婷色5月天在线。| 99热在线观看| 天天狠狠夜夜狠狠2023| 超碰91人人操| 色丁香五月婷婷婷| 五月桃花网综合| 五月天婷婷丁香视频| 精国产品一区二区三区A片| wwxx日本| 国产99久9在线| 91操在线视频| 色小说婷婷五月天天天| 美女91一起草| 日本色色色| 成人婷婷五月天| 日韩黄色中文字幕| 丁香婷婷五月色成人网站| 天天操无码| 俺去也五月| 久久婷婷六月综合资源| 玖玖午夜视频| 日本视频不卡123区| 这里只有精彩视| 色色色区| 亚洲中文字幕AV在线| 亚洲综合狠狠艹| 超碰人人99| 色五月大香蕉| 这里只有精品免费| 99热6这里只有精品6| 丁香六月丁香婷婷激情| 丁香九月婷婷综合| A久网| 色婷婷久久综| 中文超碰视在线| 激情AV在线| 五月天激情图片| 欧美色欲色欲天天天www| 亚洲色婷婷五月天| 伊人网色婷婷五月天| 亚洲综合在线播放| 婷婷十月丁香| 亚洲色欲欧美一区二区三区| 丁香六月久久| 99久久色| WW婷婷五月天com| 在线观看亚洲视频影院| www夜夜操com| www.五月激情红色| 五月丁香六月婷婷综合免| 久久婷综合网| 美国不卡视频| 97自拍视频网| 亚洲精品久久久久久久久久飞鱼 | 丁香六月婷婷综合啪啪| 天天更新天天亚洲| 99丁香五月婷 | 天搞天天天天天| 亚洲成人精品三区| 超碰成人公开| 亚洲欧洲中文日韩久久AV乱码| 亚洲激情综合| 丁香综合婷婷五月天| 丁香 婷婷五月| 九洲一级A片| 丁香婷婷五月香蕉91| 欧美99热| 伊人干综合| 夜夜爱网站| 思思热在线精品视频网站| 久久性爱视频| 婷婷五月丁香香蕉| 精品久久99码| www.久久| 九九热最新地址| www.日本91| 五月婷婷丁香俺日污视频| 内射激情在线| 五月天激情无码高清| 精品色情一区二区三区四区| 久久五月天精品视频| 丁香九月婷| 天堂色色色| 色婷婷玖玖影院| 9 7总站超级碰免费视频| 成人做爰A片免费看视频| 色五月婷婷五月天| 久久综合婷婷| 伊久大香蕉| 国自产拍偷拍精品啪啪一区二区| 日本不卡高字幕在线2019| www.91久久| 99这里只有精品|v| 国产成人+综合亚洲+天堂| 在线中文av| 色色色综合| 色色国产| 激情综合网激情五月天| 亚洲无AV在线中文字幕| 97日本在线播放| 日本美女97在线视频| 婷婷五月色播天| 亚洲六月综合激情久久下卡| 婷婷性爱综合| 色婷婷久久| 天天肏夜夜肏| 欧亚成人A片一区二区| 另类天堂| 久久婷婷五月综合色和| 婷婷色情网| 久久98| 五月天激情综合在线| 婷婷丁香视频在线观看免费| 色性日本| 九九RE视频在线精品| 99色在线观看| 久久性爱网| 午夜成人av在线| 婷婷五月六月丁香| 中文字幕婷婷五月天| 色色色在线免费视频| 森林影视大全,最好看的2019年视频| 久热这里只有精品视频6| 天天色综合网吨吧| caop在线视频| 日韩中出视频| 99日韩| 天天操天天操| 色色丁香五月天| 婷婷另类小说| 五月天停婷基地| 看婷婷五月天网| 人人摸人人射| av九九| 五月婷婷色欲| 97成人丁香婷婷| 五月综合六月婷婷| 天天天天天天操| 五月婷视频| 久久婷婷综合国产| 99热99这里免费的精品| 99热在这里只有精品| 99精品国产乱码久久久人妻| 亚洲人妻Av| 4399在线观看免费高清电视剧| 亚州精品久久久久AV无码| 日韩黄色电影| 先锋影音av色五月天资源站| 99热超碰| 婷婷在线视频| 色婷婷91激情小说| 亚洲婷婷月丁香五月| 狠狠搞狠狠操| 欧在线一区| 99久久婷婷| 99热久草| 超级碰碰97在线| 国产精品操| 丁香涩涩五月天| 久久大香蕉同僚| 色色9 9| 九九热99re8热免费观看| 99r这里只有精品在线观看| 欧美一级色| 五月激情久久| www一区二区三区| 狠狠操狠狠操AV| 丁香九月综合在线| 激情五月天色色色| 国产精品久久久60086| 日韩综合久久| 亚洲av日韩无码| 丁香美女主播视频在线观看| 懂色av粉嫩av蜜臀av| 五月婷婷无码| 我爱大香蕉| 久碰综合| 五月丁香综合中文| 九九视屏| 99人妻碰碰碰久久久久视| 久久精品一区二区三区四区| 五月花成人网| 全部老头和老太XXXXX| 丁香婷最新动态| 天天插天天干| 狼人婷婷综合| 亚洲午夜av| www狠狠com| 激情综合色播| 婷婷色偷拍| 色99网| 性爱激情综合网| 婷婷五月天777| 99热免费精品| bbwcuckold精品熟妇| 激情综合婷婷| 激情五月天激情网| 国产偷人爽久久久久久老妇APP | 日本www五月婷婷| 久久这里只有精品热在99| 97香蕉碰碰人妻国产欧美| 啪啪色区| jiZZdr| 激情图片亚洲| 大战熟女丰满人妻AV| 翔田千里aV中文字幕| 成人av免费观看| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 99热这里都是精品| 天天影视色综合网| 色 五月 天 婷婷 丁香 九月| 色五月婷婷亚洲| 超碰av天堂| 久久草大香蕉| 丁香五月综合在线播放 | 色播五月婷婷| 韩国久久少妇视屏| 9月色婷婷| 亚洲免费看片| 五月丁香婷在线| 天天透天天干| 婷婷在线视频| 色女伊人| 高清无码.com| 亚洲黄网在线| 99热这里都是精品| 激情久久天天| 国产激情在线| 日本强伦片中文字幕免费看| 精品久久人妻| 亚洲婷婷五月天综合| 国产69久久久欧美黑人A片| 九九热视频免费观看| 亚洲性爱AV| 庭庭久久内射| av网站中文| 67194中文字幕| 精品人妻一区二区三区四区不卡在| 五月综合在线婷婷图片| 91热视频色网站| 九九色精品| 亚洲激情.com| 日韩色色小视频| 成人五月天综合网| 色色五月丁香| 久久精品视频在这里有| 欧美日韩大黄| 97AV在线视频| 久久香视频| 久热91| 日日懆天天懆| VA婷婷| 亚洲国产网站| 九九热123| 亚洲AV中文在线| 亚洲五月天天| 色色丁香五月天| 五月丁香六月婷婷在线小说视频| 久久码久久无清| 大香蕉婷婷| 99热这里只有精品青草| 六月天无码网址| 欧美五月婷婷| av五月丁香| 婷婷综合视频| 色播五月婷婷| 9 1超碰九色| 无码 色| 色青青五月| 亚洲第一成人无码A片| 九九婷婷激情综合网| 91碰碰| 五月婷婷五月天在线| 99热6这里只有精品6| 色色五月天丁香婷婷| 色五月美女| 91精品久久久久久77777| 99这里只有精品|v| 亚洲色vA| 五月婷在线色视频| 日日干干天天干| 亚州精品色情无码A片| 丁香玖玖视频大全| 人妻五月天激情开心网| 色都都狠狠色都都色综合色| 一本色道久久综合狠狠躁一二三| 男人操女人高潮91视频| 欧美大片免费观看| 黄桃AV无码免费一区二区三区 | 婷婷大美在线| 婷婷五月天改成什么了| 99久热这里有精品| 亚洲在线激情婷婷五月| 99久久国产宗和精品1上映| 99热只有精品综合| 五月天激情小说婷婷| 9久久婷婷国产综合精品性色| 大香伊人婷婷影院| 九月久久婷婷| 色热久| 超碰99久久| 99玖玖在线视频| 99热在线爱| 亚洲综合成人网站| 人人妻人人澡| 99re思思热在线视频| 久久综合九九| 日日干夜夜撸夜夜骑| 久久黄色网扯| 五月色俺婷婷| 色五月激情五月开心五月| 激情五月天com| 色色亚洲视频| AV人人操| 色婷婷香蕉在线| 免費观看aV在线网址| 丁香五月婷婷欧美成人色图| 色哟哟精品| 99热9| 丁香六月 婷婷六月| 欧洲亚洲免费视频区| 五月天婷婷激情干干| 激情综合网 激情五月天| 精品人妻久久久久久久| 五月丁香婷婷深深爱| 9久国产精品| 可以看的av| 俺去也五月| 五月丁香婷婷激情图片| 99热精品观看| WWW、日本色丁香、co m| 婷婷五月天电影在线| 涩五月婷婷| 激情五月婷婷视频一区二区三区| 久久九久久| 99热久97| 狠狠色官网| 99免费| 天天日,天天插| 国产精产国品一二三在观看| 91岛国片| 五月丁香网中文字幕| 丁香五月天AV| 色婷婷基地| 欧美色偷偷大香| 天天日天天添| 人。妻久久| 日本丁香五月| a在线免费v| 五月色导航| 天天色天天日| 亚洲愉拍99热成人精品| 91丨九色丨丰满人妖| 五月天成人在线精品| 婷婷 伊人 久久| 人人超碰99| www.五月天色色色| AV成人在线网站| 色呦呦美女| 97色伦另类图片小说视频 | av大片在线| 五月天综合激情网| 色欲色香伊人| 成人免费120分钟啪啪| 影音先锋天天日| 婷婷五月天激情综合婷婷五月天激情综合| 色情五月婷| 狠狠干最新地址| 操操操操操操婷婷五月天| 亚洲无码色色| 99热8在线| 秋霞午夜理论| 色色五月婷| 岛国午夜视频| 99热成人在线| 五月天婷婷婷| 一本久久亚洲五月婷婷| 久久这里有精品| 色综合视频| 天天爽夜夜爽天天爽夜夜爽| www.色五月| www超碰| 另类视在线| 欧美色必爱| 色婷綜合网| 亚洲综合五月天| 97婷婷狠狠| 日日夜夜干| 六月婷婷最新网址| 99亚州综合精品成人网| 天天日P天天射P| 五月色丁香国产在线视频| 婷婷五月花| 另类天堂| 狠狠操狠狠插| 亚洲在线激情婷婷五月| 九九热超碰| 中海油常州环保涂料有限公司| 婷婷五月激情图片| 国产成人av在线播放| 五月天丁香婷婷社区| 这里精品| 色五月婷婷伊人| 婷婷婷婷婷婷婷五月丁香| 色九九中文字幕| 色高清无码视频| 日韩一区二区A片免费观看| 激情五月天开心网丁香无码| 日本操天堂| 五月丁香六月激情综合在线| 丁香五月激情啪啪啪啪| 俺去也综合| 日本免费91| 日本一级一片免费视频| 99热欧美| 国产精品a无线| 99久久成人| 欧美日韩国产成人在线| 狠狠爱五月婷婷| 婷婷五月情| 天天爽天天| 婷婷色五月亚洲| 婷婷五月天久草在线| 午夜做爱影院| 丝袜人妻| 久久A极片| 停停五月丁香| 激情四射五月天| 婷婷五月花| 色人妻五月| 99视频91| 九九色热| 色色色色五月| 九九碰九九爱97超碰| 极品人妻VIDEOSSS人妻| 九九热精品视频| 色综合久久888| 双性美人被调教到喷水A片| 99在这里有精品| 97色97干| 欧美婷婷丁香社区在线播放| 综合啪啪| 色丁香六月| 91玖玖| 99在线精品免费视频| www.minyis.com【JT】实力收量可预付QQ2101460746 | 色久丁香五| 国产韩日亚洲美州欧亚综合在线| 在线综合亚洲欧美65| 啪色综合| www.五月天。com| 亚洲婷婷五月| 五月天播播综合| 超碰伊人碰婷婷五月| 五月激情小说网| www色五月天| 97久久久久| 狠狠婷婷综合| 激情五月天婷婷五月天| 激情五月天在线免费美女视频| 看婷婷五月天网| 波多野结衣成人作品在线| 激情婷婷色色| 五月天狠狠| 色情五月天首页| 日本久久高清| 五月丁香888| 精品人妻伦九区久久AAA片| 激情五月天网| 婷婷五月天美女视频| www99热| 99色免费| 99视频热99| 大地9中文在线观看免费高清| 色吧婷婷| 天天爽,夜夜爽| 色狠狠六月| 国产67194| 另类视屏| 5五月综合网亚洲| 久久婷婷老| 婷婷精品视频| 激情五月天在线视频| 五月丁香婷婷深深爱| 米奇影视五月天| 九九热视频首页/这里只有精品| 日韩 中文 欧美| www久久久久久| 深夜婷婷 丁香| 亚洲成人网站在线观看| 婷婷激情丁香五月婷婷激情丁香五月婷婷 | 色久五月天| 人妻第九页| 97五月天| 开心婷婷五月| 欧美人与性动交CCOO| 五月婷婷之综合激情| 久久久.COM| 五月天婷婷社区| 开心婷婷五月天激情网| 欧美激情凹凸丁香网| 夜夜操少妇| 插插插色综合网| 加勒比色色| 丁香五月天色| 天天上天天爽| 伊人婷婷五月| 亚洲va欧美va国产综合久久久| 五月天色婷婷小说| 婷婷五月综合在线视频| 先锋av性爱成人电影| 91人妻视频| 五月婷婷狠狠干| 激情色情五月天| 天天综合网亚洲网站| 丁香婷婷色情社区成人小说| 激情五月色播五月| 操逼巨乳91| 色色五月天网站| 91日韩在线| 激情五月激情综合网| 欧美肉大捧一进一出免费视频| 色色热| 中文字幕在线aⅴ免费观看| 色情终和网| 日本在线观看aaa 99| 丁香六月婷婷开心婷婷网| 欧洲S级在线观看| 中文精品在| 五月丁婷香| 开心五月婷婷在线视频免费观看| 性生活久久朋友人妻| 日本色五月婷婷| 97色婷| 国产日韩精品SUV| 精品九九久久| 丁香九月婷婷综合| 丁香婷五月| 野战毛片三一3| 99操视频| 色六月 婷婷| 大香蕉人人人| 激情五月深爱五月| 亚洲免费av观看| 一区视频网站| 五月天伊人日日噜影片AV| 五月丁香操亭亭网| 久久a热| 狠狠婷婷色综合| 色伊人啪| 深爱激情av| 久久综合五月天| 国产看真人毛片爱做A片| 97久操视频| 久久与婷婷| 五月天丁香| 超pen个人视频97| 久9视频免费播放| www.狠狠狠狠| 色婷| 九九Y精品热播| 五月丁色AV| 色色色综合色| 国产午夜精品AV一区二区麻豆| 麻豆雪千夏| 99精品网站| 久久综合九九| 婷婷丁香视频| 欧美综合激情五月| 欧美色色色色色| 丁香五月天堂网AV| 婷婷五月天人妻| 久热婷婷| 好色婷婷| 深爱五月婷| 丁香六月婷婷久久综合| 99自拍视频网站| 激情丁香六月| 男同91| 五月丁香久人妻中文| 看片视频在线免费日产在线看| 情欲禁地| 国产精品久久久99视频| 天天搞天天色综合| 婷婷五月天首页激情| 丁香色播五月天| 五月丁香六月激情在线| 91九色无码日韩| 天天干夜夜想| 999热这里只有美国精品| 亚洲天堂亚洲色色色| www.久久99| 影音先锋一区| 人人干99| 天天搞天天色综合| 激情五月婷婷| av在线免费网站| 五月婷婷综合潮喷| 2018夜夜草| 丁香六月高清视频| 色婷婷基地 | 99热国产这里只有| 九九久久99| 国产1区2区3区在线观| 日本99久久| 91婷婷搞| 亚洲另类电影| 亚洲美女高潮久久久久久69| 91丨九色丨白浆秘| 操逼毛片国语对白| 丁香五月婷婷啪| 精品成人在线观看| 综合色99| 九九热99re8热免费观看| 国产无套精品一区二区| 婷婷激情小说网| 九九色综合九九色| 婷婷第六色| 97色色色| 开心五月综合激情综合五月| 8050一级网| 五月丁香六月香综合激情| 97色精品视频| 激情综合色播| 99久久视频| 97资源碰碰| 色色网站免费在线视频| 国产亚洲精品AAAAAAA片| 狠狠色狠狠鲁| 久热精品9999| 神马欧美精| 91一起艹| 99re6在线视频精品免费| 九九热区一区二区三区| 婷婷丁香六月天激情四射网| 久久久久丁香婷婷五月天| 色九九七七| 亚洲激情在线| 亚洲精品操一操、噜一噜、摸一摸、爽 | 色五月婷婷老师| 色婷婷综合久久久久| 五月婷婷色| 色五月婷婷啪啪五月| 日本人妻操| 亚洲另类婷婷综合| 综合网激情五月天| 婷婷伊人视婷婷婷| 亚洲日日操| 五月丁香六月合| 欧美日韩成人在线免费| 丁香五月婷婷在线| 天天xxxxxx天天日| 国产脫衣舞一区二区三区| 激情五月婷| 午夜做爱影院| 如何安全看伊人婷婷| 丁香五月开心七月| 五月丁香久人妻中文| 99色看这里只有精品| 激情碰碰碰| 色情五月综合婷婷| 五月丁香六月情亚洲| 99热亚洲| 欧美在线ee日韩| 影音先锋噜一噜| 丁香婷婷五月六月天| 色综合久久中文| 国产亚洲精品久久久久久久久动漫| 激情六月丁| 中文人妻主播久久| 91精品国产日韩91久久久久久国模| 五月天大香蕉| 国产亚洲精品久久一区二区三区| 亚洲综合丁香五月| 五月婷婷天堂| 日本波多野结衣视频| 亚洲色99| 天天做天天爱天天玩| 嫩草综合网| 色色五月天丁香| 色婷婷av综合网| 五月婷婷性爱| 美欧日韩国产成人在战| 色了色综合| 激情综合自拍五月婷婷色五月| 热996精品在线观看| 欧美人与性动交CCOO| 98色花堂98t.R| 婷婷射婷婷舔| 五月丁香激情综合网官网| 久久婷狠狠色| 色天堂操| 久久九九热re6这里有精品| 天天干天天操天天爽| 婷婷五月天激情小说| 狠狠操.COM| 亚洲无码成人网| 99亚洲视频| 亚洲9久久精品| 日本精品人妻无码77777| 婷婷婷婷色| 情色婷婷五月天| www天天色天天射| 亚洲激情精品| 丁香五月婷婷激情视频播放| 国产VA播放| 99操碰| 婷婷五月综合网| 婷婷丁香www视频日本韩国| 婷婷五月久久| 国精产品一区一区三区免费视频| 97色色色| 狠狠操狠狠插| 狠狠草在线观看| 亚洲综合成人网| 天天噜日日噜综合无码| 超碰网站在线观看| 强伦轩人妻一区二区电影| 国产在线另类五月婷婷| 三十路磁力链接| 伊人日日干| 狠狠色丁香99| 色97综合婷婷天天色| 久久网站观看免费欧洲国产| 久久婷婷成人视频| 欧美欧盟性爱网| 俺来也综合网精品一区| 人妻性爱av网站| 天天搞夜夜叫| 婷婷成人综合免费视频| 97丁香五月天| 五月婷婷香蕉| 综合六月激情婷婷| 国产毛片操B| 国产av网| 色五月综合97| 99在线视频资源| 婷婷五月香蕉| 五月丁欧美| 干婷婷五月天| 国产精品成人av在线观看春天| 国产精品久久7777777精品无码| 夜丁香五月婷婷| 99这里只有精| 99操逼视频| 色五月亚洲| 成人无码精品1区2区3区免费看| 色五月情| 久久婷婷桃花五月天| 亚洲无aV在线中文字幕| 久久久五月五丁香| 六月丁香深深爱综合网| 日韩av干| 亚洲成人五月| 综合色情网| 99久久国产宗和精品1上映| 九九综合九| 中文字幕网站在线观看| 另类天堂| 五月婷婷伊人久久| 五月婷婷丁香五月| 婷婷五月成人| 九月丁香婷婷网| 色天堂A| AV天堂淫乩| 深爱激清网| 超碰在线看| 亚洲黄网AV| 五月丁香婷婷婷激情爱爱| 婷婷丁香五月天婷婷| 九玖欧洲亚洲| www.久久爱.com| 婷色五月| 丁香九月激情久久| 婷丁五月| 亚洲综合色色色| 天天激情站| 五月九九综合| 久热大香蕉| 激情五月狠狠| 激情综合五月| 2015在线中文字幕| 五月丁香六月婷| 五月天精品综合在线| 五月婷婷狠狠干| 亚洲午夜成人av电影网| 国产免费一区二区三区三州老师F1F1.CC| 激情五月图| 色婷婷五月天久久| 九九综合| 手机旧版看人妻1025| 婷婷开心青青草| 96精品久久久久久久久| 五月天天丁香婷婷| 成人丁香五月| 九九热只有精品| 国产亚洲在线观看| 综合99视频| 99热最新国内| 性爱先锋AV| 五月天婷婷丁香基地在线观看| 中文字幕丰满孑伦无码专区| 久久丁香五月| 色综合射婷婷| 国产精品久久欧美久久一区| 蜜桃婷婷狠狠久久| 婷婷色欧美激情| 婷婷性爱| 欧洲亚洲免费视频9| 色色AV色色色东莞| 五月天婷a在线| 久久久久久xxxxx| AV操逼网| 婷婷久久伊人| 丁香五月婷老师| Blackedraw视频一区二区| av大香蕉| 97色在线视频| 免费播放片大片| 99热这里只有精品86| 日韩无码AV电影网站| 丁香五月网络网络| 99热偷拍| 五月天婷婷基地综合网| 开心激情网五月天| 亚洲综合碰| 婷婷综合六月| 99热10在线高清播放| 678五月丁香亚洲综合| 婷婷丁香五月亚洲17cao| w婷婷五月婷婷w| 五月天 婷 欧美亚洲| 99在线视频喷水| 欧美美美女性色视频| 九九久久9 9在线观看| 夜夜操少妇| A片试看120分钟做受视频红杏 | 五月丁香啪啪综合网| 欧美成人猛片AAAAAAA| 色色影院aaaav| www.夜夜操| 五月天婷婷久久日| 91蜜桃婷婷狠狠久久综合9色| 色婷婷五月影视| 色婷婷影视| 怡红院 久久| 色综合五月天| 综合久久婷婷五月丁香| 天天日日夜夜| 国产色色网址网站| 嫩BBB搡BBBB榛BBBB| 狠狠色情婷婷| 中文字幕成人网站| 婷婷丁香激情五月天色色| 五月停视频天堂| 久久这里有| 日韩AV一区二区三区| 五月丁香综合激情| 五月婷婷久久大香蕉| 网色99| 色色日韩| 黄色三级毛片中字| 99热99re6国产在线播放| 九九激情视频| 91人人网| 丁香五月AV在线| 高潮毛片又色又爽免费| 性生活久久朋友人妻| www.99热这里精品| 91婷婷| 激情婷婷五月黑人| 99日热在线视频| 亚洲第一综合| 综合婷婷| 九九操屄| 色婷婷精品视频| 亚州精品色情无码A片| 丁香伊人综合| 日韩有码一区| 超碰在线人妻| 99亚洲欧洲| 七月激情六月婷婷综合在线播放| 91狠狠色| 亚洲无码成人性爰网| 91av无码| 丁香婷婷五月| 日日狠狠久久偷偷四色综合免费 | 久久98热re| 台湾综合丁香五月蜜桃| 极品嫩草| 99精品久久| 天天色综合综合| 婷久久| 熟女色色一区二区| 99九无网码| 五月婷人妻| 99噜噜噜| 欧美内射AAAAAAXXXXX| 可以看的AV| 噜综合| 麻豆精品| 亚洲精品无码一区二区| 日本色综合| 五月www| 色婷婷色情| 久久您您综合网| av在线资源| 婷婷五月天激情网站| 国产亚洲色婷婷99精品| yazhochengrenavwang| 丁香五月天社区| 五月天淫乱视频| 九九久久99| 九九99免费视频| 婷婷五月天大香蕉在线视频观看| 日日色综合| 激情网五月| 五月婷婷丁香五月婷婷| 婷婷激情四射| bukadeavzaixian| 99久久人妻精品无码二区| 色哟哟精品| 丁香狠狠色婷婷久久无码视频| 色色啊| 97色色色| 久久精品99久久久久久久久| 国产高潮A片羞羞视频涩涩| 91视频一起草| 亚州操人在线视频| 5月婷婷性视频| 99热综合在线| 久天综合| 久久综合五月婷婷| 五月婷婷综合激情小说| 久久九九国产精品怡红院| 91.com男女操| 深爱激情六月天| 五月丁香欧美| 欧美婷婷五月激情| 色色五月天婷婷| 玖玖在线| 五月婷婷综合性爱噜噜| 色婷婷小视频| 五月丁香婷婷伊人| 成人做爰高潮A片免费视频| 日日天天干| 亚洲视频五区| 欧美天堂久久| 天堂网啪啪| 色99色| 亚洲另类日本| 五月天激情丁香| 色色色成人网| 欧美日韩AAAA| 五月天 另类图片| 99er久久| 丁香六月天堂| 夜夜爽天操| 97韩国久久电影院| 热久久视频99| 色五月天激情| 亚洲久久婷婷| 丁香六月激情蜜桃| 极品五月天| 色播五月丁香| 第四色婷婷丁香五月| 婷婷十月激情综合网| 六月丁香成人网| 99热在线这里| 夜夜撸夜夜骑| 六月丁香中文字幕| 亚洲婷婷丁香| 婷婷五月综合在线| 天天色天天日| 色丁香五月婷婷| 最近中文字幕2019视频1| 欧美婷婷色| 五月丁香啪啪婷婷| 女婷久久| 婷婷午夜天| 日韩成人精品中文字幕| 丁香六月婷婷| 激情性爱五月天网页| 日韩有码一区| 色情开心五月| caop在线| 五月丁香六月婷婷,婷| 亚洲五月丁| 激情五月丁香六月| 91丨九色丨熟女丰满| 日本欧美在线| 国外亚洲成AV人片在线观看| 无码激情AAAAA片-区区| 久久久天堂国产精品女人| 超碰在线资源| 亚洲无码成人| 热久久思思热思思| 五月香六月婷| 五月 激情视频| 九九热最新地址| 97精品人人A片免费看| 九月色婷婷婷| 开心五月综合激情网| 乱女乱妇熟女熟妇综合网站| 热99热9| 射久久丁香五月| 26uuu欧美| www.久99| 五月婷在线影院| 婷婷五月AA五月在线| 噜噜网免费视频| 开心激情网在线| 97爱艹婷婷开心丁香激情综合| 激情久久综合网| 91久久婷婷| 国产精品视频久久99| 91视频一起草| 艳妇野外情欲放荡HD| 色婷婷色综合激情91| 九九99视频精品| 五月天婷久精视频| 91超级碰| 91视频久久久| 精品网站99| 狠狠操天天干| 亚洲欧洲中文日韩久久AV乱码| 99国产欧美视频| 激情婷婷五月亚洲| 狠狠高潮精品亚洲1| 99日韩| 欧美啪啪五月天| 色综合播放| 五月丁香色婷婷久久| www.超碰97| 99久久久国产大片| 亚洲av另类在线观看| 丁香大香蕉| 婷婷五月天激情丁香| 丁香六月激情综合| 黄色91在线观看| 俺五月| 成片免费播放| 99re免费视频| 丁香亚洲婷婷五月| 99色天堂| 综合婷| 丁香激情六月天婷婷| 91日本在线观看| 玖玖综合玖玖| www激情网| 91久久99久久91熟女精品| 99热天堂| 这里只有精品视频99| 亚洲亚洲人成综合网络| 久久婷婷激情| www.激情五月| 丁香五月婷婷色综合| 久久久色婷婷五月天| 久热超碰91| 丁香五月久久社区| 五月天五月婷五月激情网| 久操大香蕉| 91热99| 日本高清久| 九九美女视频| 五月天色婷婷基地| 97碰碰碰免费公开在线视频| 五月丁香久久| 99热爱爱干干日| 偷拍91九色| 五月丁香六月婷婷啪啪| 人操91在线| 五月成人综合| 万月丁香狠狠爱| 婷婷天天综合| 国产亚洲成AV人片在线观黄桃| 久久婷婷五月国产激情综合片| 97人人操人人爽| 久久伦乱| w婷婷五月婷婷w| 97久人人| 成人电影在线免费试看| 激情图片婷婷丁香五月| 五月丁香色| 人妻中文字幕网| 婷婷丁香18| 在线看黄色| 99热这里只有精品99| 成人在线视频一区| 丁香五月成人婷婷| 玖玖婷婷精品| 亚洲网站999| 精品在线网站| 中美日韩成人在线| 99久在线观看| 亚洲色在线观看| tingtingjiqingwuyue| www.五月天| 五月丁香色婷婷综合|