Spring框架 - SpringCloud

前言

16题。

SpringCloud的组件有哪些?(高频)

  1. Eureka : 注册中心;
  2. Ribbon : 负载均衡;
  3. Feign : 远程调用( 封装了RestTemplate);
  4. Hystrix: 服务熔断;
  5. Gateway : 网关(解决跨域问题、路由和鉴权--过滤器);
  6. 注册中心/配置中心: Nacos

Feign的工作原理?

Feign的作用是远程调用,其工作原理为:

  1. 首先需要在SpringBoot的启动类上添加@EnableFeignClients注解开启对Feign的支持;

  2. 创建接口并加上@FeignClient注解,其中的方法必须要和即将调用的controller方法保持一致;

  3. 运行时,根据接口动态生成代理类,在其中实现接口中的方法;

  4. 最后封装后再结合Ribbon负载均衡发起服务之间的调用。

什么是Hystrix?

Hystrix是一个熔断器,用于防止服务器发生雪崩,具有服务降级服务熔断服务隔离等一些防止雪崩的技术。

  1. 服务隔离:隔离服务之间的相互影响;

  2. 服务熔断:接口调用失败就会进入调用接口前定义好的一个熔断的方法,返回错误信息;

  3. 服务降级:接口调用失败就调用本地的方法返回一个空。

Hystrix断路器的状态有哪些?

包括三个状态:

  1. closed:关闭状态,断路器关闭,所有请求正常访问;

  2. open :打开状态,断路器打开,所有请求都被降级。在一定时间内,请求超过20次,失败的百分比达到阈值(默认50%),则触发熔断,断路器完全关闭;

  3. half-open :半开状态,open开启后会进入休眠(默认5s),之后断路器自动进入半开状态,判断请求的执行结果来切换close(请求成功)或者open(请求失败)状态。

Ribbon的工作原理?

Ribbon用于负载均衡,其工作原理如下:

  1. 当请求发出的时候,会被Ribbon的负载均衡拦截器所拦截;

  2. Ribbon会提取请求路径中微服务的名称,然后查找对应的服务地址;

  3. Ribbon会使用配置的负载均衡策略从众多地址中选择一个,进行调用,默认是轮询。

Ribbon的负载均衡策略有哪些?

  1. 轮询策略:按照一定的顺序依次调用服务实例(默认);

  2. 随机策略:从服务提供者的列表中随机选择一个服务实例;

  3. 权重策略:根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。

Nacos的工作原理?

Nacos是服务注册中心 和服务配置中心

  1. Nacos注册中心原理:

① 服务提供者会将自己的地址信息注册到Nacos中;

② 服务消费者会从Nacos中查询服务提供者的信息,缓存到本地,并且每隔30s更新一次。当服务提供者的地址发生变化之后,Nacos也会主动推送最新的地址信息给消费者;

③ 服务提供者会间隔一定时间就给Nacos发一个信息,表明自己在线;

④ 当nacos一段时间内接收不到微服务的续约请求时或者收到微服务的下线请求时,就会将服务地址删除。

  1. Nacos配置中心的原理:

① 可以将微服务经常改动的一些配置保存到Nacos中,然后在本地的bootstrap.yml中指定远程配置的位置信息;

② 当Nacos的配置发生变化时,它会主动推送给微服务,微服务进行热更新。

nacos做注册中心有什么优势?

EurekaZookeeperConsul相比,Nacos在易用性、性能、多语言支持和配置管理方面具有优势,特别是在与Spring Cloud Alibaba的集成上表现出色。

nacos的动态配置能力指的是什么?

其实就是修改配置后,向服务器推送消息,令其热更新。

RPC指的是什么?

rpc指的是远程过程调用,就是服务间调用,服务间同步调用Feign,异步调用RabbitMQ

nacos注册中心已经有负载均衡了,为什么还要使用Ribbon组件?

nacos作为注册中心,首要应该满足服务的注册和发现的需求,虽然它内置了两种负载均衡策略:基于权重和基于CMDB(基于就近访问)的负载均衡策略,但是默认关闭

因为SpringCloud专门的 负载均衡组件:Spring Cloud LoadBalance负载均衡组件(2020.0.1版本开始该组件替换了Ribbon组件)。

