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可以直接调用已经集成好了

 

posted @ 2024-04-08 00:45  星光闪闪  阅读(41)  评论(0)    收藏  举报