最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Cloud?Alibaba實現服務的無損下線功能(案例講解)

 更新時間:2023年03月13日 14:36:03   作者:huan1993的技術分享  
這篇文章主要介紹了Spring?Cloud?Alibaba實現服務的無損下線功能?,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1、背景

最近用到了Spring Cloud Alibaba開發(fā)微服務,在開發(fā)的過程中發(fā)現,當我們的服務上線下線的時候,我們的Spring Cloud Gateway需要一段時間才能感知到,那么有沒有辦法能夠讓服務立即感知到呢?答案是可以的

此種實現方式是我自己記錄下,目前未在生產環(huán)境中使用,此處記錄是為了以后遇到此種場景,可以找到一種解決方案

2、解決方案

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

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

2.2 解決思路

  • 服務提供方或消費方,同時監(jiān)聽 Spring Cloud Config中的某個配置文件,比如lossless文件
  • 服務下線時, 第一步: 從nacos上將自身這個實例下線。 第二步: 通過api更新lossless 文件中的內容,記錄服務下線的服務名加上時間戳
  • 消費者或網關,監(jiān)聽到lossless配置文件的變更,獲取到服務名,然后將這個服務名對應的緩存清空。

3、部分實現代碼

3.1 引入jar

<dependencies>
	<!-- 服務發(fā)現 -->
    <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>

3.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("觸發(fā)服務下線 serviceName:[{}]", nacosDiscoveryProperties.getService());
        nacosServiceManager.nacosServiceShutDown();
        nacosConfigManager.getConfigService()
                .publishConfig(NacosConstant.DATA_ID, NacosConstant.GROUP,
                        nacosDiscoveryProperties.getService() + NacosConstant.SPLIT + System.currentTimeMillis());
    }
}

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

3.3 監(jiān)聽配置變更,清除服務緩存

3.3.1 使@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 {
}

3、注解生效參考文檔

https://github.com/nacos-group/nacos-spring-project
https://github.com/alibaba/spring-cloud-alibaba/issues/458

3.3.2 監(jiān)聽配置、清除緩存

@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);
        }
    }
}

4、實現

4.1 服務準備

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

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

4.2 演示

5、完整代碼

https://gitee.com/huan1993/spring-cloud-alibaba-parent/tree/master/nacos-lossless-offline

6、參考鏈接

1、https://github.com/nacos-group/nacos-spring-project
2、https://github.com/alibaba/spring-cloud-alibaba/issues/458

到此這篇關于Spring Cloud Alibaba實現服務的無損下線功能的文章就介紹到這了,更多相關Spring Cloud Alibaba無損下線內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mybatis中如何使用小于號

    mybatis中如何使用小于號

    這篇文章主要介紹了mybatis中如何使用小于號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java8函數式接口UnaryOperator用法示例

    Java8函數式接口UnaryOperator用法示例

    這篇文章主要介紹了Java8函數式接口UnaryOperator用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Java String類詳解_動力節(jié)點Java學院整理

    Java String類詳解_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java String類詳解,本文經多方資料的收集整理和歸納,最終撰寫成文,非常不錯,值得收藏,需要的的朋友參考下
    2017-04-04
  • 學生視角手把手帶你寫Java?線程池改良版

    學生視角手把手帶你寫Java?線程池改良版

    作者是一個來自河源的大三在校生,以下筆記都是作者自學之路的一些淺薄經驗,如有錯誤請指正,將來會不斷的完善筆記,幫助更多的Java愛好者入門
    2022-03-03
  • 深入理解Mybatis二級緩存

    深入理解Mybatis二級緩存

    與一級緩存相比,二級緩存范圍更大了一些,可以被多個SqlSession所共用。下面通過本文帶領大家一起學習mybatis二級緩存知識,一起看看吧
    2016-12-12
  • springboot如何實現自動裝配源碼解讀

    springboot如何實現自動裝配源碼解讀

    這篇文章主要介紹了springboot如何實現自動裝配源碼賞析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java解決請求跨域的兩種方法

    java解決請求跨域的兩種方法

    這篇文章主要為大家詳細介紹了java解決請求跨域的兩種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • JAVA多線程編程實例詳解

    JAVA多線程編程實例詳解

    這篇文章主要介紹了JAVA多線程編程,結合實例形式總結分析了多線程、鎖、線程池等相關原理及使用技巧,需要的朋友可以參考下
    2019-09-09
  • SpringBoot使用thymeleaf實現前端表格

    SpringBoot使用thymeleaf實現前端表格

    雖然現在流行前后端分離,但是后端模版在一些關鍵地方還是非常有用的,例如郵件模版、代碼模版等。當然也不排除一些古老的項目后端依然使用動態(tài)模版。Thymeleaf 簡潔漂亮、容易理解,并且完美支持 HTML5,可以直接打開靜態(tài)頁面,同時不新增標簽,只需增強屬性
    2022-10-10
  • Java中常見的日期操作(取值、轉換、加減、比較)

    Java中常見的日期操作(取值、轉換、加減、比較)

    本文給大家介紹java中常見的日期操作,日期取值、日期轉換、日期加減、日期比較,對java日期操作相關知識感興趣的朋友一起學習吧
    2015-12-12

最新評論

资兴市| 乐平市| 枝江市| 阜城县| 万州区| 道孚县| 连云港市| 普定县| 正宁县| 淮北市| 凤阳县| 义马市| 商水县| 和政县| 宁城县| 天津市| 伽师县| 吴堡县| 威远县| 鹤山市| 永川市| 胶南市| 朝阳市| 手游| 晋中市| 湟中县| 石泉县| 上饶市| 津南区| 长沙县| 长沙市| 慈利县| 密云县| 琼海市| 新宁县| 香港| 航空| 枝江市| 任丘市| 敦化市| 山西省|