中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Cloud?Alibaba如何實現服務的無損下線功能

發布時間:2023-03-13 15:59:44 來源:億速云 閱讀:130 作者:iii 欄目:開發技術

今天小編給大家分享一下Spring Cloud Alibaba如何實現服務的無損下線功能的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    解決方案

    1 找到通過負載均衡組件獲取可用服務信息的地方

    Spring?Cloud?Alibaba如何實現服務的無損下線功能

    通過一頓Debug之后,從上圖中可知,我們獲取到可用的服務實例信息,會從緩存中獲取,那么如果當服務下線后,我們清空這個服務的緩存的信息,那么下次在獲取這個服務的信息就是最新的了,那么問題就解決了。

    2 解決思路

    Spring?Cloud?Alibaba如何實現服務的無損下線功能

    • 服務提供方或消費方,同時監聽 Spring Cloud Config中的某個配置文件,比如lossless文件

    • 服務下線時, 第一步: 從nacos上將自身這個實例下線。 第二步: 通過api更新lossless 文件中的內容,記錄服務下線的服務名加上時間戳

    • 消費者或網關,監聽到lossless配置文件的變更,獲取到服務名,然后將這個服務名對應的緩存清空

    部分實現代碼

    1 引入jar

    <dependencies>
    	<!-- 服務發現 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 配置 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- 引入這個是為了使 @NacosConfigListener 注解生效 -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-spring-context</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- 負載均衡組件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!-- 使bootstrap.yaml中的配置生效 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    2 編寫服務下線方法

    @Component
    @Slf4j
    public class LosslessOfflineApi {
    
        @Resource
        private NacosConfigManager nacosConfigManager;
        @Resource
        private NacosServiceManager nacosServiceManager;
        @Resource
        private NacosDiscoveryProperties nacosDiscoveryProperties;
    
        /**
         * 服務下線
         *
         * @throws NacosException NacosException
         */
        public void offlineService() throws NacosException {
            log.info("觸發服務下線 serviceName:[{}]", nacosDiscoveryProperties.getService());
            nacosServiceManager.nacosServiceShutDown();
            nacosConfigManager.getConfigService()
                    .publishConfig(NacosConstant.DATA_ID, NacosConstant.GROUP,
                            nacosDiscoveryProperties.getService() + NacosConstant.SPLIT + System.currentTimeMillis());
        }
    }

    此處需要注意的是: 使用nacosConfigManager.getConfigService().publishConfig 發布配置,此處更新配置中的 服務名+時間戳,如果只是更新服務名,則可能不會觸發監聽事件。

    3 監聽配置變更,清除服務緩存

    使@NacosConfigListener注解生效

    1、引入配置

    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-spring-context</artifactId>
        <version>1.1.1</version>
    </dependency>

    2、開啟注解

    @Configuration
    @EnableNacos(globalProperties =
    	@NacosProperties(serverAddr = "${spring.cloud.nacos.config.server-addr}")
    )
    public class NacosConfiguration {
    }
    監聽配置、清除緩存
    @Component
    @RequiredArgsConstructor
    @Slf4j
    public class ListenerConfigChange {
        @Resource
        private DefaultLoadBalancerCacheManager defaultLoadBalancerCacheManager;
        @Resource
        private NacosServiceManager nacosServiceManager;
        @Resource
        private NacosDiscoveryProperties nacosDiscoveryProperties;
        @Resource
        private NacosServiceDiscovery nacosServiceDiscovery;
        @Resource
        private NacosConfigManager nacosConfigManager;
    
        @NacosConfigListener(groupId = GROUP, dataId = DATA_ID)
        public void configChange(String config) {
            log.warn("==>接收到 無損服務下線 配置變更:[{}]", config);
            String serviceName = config.split(SPLIT)[0];
            log.info("需要無損下線的服務名:[{}]", serviceName);
    
            Cache cache = defaultLoadBalancerCacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
            if (null != cache) {
                cache.evict(serviceName);
                log.info("失效serviceName:[{}]的緩存", serviceName);
            }
        }
    }

    實現

    1 服務準備

    服務端口提供api備注
    nacos-lossless-gateway9001/consumer/**路由到consumer服務
    nacos-feign-consumer9002/fetchProviderServerInfo通過feign接口,獲取provider服務的ip和port
    nacos-provider-90039003/shutdown從nacos server上下線服務,發布配置變更
    nacos-provider-90049004/shutdown從nacos server上下線服務,發布配置變更

    解釋:
    1、通過gateway訪問 http://localhost:9001/consumer/fetchProviderServerInfo將會返回provideripport信息。
    2、http://localhost:9003/shutdown 將會將自己從nacos server下線,并且操作 nacos config,變更配置文件的內容。
    3、gatewayconsumer監聽到配置變更,更新服務的緩存,從而下次訪問,不會訪問到這個下線的服務。

    2 演示

    Spring?Cloud?Alibaba如何實現服務的無損下線功能

    以上就是“Spring Cloud Alibaba如何實現服務的無損下線功能”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    湾仔区| 新田县| 武清区| 信丰县| 枣强县| 凤城市| 鄂伦春自治旗| 秀山| 日照市| 天水市| 平利县| 理塘县| 连南| 合肥市| 合水县| 成武县| 米易县| 玛纳斯县| 雷山县| 新闻| 张家川| 唐山市| 昆山市| 营口市| 温宿县| 筠连县| 鹤山市| 江门市| 甘南县| 正蓝旗| 海淀区| 田阳县| 虹口区| 延川县| 邓州市| 林西县| 城口县| 行唐县| 德州市| 凭祥市| 银川市|