国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Cloud Gateway + Nacos 實現(xiàn)服務上下線無縫切換

這篇具有很好參考價值的文章主要介紹了Spring Cloud Gateway + Nacos 實現(xiàn)服務上下線無縫切換。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大家好,我是不才陳某~

最近知識星球的球友在學習星球中的《精盡Spring Cloud Alibaba》專欄提到一個問題,相信也有很多人在線上環(huán)境遇到過,或許也因此被批過:一個集群中有某個服務突然下線,但是網(wǎng)關(guān)還是會去請求這個實例,所以線上就報錯了,報錯信息如下圖:

Spring Cloud Gateway + Nacos 實現(xiàn)服務上下線無縫切換,java,spring cloud,開發(fā)語言,spring,后端

究其原因到底為何呢?有沒有一種靠譜的解決方案呢?別著急,往下看

產(chǎn)生原因

Gateway中有個緩存 CachingRouteLocator ,而網(wǎng)關(guān)服務使用的是lb模式,服務在上線或者下線之后,未能及時刷新這個緩存,相應的源碼如下:

public?class?CachingRouteLocator?implements?Ordered,?RouteLocator,
??ApplicationListener<RefreshRoutesEvent>,?ApplicationEventPublisherAware?{

?private?static?final?Log?log?=?LogFactory.getLog(CachingRouteLocator.class);

?private?static?final?String?CACHE_KEY?=?"routes";

?private?final?RouteLocator?delegate;

?private?final?Flux<Route>?routes;

?private?final?Map<String,?List>?cache?=?new?ConcurrentHashMap<>();

?private?ApplicationEventPublisher?applicationEventPublisher;

?public?CachingRouteLocator(RouteLocator?delegate)?{
??this.delegate?=?delegate;
??routes?=?CacheFlux.lookup(cache,?CACHE_KEY,?Route.class)
????.onCacheMissResume(this::fetch);
?}

?private?Flux<Route>?fetch()?{
??return?this.delegate.getRoutes().sort(AnnotationAwareOrderComparator.INSTANCE);
?}

?@Override
?public?Flux<Route>?getRoutes()?{
??return?this.routes;
?}

?/**
??*?Clears?the?routes?cache.
??*?@return?routes?flux
??*/
?public?Flux<Route>?refresh()?{
??this.cache.clear();
??return?this.routes;
?}

?@Override
?public?void?onApplicationEvent(RefreshRoutesEvent?event)?{
??try?{
???fetch().collect(Collectors.toList()).subscribe(list?->?Flux.fromIterable(list)
?????.materialize().collect(Collectors.toList()).subscribe(signals?->?{
??????applicationEventPublisher
????????.publishEvent(new?RefreshRoutesResultEvent(this));
??????cache.put(CACHE_KEY,?signals);
?????},?throwable?->?handleRefreshError(throwable)));
??}
??catch?(Throwable?e)?{
???handleRefreshError(e);
??}
?}

?private?void?handleRefreshError(Throwable?throwable)?{
??if?(log.isErrorEnabled())?{
???log.error("Refresh?routes?error?!!!",?throwable);
??}
??applicationEventPublisher
????.publishEvent(new?RefreshRoutesResultEvent(this,?throwable));
?}

?@Deprecated
?/*?for?testing?*/?void?handleRefresh()?{
??refresh();
?}

?@Override
?public?int?getOrder()?{
??return?0;
?}

?@Override
?public?void?setApplicationEventPublisher(
???ApplicationEventPublisher?applicationEventPublisher)?{
??this.applicationEventPublisher?=?applicationEventPublisher;
?}
}

那么解決方案就自然能夠想出來,只需要在服務下線時能夠去實時的刷新這個緩存自然就解決了

解決方案

這里通過去監(jiān)聽 Nacos 實例刷新事件,一旦出現(xiàn)實例發(fā)生變化馬上刪除緩存。在刪除負載均衡緩存后,Spring Cloud Gateway 在處理請求時發(fā)現(xiàn)沒有緩存會重新拉取一遍服務列表,這樣之后都是用的是最新的服務列表了,也就達到了我們動態(tài)感知上下線的目的。

代碼如下:

