MST

星途 面试题库

面试题:微服务架构中常见的服务降级策略有哪些及如何实现

在微服务架构下,阐述至少两种常见的服务降级策略,并说明在实际开发中一般通过哪些技术手段来实现这些策略,例如在Java Spring Cloud微服务框架下的实现方式。
32.0万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

常见服务降级策略

  1. 返回兜底数据:当服务不可用时,返回一个预设的默认数据。例如电商系统中商品详情服务不可用,返回 “商品信息暂无法获取” 这样的提示信息,避免给用户返回错误页面。
  2. 关闭部分功能:暂时关闭一些非核心功能。如在高并发情况下,关闭商品评论的写入功能,只保留查询功能,确保核心的商品展示和购买流程不受影响。

技术实现手段 - Java Spring Cloud框架

  1. Hystrix实现返回兜底数据
    • 引入依赖:在pom.xml中添加Hystrix依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- **启用Hystrix**:在Spring Boot应用主类上添加`@EnableHystrix`注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.netflix.hystrix.contrib.javanica.annotation.EnableHystrix;

@SpringBootApplication
@EnableHystrix
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
- **编写兜底方法**:在需要降级的方法上使用`@HystrixCommand`注解,并指定兜底方法。
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;

@Service
public class ProductService {

    @HystrixCommand(fallbackMethod = "getProductFallback")
    public String getProductInfo() {
        // 正常获取商品信息逻辑
        return "真实的商品信息";
    }

    public String getProductFallback() {
        return "商品信息暂无法获取";
    }
}
  1. 通过配置中心实现关闭部分功能
    • 引入配置中心依赖:例如使用Spring Cloud Config,在pom.xml中添加依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- **配置开关**:在配置中心(如Git仓库存储的配置文件)中添加功能开关配置。例如`comment.write.enable=false`表示关闭商品评论写入功能。
- **在代码中读取配置**:在相关服务代码中注入配置属性并根据配置判断是否执行功能。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class CommentService {

    @Value("${comment.write.enable}")
    private boolean commentWriteEnable;

    public void writeComment(String comment) {
        if (commentWriteEnable) {
            // 执行写入评论逻辑
        } else {
            // 提示功能关闭
        }
    }
}