91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

    定襄县| 海安县| 南皮县| 东光县| 任丘市| 龙州县| 赣榆县| 商南县| 肇东市| 合阳县| 奉贤区| 金昌市| 岱山县| 宝兴县| 弥勒县| 林西县| 武夷山市| 泊头市| 长泰县| 黄冈市| 岑溪市| 庆阳市| 石嘴山市| 法库县| 红桥区| 外汇| 阿城市| 孝义市| 金阳县| 乳山市| 高邑县| 昌都县| 闵行区| 井研县| 邓州市| 武威市| 通化市| 宜兰县| 辽宁省| 福安市| 南康市|