springCloud面试题
介绍下springCloud
springCloud是将各种主流框架使用springboot进行集成与封装,提供全套的分布式解决方案,用于简化分布式系统的开发。
主要提供的功能有服务注册发现、配置中心、客户端负载均衡,服务容错保护(服务降级、熔断)、服务网关等功能
服务治理包括哪些功能:
服务注册发现、配置中心、负载均衡、服务熔断与降级、限流、监控、配置中心等。
springCloud提供了服务治理的功能。
使用springCloud有什么优缺点
优点:
- 易于集成与快速开发:使用springboot集成和封装了各种分布式系统的主流框架,可以避免复杂的依赖管理与配置,可以进行快速的功能开发。
- 方便进行分布式系统管理:springCloud提供了完善的分布式系统解决方案,对服务管理更加便捷高效
缺点:
- 过于便捷,容易忽略对默认配置的修改
- 容易忽略对使用的框架的深入了解,而缺少对系统的优化处理
springCloud的如何提供服务注册于发现功能
注册与发现功能主要用于服务之间的调用。
注册中心主要提供如下功能
- 服务注册,服务提供者部署的时候,要注册到注册中心上。
- 服务发现,服务调用者从注册中心获取服务提供者的信息。
- 服务移除,服务下线时,可以实现服务移除,并且能够通知到服务调用者。
spring支持的注册中心有
Eureka(默认的,已停止更新)、Zookeeper、Consul、nacos
对于新的服务一版都使用还正常更新的而且使用量大的框架,比如nacos
springCloud如何提供服务熔断和降级功能
- 熔断功能:当某个服务出现故障或响应时间过长时,为了防止整个系统的崩溃,熔断器会“熔断”,即暂时停止对该服务这个接口的调用,快速返回错误。这样,系统可以避免继续向已知故障的服务发送请求,从而防止资源浪费和可能的连锁故障。(针对的是接口)
- 降级功能:是在系统某些部分不可用时提供的备选方案。可以自己实现备选方案的逻辑如返回一个默认值,返回特定的错误信息等。
springCloud可以集成Hystrix框架来提供熔断和降级功能。
openFeign提供了自己的降级功能,我们可以使用它的Fallback机制来使用降级功能。当服务调用失败时,可以执行备用逻辑。openFeign也可以集成Hystrix框架使用Hystrix的熔断和降级功能(比自带的功能更多)
可以在nacos配置熔断和降级的规则配置信息,客户端可以获取到这些规则信息,如果要按照这个规则进行,需要开启Hystrix的功能使用这些配置信息来设置降级与熔断策略。真正执行策略的还是在客户端。
熔断与降级:
单纯的降级每次还是会调用接口,失败了会返回降级的备选结果;触发熔断就会不调用接口直接返回降级的备选结果。
熔断的状态:关闭状态(正常请求可以到达服务端)、开启状态(请求直接走降级方法,不到达服务端)和半开状态(一定时间后,熔断器由开启状态变为半开状态,此时可以接收请求),在半开状态,Hystrix会释放部分请求通过,以检测服务是否已恢复正常。这些请求会尝试调用目标服务,如果请求成功,则表明服务已经恢复,熔断器会关闭
hystrix说明:
提供服务降级、服务熔断、服务限流功能的框架
触发熔断:
- 错误率阀值:指定时间内有多少错误率触发熔断
- 最小请求数:指定时间内,超过指定请求数量才考虑错误率阀值判断
触发降级:
- 接口调用超时
- 接口调用错误
- 流量达到阀值
- 熔断器处于熔断开启状态
介绍下openFeign
openFeign是springCloud中常用的服务调用客户端,采用http请求的方式调用远程接口。
openFeign提供的功能:
- 提供http请求功能:默认使用Apache HttpClient可以在配置文件修改配置,也可以自定义http连接池
- 重试功能:默认是关闭的,可以集成spring-retry并配置重试策略来提供重试功能,
- 服务降级功能:Fallback机制,接口调用失败,使用定义好的备选方案处理请求
- 日志记录:可以在配置文件中开启日志记录功能,查看服务请求响应日志、重试日志、客户端日志等
openFeign怎么使用
在调用方的启动类上加上@EnableFeignClients注解,这个注解告诉Spring Boot应用程序扫描并创建Feign客户端接口的代理实现类
在调用的方法类上加上@FeignClient注解,指定注册中心的服务名或url,方法上使用@GetMapping或@PostMapping指定具体接口地址
openFeign原理
当应用启动时,Feign会根据接口定义自动生成一个代理对象(jdk动态代理)。这个代理对象实现了接口中定义的方法,并将方法调用转换为HTTP请求。
当你调用代理对象的方法时,Feign会将方法调用转换为HTTP请求,并发送给目标服务。目标服务接收到请求后,会处理请求并返回响应。Feign会将响应转换为相应的Java对象,并返回给调用方。
openFeign的fallback机制怎么使用
在Feign客户端接口上使用@FeignClient注解的fallback属性,指定实现降级功能的类。
@FeignClient(name = "your-service", fallback = YourFeignClientFallback.class)
public interface YourFeignClient {
@GetMapping("/your-endpoint")
String yourMethod();
}
定义一个回退实现类。回退实现类实现了与原始接口相同的方法,并提供备用的逻辑。
@Component
public class YourFeignClientFallback implements YourFeignClient {
@Override
public String yourMethod() {
// 执行备用逻辑
return "Fallback response";
}
}
openFeign的重试功能怎么用
对于全局可以编写一个配置类
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(1000, 3000, 3); // 最大重试次数为3,初始间隔为1000毫秒,最大间隔为3000毫秒
}
}
对于指定方法的可以使用@Retryable注解maxAttempts属性指定了最大重试次数,backoff属性指定了重试的间隔时间。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.retry.annotation.Retryable;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "example")
public interface ExampleFeignClient {
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 1000, maxDelay = 3000))
@GetMapping("/example")
String getExample();
}
启用重试机制:在启动类上使用@EnableRetry注解来启用重试机制。
Feign的重试机制会在以下情况下触发重试:
1. 连接异常:当Feign发起请求时,如果发生连接异常(例如连接超时、连接被拒绝等),则会触发重试。
2. 请求超时:当Feign发起请求后,如果请求在指定的时间内没有得到响应,则会触发重试。
3. HTTP响应状态码:当Feign接收到HTTP响应时,如果响应的状态码指示请求失败(例如5xx服务器错误),则会触发重试。
4. 自定义异常:你可以通过实现Retryer接口来定义自己的重试策略,并在特定的异常情况下触发重试。例如,你可以定义一个重试策略,当遇到特定的自定义异常时触发重试。
springCloud如何提供负载均衡功能
springCloud可以使用ribbon或Spring Cloud LoadBalancer来实现负载均衡
可以使用openfeign来使用负载均衡,openfeign默认集成了Spring Cloud LoadBalancer(低版本使用的ribbon)
springcloud单独集成ribbon实现负载均衡
ribbon可以结合注册中心一块来提供负载均衡,这时会从注册中心获取服务提供者列表来负载均衡。
ribbon也可以不依赖注册中心,这时就需要手动配置提供给ribbon服务提供者列表的信息了。
使用ribbon,服务提供者不需要做出修改,服务调用者要添加ribbon的依赖,在启动类上添加@EnableDiscoveryClient注解来启用服务发现,@RibbonClient 用于指定需要负载均衡的服务,在application.yml中或配置类中配置 Ribbon 的相关参数,如负载均衡策略、连接超时时间等。在服务消费者中,你可以使用 @LoadBalanced 注解的 RestTemplate 来调用服务。Spring Cloud 会自动使用 Ribbon 来实现负载均衡。
@Configuration
public class MyAppConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@RibbonClient(name = "my-service")
public class RibbonConfig {
}
}
springcloud使用openfeign来实现负载均衡
openfeign的负载均衡功能默认是开启的,默认是使用的轮询策略。所以我们如果已经在使用openfign了默认已经使用了负载均衡的功能。
使用openfeign来做负载均衡不要使用@LoadBalanced注解,可以在配置文件中配置负载均衡策略来修改默认值
提供的负载均衡策略:
轮询、随机、加权随机、最少活跃调用数
nacos与负载均衡
nacos不提供负载均衡功能,nacos提供注册的服务列表信息,服务调用方自己根据配置的负载均衡策略调用。
在nacos中配置的权重信息,如果服务调用方设置权重的负载均衡策略才能用到,否则配置了是没有用处的。
springCloud如何提供服务网关功能
通过其网关组件,如Spring Cloud Gateway,来提供服务网关功能
springCloud如何提供配置中心功能
通过其配置中心组件,如Spring Cloud Config或nacos
介绍下springCloudLoadBalancer
springcloud官方提供的负载均衡组件,可以用于替代ribbon,使用方式与ribbon基本兼容,可以平滑过渡。
从Spring Cloud 2020.0.0开始使用loadBalancer代替ribbon,ribbon已经不再维护
Spring Cloud LoadBalancer 中获取服务实例有两种方式:
1. 实时获取:每次都从注册中心得到最新的健康实例(效果好,开销大)
2. 缓存服务列表:每次得到服务列表之后,缓存一段时间(既保证性能,也能保证一定的及时性)
Spring Cloud LoadBalancer 默认开启了缓存服务列表的功能。
提供的负载均衡策略:轮询(默认)、随机、最小活调用。
可以使用nacos上配置的随机加权和地域就近访问负载均衡策略,不过需要开发写代码进行集成
使用方式:
- 可以在返回RestTemplate实例的方法上添加上@LoadBalanced来赋予其负载均衡的功能
- 对于openfeign可以直接调用已经集成好了

浙公网安备 33010602011771号