@Component
@Slf4j
public??class?NacosInstancesChangeEventListener?extends?Subscriber<InstancesChangeEvent>?{
????@Resource
????private?CacheManager?defaultLoadBalancerCacheManager;

????@Override
????public?void?onEvent(InstancesChangeEvent?event)?{
????????log.info("Spring?Gateway?接收實例刷新事件:{},?開始刷新緩存",?JacksonUtils.toJson(event));
????????Cache?cache?=?defaultLoadBalancerCacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
????????if?(cache?!=?null)?{
????????????cache.evict(event.getServiceName());
????????}
????????log.info("Spring?Gateway?實例刷新完成");
????}

????@Override
????public?Class<??extends?com.alibaba.nacos.common.notify.Event>?subscribeType()?{
????????return?InstancesChangeEvent.class;
????}
}

這里通過繼承的方式監(jiān)聽 Nacos 的 InstancesChangeEvent,在 onEvent 接收到實例刷新的信息后直接刪除對應服務的負載均衡緩存,緩存的名字是定義在 Spring Gateway 的相關(guān)代碼中的,直接引入即可,Cache 則是繼承自 Spring Cache 接口,負載均衡緩存也繼承了 Cache 接口,有了 Cache 接口就可以直接使用其接口定義的 evict 方法即可,而緩存的 key 名就則就是服務名,在 InstancesChangeEvent 中,通過 getServiceName 就可以得到服務名。

這里就不演示了,有興趣的小伙伴可以測試一下

最后說一句(別白嫖,求關(guān)注)

陳某每一篇文章都是精心輸出,如果這篇文章對你有所幫助,或者有所啟發(fā)的話,幫忙點贊、在看、轉(zhuǎn)發(fā)、收藏,你的支持就是我堅持下去的最大動力!

另外陳某的知識星球開通了,公眾號回復關(guān)鍵詞:知識星球 獲取限量30元優(yōu)惠券加入只需89元,一頓飯錢,但是星球回饋的價值卻是巨大,目前更新了Spring全家桶實戰(zhàn)系列、億級數(shù)據(jù)分庫分表實戰(zhàn)、DDD微服務實戰(zhàn)專欄、我要進大廠、Spring,Mybatis等框架源碼、架構(gòu)實戰(zhàn)22講等....每增加一個專欄價格將上漲20元

Spring Cloud Gateway + Nacos 實現(xiàn)服務上下線無縫切換,java,spring cloud,開發(fā)語言,spring,后端

關(guān)注公眾號:【碼猿技術(shù)專欄】,公眾號內(nèi)有超贊的粉絲福利,回復:加群,可以加入技術(shù)討論群,和大家一起討論技術(shù),吹牛逼!文章來源地址http://www.zghlxwxcb.cn/news/detail-617700.html

