您的位置:

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等等组件的使用和原理也需要有一定的了解。