如果实在想要启用nacos的,可在yml文件中使用spring.cloud.loadbalancer.nacos.enable=true开启。

nacos的注册中心具备如下核心功能:

  1. 服务注册:服务提供者在启动时将自己的信息(比如 IP 地址、端口号、服务名称等)注册到注册中心。注册中心维护着一张服务实例的清单。
  2. 服务发现:服务消费者通过向注册中心查询服务信息,获取可用的服务实例列表。通过注册中心,服务消费者能够找到并连接到目标服务。
  3. 健康检查:注册中心可以定时检查服务实例的健康状态,并根据服务的状态更新服务实例的可用性。
  4. 负载均衡:注册中心可以根据负载均衡策略,将请求分发给不同的服务实例,以实现负载均衡和服务高可用。
  5. 服务路由:在一些高级注册中心中,还可以定义服务路由规则,将请求路由到不同的服务实例,实现更灵活的流量控制和管理。

在你的项目中使用了什么负载均衡策略?

默认的轮询策略。

在你的项目中,使用nacos作为配置中心,那么都把哪些配置放到配置中心了?

  1. 数据库的一些配置
  2. redis的一些配置
  3. 业务配置,如系统中某个定时任务的执行频率,单位天,默认7天

网关gateway有什么作用,都有哪些配置?

网关gateway被部署在客户端和服务端之间,常用于路由、鉴权(身份验证)、过滤请求等。

网关路由有四个常用配置:

  • id:路由的唯一标示
  • predicates:路由断言,其实就是匹配条件。判断当前请求是否符合当前规则,符合则路由到目标服务,否则404
  • filters:路由过滤条件
  • uri:路由目标地址,lb://代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问
yml 复制代码
spring:
  cloud:
    # 配置 Spring Cloud Gateway 内容
    gateway:
      routes: # 配置路由,可以配置多个路由 List<RouteDefinition> routes
        - id: item # 路由的id,程序员自己配置,要求唯一
          uri: lb://item-service # 路由的目标服务
          predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
                      #,否则404
            - Path=/member/get/**

如果项目部署在linux,前后端是如何通过网关交互?

  1. 前端发起请求 :前端通过http协议发起请求,如:GET /api/user/1
  2. 网关接收请求:网关接收到前端的请求后,根据配置的路由规则,将请求转发到对应的微服务;
  3. 服务发现与负载均衡 :网关通过注册中心查找user-service 的实例列表。根据负载均衡策略(如轮询、随机)选择一个实例,并将请求转发到该实例;
  4. 微服务处理请求user-service接收到请求后,执行业务逻辑并返回响应;
  5. 网关返回响应 :网关将user-service的响应返回给前端。前端接收到响应后,进行相应的处理(如渲染页面、更新状态)。
yml 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**

项目中的负载均衡是怎么做的呢?

在我们的项目中,负载均衡使用的是轮询策略,因为我们的服务器实例性能比较均衡。利用Spring Cloud Ribbon动态获取服务实例列表,并按顺序分发请求,同时通过Eureka的健康检查确保请求仅路由到可用节点。

相关推荐
独立开阀者_FwtCoder6 分钟前
Vite 的实现原理,确实很巧妙
前端·javascript·面试
@泽栖1 小时前
2.微服务拆分流程
java·spring cloud·微服务·架构
希忘auto1 小时前
Spring Cloud之远程调用OpenFeign最佳实践
java·spring cloud
_一条咸鱼_9 小时前
大厂Android面试秘籍:Activity 结果回调处理(八)
android·面试·android jetpack
_一条咸鱼_9 小时前
大厂Android面试秘籍:Activity 与 Fragment 交互(九)
android·面试·android jetpack
拉不动的猪10 小时前
设计模式之------命令模式
前端·javascript·面试
uhakadotcom10 小时前
Bun vs Node.js:何时选择 Bun?
前端·javascript·面试
洛小豆10 小时前
面试题:谈谈 final、finally、finalize 有什么不同?
面试
_一条咸鱼_11 小时前
大厂AI大模型面试:涌现原理
人工智能·深度学习·面试
uhakadotcom12 小时前
🚀 使用 Bun 快速搭建 HTTP 服务器:一步步教程
前端·javascript·面试