Spring Cloud Alibaba实现服务的无损下线功能

科技资讯 投稿 6600 0 评论

Spring Cloud Alibaba实现服务的无损下线功能

目录
    1、背景
  • 2、解决方案
    • 2.1 找到通过负载均衡组件获取可用服务信息的地方
    • 2.2 解决思路
  • 3、部分实现代码
      3.1 引入jar
    • 3.2 编写服务下线方法
    • 3.3 监听配置变更,清除服务缓存
      • 3.3.1 使@NacosConfigListener注解生效
      • 3.3.2 监听配置、清除缓存
  • 4、实现
      4.1 服务准备
    • 4.2 演示
  • 5、完整代码
  • 6、参考链接

1、背景

Spring Cloud Alibaba开发微服务,在开发的过程中发现,当我们的服务上线下线的时候,我们的Spring Cloud Gateway需要一段时间才能感知到,那么有没有办法能够让服务立即感知到呢?答案是可以的

此种实现方式是我自己记录下,目前未在生产环境中使用,此处记录是为了以后遇到此种场景,可以找到一种解决方案

2、解决方案

2.1 找到通过负载均衡组件获取可用服务信息的地方

通过一顿Debug之后,从上图中可知,我们获取到可用的服务实例信息,会从缓存中获取,那么如果当服务下线后,我们清空这个服务的缓存的信息,那么下次在获取这个服务的信息就是最新的了,那么问题就解决了。

2.2 解决思路

    服务提供方或消费方,同时监听 Spring Cloud Config中的某个配置文件,比如lossless文件
  1. 服务下线时,第一步:nacos上将自身这个实例下线。 第二步: 通过api更新lossless 文件中的内容,记录服务下线的服务名加上时间戳
  2. 消费者或网关,监听到lossless配置文件的变更,获取到服务名,然后将这个服务名对应的缓存清空

3、部分实现代码

3.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

编程笔记 » Spring Cloud Alibaba实现服务的无损下线功能

赞同 (35) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