前言
共16
题。
SpringCloud的组件有哪些?(高频)
Eureka
: 注册中心;Ribbon
: 负载均衡;Feign
: 远程调用( 封装了RestTemplate
);Hystrix
: 服务熔断;Gateway
: 网关(解决跨域问题、路由和鉴权--过滤器);- 注册中心/配置中心:
Nacos
。
Feign的工作原理?
Feign
的作用是远程调用,其工作原理为:
-
首先需要在
SpringBoot
的启动类上添加@EnableFeignClients
注解开启对Feign
的支持; -
创建接口并加上
@FeignClient
注解,其中的方法必须要和即将调用的controller
方法保持一致; -
运行时,根据接口动态生成代理类,在其中实现接口中的方法;
-
最后封装后再结合
Ribbon
负载均衡发起服务之间的调用。
什么是Hystrix?
Hystrix
是一个熔断器,用于防止服务器发生雪崩,具有服务降级 ,服务熔断 ,服务隔离等一些防止雪崩的技术。
-
服务隔离:隔离服务之间的相互影响;
-
服务熔断:接口调用失败就会进入调用接口前定义好的一个熔断的方法,返回错误信息;
-
服务降级:接口调用失败就调用本地的方法返回一个空。
Hystrix断路器的状态有哪些?
包括三个状态:
-
closed:关闭状态,断路器关闭,所有请求正常访问;
-
open :打开状态,断路器打开,所有请求都被降级。在一定时间内,请求超过
20
次,失败的百分比达到阈值(默认50%
),则触发熔断,断路器完全关闭; -
half-open :半开状态,
open
开启后会进入休眠(默认5s
),之后断路器自动进入半开状态,判断请求的执行结果来切换close
(请求成功)或者open
(请求失败)状态。
Ribbon的工作原理?
Ribbon
用于负载均衡,其工作原理如下:
-
当请求发出的时候,会被
Ribbon
的负载均衡拦截器所拦截; -
Ribbon
会提取请求路径中微服务的名称,然后查找对应的服务地址; -
Ribbon
会使用配置的负载均衡策略从众多地址中选择一个,进行调用,默认是轮询。
Ribbon的负载均衡策略有哪些?
-
轮询策略:按照一定的顺序依次调用服务实例(默认);
-
随机策略:从服务提供者的列表中随机选择一个服务实例;
-
权重策略:根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。
Nacos的工作原理?
Nacos是服务注册中心 和服务配置中心。
Nacos
做注册中心原理:
① 服务提供者会将自己的地址信息注册到Nacos
中;
② 服务消费者会从Nacos
中查询服务提供者的信息,缓存到本地,并且每隔30s
更新一次。当服务提供者的地址发生变化之后,Nacos
也会主动推送最新的地址信息给消费者;
③ 服务提供者会间隔一定时间就给Nacos
发一个信息,表明自己在线;
④ 当nacos
一段时间内接收不到微服务的续约请求时或者收到微服务的下线请求时,就会将服务地址删除。
Nacos
做配置中心的原理:
① 可以将微服务经常改动的一些配置保存到Nacos
中,然后在本地的bootstrap.yml
中指定远程配置的位置信息;
② 当Nacos
的配置发生变化时,它会主动推送给微服务,微服务进行热更新。
nacos做注册中心有什么优势?
与Eureka
、Zookeeper
和Consul
相比,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的注册中心具备如下核心功能:
- 服务注册:服务提供者在启动时将自己的信息(比如 IP 地址、端口号、服务名称等)注册到注册中心。注册中心维护着一张服务实例的清单。
- 服务发现:服务消费者通过向注册中心查询服务信息,获取可用的服务实例列表。通过注册中心,服务消费者能够找到并连接到目标服务。
- 健康检查:注册中心可以定时检查服务实例的健康状态,并根据服务的状态更新服务实例的可用性。
- 负载均衡:注册中心可以根据负载均衡策略,将请求分发给不同的服务实例,以实现负载均衡和服务高可用。
- 服务路由:在一些高级注册中心中,还可以定义服务路由规则,将请求路由到不同的服务实例,实现更灵活的流量控制和管理。
在你的项目中使用了什么负载均衡策略?
默认的轮询策略。
在你的项目中,使用nacos作为配置中心,那么都把哪些配置放到配置中心了?
- 数据库的一些配置
redis
的一些配置- 业务配置,如系统中某个定时任务的执行频率,单位天,默认7天
网关gateway有什么作用,都有哪些配置?
网关gateway
被部署在客户端和服务端之间,常用于路由、鉴权(身份验证)、过滤请求等。
网关路由有四个常用配置:
id
:路由的唯一标示predicates
:路由断言,其实就是匹配条件。判断当前请求是否符合当前规则,符合则路由到目标服务,否则404filters
:路由过滤条件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,前后端是如何通过网关交互?
- 前端发起请求 :前端通过
http
协议发起请求,如:GET /api/user/1
; - 网关接收请求:网关接收到前端的请求后,根据配置的路由规则,将请求转发到对应的微服务;
- 服务发现与负载均衡 :网关通过注册中心查找
user-service
的实例列表。根据负载均衡策略(如轮询、随机)选择一个实例,并将请求转发到该实例; - 微服务处理请求 :
user-service
接收到请求后,执行业务逻辑并返回响应; - 网关返回响应 :网关将
user-service
的响应返回给前端。前端接收到响应后,进行相应的处理(如渲染页面、更新状态)。
yml
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
项目中的负载均衡是怎么做的呢?
在我们的项目中,负载均衡使用的是轮询策略,因为我们的服务器实例性能比较均衡。利用Spring Cloud Ribbon
动态获取服务实例列表,并按顺序分发请求,同时通过Eureka
的健康检查确保请求仅路由到可用节点。