到了這里,關(guān)于Spring Cloud Gateway + Nacos 實現(xiàn)服務上下線無縫切換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • Spring Cloud微服務架構(gòu):實現(xiàn)分布式系統(tǒng)的無縫協(xié)作

    Spring Cloud微服務架構(gòu):實現(xiàn)分布式系統(tǒng)的無縫協(xié)作

    ??歡迎來到架構(gòu)設計專欄~Spring Cloud微服務架構(gòu):實現(xiàn)分布式系統(tǒng)的無縫協(xié)作 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:架構(gòu)設計 ??其他專欄:Java學習路線 Java面試技巧 Java實戰(zhàn)項目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學習 ??文章作者技術(shù)和水

    2024年02月08日
    瀏覽(95)
  • Spring Cloud 2022.x版本使用gateway和nacos實現(xiàn)動態(tài)路由和負載均衡

    Spring Cloud 2022.x版本使用gateway和nacos實現(xiàn)動態(tài)路由和負載均衡

    Spring Cloud Alibaba官方:https://sca.aliyun.com/zh-cn/ Spring Cloud官網(wǎng):https://spring.io/projects/spring-cloud Spring Cloud與Spring Cloud Alibaba版本對應說明:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain 下載地址:https://github.com/alibaba/nacos/releases 下載編譯壓縮并解壓:nacos-server-2.2.3.zip。 1.1、

    2024年02月11日
    瀏覽(50)
  • Spring Cloud Gateway + Nacos 灰度發(fā)布

    Spring Cloud Gateway + Nacos 灰度發(fā)布

    本文將會使用 SpringCloud Gateway 網(wǎng)關(guān)組件配合 Nacos 實現(xiàn) 灰度發(fā)布(金絲雀發(fā)布) 創(chuàng)建子模塊 服務提供者? provider ,網(wǎng)關(guān)模塊? gateway 父項目 pom.xml 配置 服務提供者 provider 這里我們計劃引入? nacos , 所以先創(chuàng)建一個 nacos 配置文件? dataId ?為? provider.properties , 這里用默認的命名

    2024年02月03日
    瀏覽(24)
  • 大規(guī)模 Spring Cloud 微服務無損上下線探索與實踐

    大規(guī)模 Spring Cloud 微服務無損上下線探索與實踐

    ??歡迎來到云原生技術(shù)應用專欄~大規(guī)模 Spring Cloud 微服務無損上下線探索與實踐 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:云計算技術(shù)應用 ??其他專欄:Java學習路線 Java面試技巧 Java實戰(zhàn)項目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學習 云計算技術(shù)

    2024年02月09日
    瀏覽(28)
  • Spring Cloud集成Nacos實現(xiàn)服務配置中心 | Spring Cloud 7

    先我們來看一下,微服務架構(gòu)下關(guān)于配置文件的一些問題: 配置文件相對分散。在一個微服務架構(gòu)下,配置文件會隨著微服務的增多變的越來越多,而且分散在各個微服務中,不好統(tǒng)一配置和管理。 配置文件無法區(qū)分環(huán)境,開發(fā)環(huán)境、測試環(huán)境、線上環(huán)境。微服務項目可能會

    2024年02月14日
    瀏覽(88)
  • Spring Cloud Gateway集成Nacos作為注冊中心和配置中心

    本篇文章將介紹Spring Cloud Alibaba體系下Spring Cloud Gateway的搭建,服務注冊中心和分布式配置中心使用Nacos,后續(xù)將會持續(xù)更新,介紹集成Sentinel,如何做日志鏈路追蹤,如何做全鏈路灰度發(fā)布設計,以及Spring Cloud Gateway的擴展等。 ? Spring Boot,Spring Cloud,Discovery,Config等基礎依

    2024年02月11日
    瀏覽(510)
  • 【SpringCloud】11、Spring Cloud Gateway使用Sentinel實現(xiàn)服務限流

    1、關(guān)于 Sentinel Sentinel 是阿里巴巴開源的一個流量防衛(wèi)防護組件,可以為微服務架構(gòu)提供強大的流量防衛(wèi)能力,包括流量控制、熔斷降級等功能。Spring Cloud Gateway 與 Sentinel 結(jié)合,可以實現(xiàn)強大的限流功能。 Sentinel 具有以下特性: 豐富的應用場景:Sentinel 承接了阿里巴巴近

    2024年02月01日
    瀏覽(23)
  • spring cloud整合spring boot,整合nacos、gateway、open-feign等組件

    想看具體詳情的可以看我的github鏈接:codeking01/platform-parent: spring cloud整合spring boot、nacos、gateway、open feign等組件 (github.com) 由于我升級了jdk17,所以用上了spring boot 3.0.2了。 踩坑無數(shù),一堆無用文章,寫來寫去,本文主要是提供給有基礎的開發(fā)者再次快速搭建使用(確定版本

    2024年02月11日
    瀏覽(95)
  • Spring Cloud Gateway集成Swagger實現(xiàn)微服務接口文檔統(tǒng)一管理及登錄訪問

    Spring Cloud Gateway集成Swagger實現(xiàn)微服務接口文檔統(tǒng)一管理及登錄訪問

    本文將介紹如何在 Spring Cloud 微服務中使用 Swagger 網(wǎng)關(guān)來統(tǒng)一管理所有微服務的接口文檔,并通過 Spring Security 實現(xiàn)登錄后才能訪問 Swagger 文檔,以確保接口數(shù)據(jù)的安全訪問。 在開始之前,需要假設你已經(jīng)完成了 Spring Cloud Gateway 的相關(guān)配置,并且已經(jīng)了解了基本的網(wǎng)關(guān)配置知

    2024年02月05日
    瀏覽(38)
  • Spring Cloud Gateway 網(wǎng)關(guān)整合 Knife4j 4.3 實現(xiàn)微服務接口文檔聚合

    Spring Cloud Gateway 網(wǎng)關(guān)整合 Knife4j 4.3 實現(xiàn)微服務接口文檔聚合

    ?? 作者主頁: 有來技術(shù) ?? 開源項目: youlai-mall ?? vue3-element-admin ?? youlai-boot ?? 倉庫主頁: Gitee ?? Github ?? GitCode ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請糾正! youlai-mall 開源微服務商城新版本基于 Spring Boot 3 和 Java 17,同時采用 Knife4j 4.3。與以前版本不同的是

    2024年02月05日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包