欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Cloud?Alibaba實(shí)現(xiàn)服務(wù)的無(wú)損下線功能(案例講解)

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

1、背景

最近用到了Spring Cloud Alibaba開(kāi)發(fā)微服務(wù),在開(kāi)發(fā)的過(guò)程中發(fā)現(xiàn),當(dāng)我們的服務(wù)上線下線的時(shí)候,我們的Spring Cloud Gateway需要一段時(shí)間才能感知到,那么有沒(méi)有辦法能夠讓服務(wù)立即感知到呢?答案是可以的。

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

2、解決方案

2.1 找到通過(guò)負(fù)載均衡組件獲取可用服務(wù)信息的地方

通過(guò)一頓Debug之后,從上圖中可知,我們獲取到可用的服務(wù)實(shí)例信息,會(huì)從緩存中獲取,那么如果當(dāng)服務(wù)下線后,我們清空這個(gè)服務(wù)的緩存的信息,那么下次在獲取這個(gè)服務(wù)的信息就是最新的了,那么問(wèn)題就解決了。

2.2 解決思路

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

3、部分實(shí)現(xiàn)代碼

3.1 引入jar

<dependencies>
	<!-- 服務(wù)發(fā)現(xiàn) -->
    <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>
    <!-- 引入這個(gè)是為了使 @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>
    <!-- 負(fù)載均衡組件 -->
    <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 編寫(xiě)服務(wù)下線方法

@Component
@Slf4j
public class LosslessOfflineApi {

    @Resource
    private NacosConfigManager nacosConfigManager;
    @Resource
    private NacosServiceManager nacosServiceManager;
    @Resource
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    /**
     * 服務(wù)下線
     *
     * @throws NacosException NacosException
     */
    public void offlineService() throws NacosException {
        log.info("觸發(fā)服務(wù)下線 serviceName:[{}]", nacosDiscoveryProperties.getService());
        nacosServiceManager.nacosServiceShutDown();
        nacosConfigManager.getConfigService()
                .publishConfig(NacosConstant.DATA_ID, NacosConstant.GROUP,
                        nacosDiscoveryProperties.getService() + NacosConstant.SPLIT + System.currentTimeMillis());
    }
}

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

3.3 監(jiān)聽(tīng)配置變更,清除服務(wù)緩存

3.3.1 使@NacosConfigListener注解生效

1、引入配置

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

2、開(kāi)啟注解

@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)聽(tīng)配置、清除緩存

@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("==>接收到 無(wú)損服務(wù)下線 配置變更:[{}]", config);
        String serviceName = config.split(SPLIT)[0];
        log.info("需要無(wú)損下線的服務(wù)名:[{}]", serviceName);

        Cache cache = defaultLoadBalancerCacheManager.getCache(SERVICE_INSTANCE_CACHE_NAME);
        if (null != cache) {
            cache.evict(serviceName);
            log.info("失效serviceName:[{}]的緩存", serviceName);
        }
    }
}

4、實(shí)現(xiàn)

4.1 服務(wù)準(zhǔn)備

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

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

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

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

相關(guān)文章

  • Java中SpringCloud的五大組件詳解

    Java中SpringCloud的五大組件詳解

    這篇文章主要介紹了Java中SpringCloud的五大組件詳解,Spring cloud是一個(gè)基于Spring Boot實(shí)現(xiàn)的服務(wù)治理工具包,在微服務(wù)架構(gòu)中用于管理和協(xié)調(diào)服務(wù),需要的朋友可以參考下
    2023-07-07
  • Java并發(fā)編程中的Callable、Future和FutureTask詳解

    Java并發(fā)編程中的Callable、Future和FutureTask詳解

    這篇文章主要介紹了Java并發(fā)編程中的Callable、Future和FutureTask詳解,創(chuàng)建線程的2種方式,一種是直接繼承Thread,另外一種就是實(shí)現(xiàn)Runnable接口,這2種方式都有一個(gè)缺陷就是:在執(zhí)行完任務(wù)之后無(wú)法獲取執(zhí)行結(jié)果,需要的朋友可以參考下
    2023-07-07
  • java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    java簡(jiǎn)單實(shí)現(xiàn)多線程及線程池實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了java簡(jiǎn)單實(shí)現(xiàn)多線程,及java爬蟲(chóng)使用線程池實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java+JFrame實(shí)現(xiàn)貪吃蛇小游戲

    Java+JFrame實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了Java+JFrame實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java線程的基礎(chǔ)實(shí)例解析

    java線程的基礎(chǔ)實(shí)例解析

    這篇文章主要介紹了java線程的基礎(chǔ)實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • SpringBoot配置Redis自定義過(guò)期時(shí)間操作

    SpringBoot配置Redis自定義過(guò)期時(shí)間操作

    這篇文章主要介紹了SpringBoot配置Redis自定義過(guò)期時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • public?static?void?main(String[]?args)使用解讀

    public?static?void?main(String[]?args)使用解讀

    這篇文章主要介紹了public?static?void?main(String[]?args)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java基于包結(jié)構(gòu)的請(qǐng)求路由實(shí)現(xiàn)實(shí)例分享

    java基于包結(jié)構(gòu)的請(qǐng)求路由實(shí)現(xiàn)實(shí)例分享

    基于包結(jié)構(gòu)的請(qǐng)求路由簡(jiǎn)單實(shí)現(xiàn)實(shí)例分享,大家參考使用吧
    2013-12-12
  • JDK17安裝教程以及其環(huán)境變量配置教程

    JDK17安裝教程以及其環(huán)境變量配置教程

    環(huán)境變量對(duì)Java初學(xué)者來(lái)說(shuō)真的是一件頭疼的事,本人也經(jīng)歷過(guò)這樣的事情,這篇文章主要給大家介紹了關(guān)于JDK17安裝教程以及其環(huán)境變量配置的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • SpringBoot之為何推薦使用構(gòu)造器注入

    SpringBoot之為何推薦使用構(gòu)造器注入

    這篇文章主要介紹了SpringBoot之為何推薦使用構(gòu)造器注入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評(píng)論