Spring Cloud面試題詳解

一、Spring Cloud簡介

Spring Cloud是基於Spring Boot的一系列框架,用於構建分佈式系統的應用程序,可以很方便地提供眾多的微服務開發組件,比如註冊中心、配置中心、服務網關等等。

Spring Cloud包括了多個子項目,幫助開發者快速搭建分佈式應用系統,其中包括Eureka、Ribbon、Feign、Hystrix、Zuul等等。

下面我們就針對Spring Cloud面試中一些常見的問題來一一進行解答。

二、Spring Cloud面試題詳解

1、Spring Cloud的核心組件有哪些?

// 代碼示例1
/**
 * Spring Cloud核心組件
 */
@EnableEurekaServer // 服務註冊中心
@EnableZuulProxy // API網關
@EnableDiscoveryClient // 服務發現
@EnableConfigServer // 分佈式配置中心
@EnableFeignClients // 基於Http請求的服務調用
@EnableHystrix // 熔斷器
@EnableTurbine // 熔斷器聚合

這裡介紹了Spring Cloud的7個核心組件。

(1)服務註冊中心:如Eureka、Consul等等(spring-cloud-starter-eureka、spring-cloud-starter-consul)

(2)API網關:如Zuul、Spring Cloud Gateway等等(spring-cloud-starter-zuul、spring-cloud-starter-gateway)

(3)服務發現:如Ribbon、Spring Cloud Discovery等等(spring-cloud-starter-ribbon、spring-cloud-starter-discovery)

(4)分佈式配置中心:如Spring Cloud Config等等(spring-cloud-starter-config)

(5)基於Http請求的服務調用:如Feign、RestTemplate等等(spring-cloud-starter-feign、spring-cloud-starter-rest-template)

(6)熔斷器:如Hystrix、Resilience4j等等(spring-cloud-starter-hystrix、spring-cloud-starter-resilience4j)

(7)熔斷器聚合:如Turbine等等(spring-cloud-starter-turbine)。

2、Spring Cloud的服務治理是怎樣實現的?

// 代碼示例2
/**
 * Eureka註冊中心
 */
@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

/**
 * Feign調用服務
 */
@FeignClient(value = "service-provider")
public interface ServiceProviderInterface {
    @GetMapping("/hello")
    String hello();
}

/**
 * 服務消費者
 */
@RestController
public class ServiceConsumerController {
    private final ServiceProviderInterface serviceProviderInterface;

    public ServiceConsumerController(ServiceProviderInterface serviceProviderInterface) {
        this.serviceProviderInterface = serviceProviderInterface;
    }

    @GetMapping("/test")
    public String test() {
        return serviceProviderInterface.hello();
    }
}

Spring Cloud的服務治理是由註冊中心和服務發現組件共同實現的,其中註冊中心主要是負責服務的註冊和發現,而服務發現則是用於定位到目標服務實例。

Spring Cloud中提供了Eureka、Consul等多個註冊中心實現方案,其中Eureka是比較常見的選擇。我們在服務提供者中使用@EnableEurekaClient註解來激活Eureka客戶端,@EnableDiscoveryClient註解用於服務發現。為了調用服務,我們使用Feign客戶端向Eureka註冊的服務發起請求。服務消費者中通過@EnableFeignClients註解激活Feign客戶端,向服務提供者發起請求。

3、Spring Cloud Feign和RestTemplate有什麼區別?

Feign和RestTemplate都是用於進行Http請求的工具,其中Feign是Spring Cloud中推薦使用的工具。

在使用上,RestTemplate必須先定義請求Url,而Feign則是先定義一個接口定義,然後通過註解來定義接口對應的請求Url、請求參數等等。Feign相較於RestTemplate的優勢在於,Feign的入口定義了請求的入參和出參,可以更好地實現對服務的解耦。

同時在實現上,Feign通過Ribbon來實現客戶端的負載均衡,可以更好地分攤流量,提高應用系統的性能。

4、Spring Cloud中Hystrix的作用是什麼?

Hystrix是一種熔斷器,用於防止分佈式應用系統中的「雪崩效應」。當服務不可用或者時間過長時,Hystrix會直接返回一個快速失敗的結果,從而避免資源的長時間佔用,保證其他服務可以良好地工作。

Hystrix提供了良好的降級機制,當服務出現故障時,可以將請求轉發到其他可用的服務或直接返回默認的響應結果。

// Hystrix的使用
@HystrixCommand(fallbackMethod = "helloFallback")
@GetMapping("/hello")
public String hello() {
    // 調用服務
}

/**
 * Hystrix熔斷器fallback方法
 */
public String helloFallback() {
    return "error";
}

5、Spring Cloud中的Zuul網關是用來做什麼的?

Zuul是一種API網關,用於在服務端點之間進行路由、負載均衡、安全控制等操作,可以實現各種類型的服務訪問和協議轉換。

在Spring Cloud中,Zuul通過簡單配置,就可以實現微服務架構中的智能路由、彈性負載均衡等等特性。

// Zuul網關
@EnableZuulProxy
public class ZuulServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulServerApplication.class, args);
    }

    @Bean
    public AuthPreFilter authPreFilter() {
        return new AuthPreFilter();
    }

    @Bean
    public AuthPostFilter authPostFilter() {
        return new AuthPostFilter();
    }
}

/**
 * 自定義Zuul Filter
 */
public class AuthPreFilter extends ZuulFilter {
    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        // 權限校驗
    }
}

public class AuthPostFilter extends ZuulFilter {
    // ...
}

三、總結

Spring Cloud是一套分佈式應用開發的解決方案,其中包括了多個子項目,可以大大降低微服務架構的複雜度,方便開發者快速構建高性能、高可用性的分佈式應用程序。在面試中,需要對Spring Cloud的核心組件有深入的了解,同時對於Feign、RestTemplate、Hystrix、Zuul等等組件的使用和原理也需要有一定的了解。

原創文章,作者:ICYND,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371657.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ICYND的頭像ICYND
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

發表回復

登錄後才能評論