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