简介:
本期文章将汇总springCloud、springCloudAlibaba微服务相关的高频面试题,给最近需要找工作的朋友们总结一波,帮助大家全面掌握微服务的核心知识点,提升竞争力,为你的面试之旅保驾护航!
集群和微服务的区别
集群是将一个应用程序完整复制多份,部署在多台服务器上
微服务也是一个分布式系统
分布式是将一个应用程序拆分成多个子程序,分别部署在多台服务器上,每个服务器中的程序都是不完整的,所有服务器需要相互通信相互协调才能完成最终的业务
他们都能解决高并发问题,
但是分布式不能解决单机故障,
集群无法解决项目的代码臃肿、业务复杂,
实际开发中,可以将分布式和集群相结合,比如分布式某个子程序的负载很高,可以单独对这个子程序做集群。
微服务的优缺点
优点: | 缺点: |
1. 技术栈多样性,每个模块技术灵活,有较强的适应性 2. 可以独立部署, 可以独立扩展 3. 启动速度快,易于维护 | 1. 技术成本高,运维要求高 2. 分布式复杂性,运维、系统部署依赖和服务间通信等变得更复杂 3. 接口调整成本高, 数据一致性问题 4. 故障排除变得更复杂 |
常见的负载均衡器和负载均衡算法有哪些
常见的负载均衡器 | 常见负载均衡算法: |
1. Openfeign 2. Ribbon 3. nginx | 1. 轮训 2. 随机 3. 权重 4. Ip_hash 5. url_hash |
什么是CAP理论,Eureka是AP还是CP
Eureka是AP
CAP理论指的是,在一个分布式系统中,一致性(C),可用性(A),分区容错性(P)
但三个要素最多只能同时实现两点。
分区容错性是分布式系统的内在要求,因此我们通常会在一致性和可用性之间做取舍。
满足CP,也就是满足一致性和容错性,舍弃可用性,如果系统允许有段时间失效就可以考虑。常见的如Redis,Nacos,ZooKeeper
满足AP,也就是满足可用性和容错性,舍弃一致性,如果系统允许出现短暂时间的不一致可以考虑。常见的如MySQL,Eureka
什么是服务注册,什么是服务发现,什么是续约
服务注册:
当一个服务实例启动时,它会向服务注册中心注册自己的信息,包括服务名称、IP地址、端口号等。
注册后,服务注册中心会维护一个服务注册表,记录所有已注册的服务实例。
服务发现:
通过服务注册中心来查询和发现可用的服务实例
续约:
在注册服务完成以后,服务提供者会维持一个心跳(定时向EurekaServer发起Rest请求)
默认情况下每个30秒服务会向注册中心发送一次心跳,证明自己还活着。 如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机
A服务通过Feign调用B服务,它怎么实现服务调用的(执行原理是什么)
1. 微服务A加入 Feign的依赖
2. 微服务A的启动类加入注解@EnableFeignClient
3. 微服务A的类中创建接口,调用B的方法 使用@FeignClient()注解
4. 在微服务A中去依赖注入接口调用方法即可
原理 :
feign远程调用,基于JDK Proxy动态代理, 核心就是通过一系列的封装和处理,以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的请求形式和响应结果,解码成JAVA Bean,返还给调用者。
Zuul和Gateway的区别
Zuul | Gateway |
基于Servlet 构建, 是一个同步阻塞的API网关 有四个过滤器: 前置,后置,路由,错误 zuul是网飞公司 | 基于Spring WebFlux构建, 是一个异步非阻塞的API网关,功能更强大, 内部实现了限流、负载均衡等 有2个过滤器: 全局, 局部 Gateway是spring开发的 |
Nacos和Eureka的区别
nacos是阿里的,Eureka网飞, 现在都是Apache
保护方式:
Nacos:临时实例和永久实例
Eureka:当续约失败的比例达到一定阈值时,会触发自我保护机制,不会剔除任何微服务。
连接方式:
Nacos使用netty,是长连接。
Eureka是短连接,定时发送心跳。
支持模式:
Nacos支持CP和AP两种模式。
Eureka只支持AP模式。
Hystrix和Sentinel的区别
sentinel是阿里的, hystrix是网飞
限流方式:
Hystrix 基于线程池隔离,信号量隔离。
Sentinel 基于QPS, 支持基于调用关系的限流。
熔断降级策略:
Hystrix 是基于响应时间或失败比率
Sentinel 是基于失败比率
配置方式不同,和使用难度:
Hystrix 通过yaml 配置, 使用繁琐
Sentinel通过可视化界面配置, 相对简单
什么是服务熔断,什么是服务限流,什么是服务降级
服务熔断:
熔断,是对服务链路的一种保护机制,当链路上的某个服务不可访问时,服务就会触发降级返回拖地数据,
同时当失败率到达一个阈值,就标记该服务为短路状态,当请求访问时直接熔断。
服务限流:
服务限流是一种流量控制策略
基于预设的条件和规则对请求的频率、并发数量、处理能力等进行限制,
用于防止服务因过高的请求量而过载。
服务降级:
降级,是当某个服务不可访问时,返回兜底数据给客户端
保证系统的高可用性
服务心跳续约失败一定会被剔除吗?为什么
服务心跳续约失败并不一定会被剔除。这主要取决于使用的服务发现和注册中心的机制。
以Eureka为例,默认情况下,客户端的服务实例每隔30秒向Eureka服务端发送一次心跳。90秒之内Eureka服务端没有收到心跳,就会从服务实例列表中剔除。
Eureka还有自我保护机制,当在一定时间内心跳发送失败的比例低于某个阈值(如85%)时,它不会剔除通信不正常的服务实例,并且仍然接收注册与服务的查询。
对于其他服务发现和注册中心,如Nacos,其处理心跳续约失败的方式可能有所不同。
比如临时实例和永久实例
Sentinel怎么做熔断 和 降级
是解决雪崩问题的重要手段,sentinel的熔断机制我们可以通过可视化界面去配置:
熔断机制
Sentinel的熔断机制核心思路是通过对服务的统计数据进行实时监控,当服务发生异常或者出现负载过高等情况时,快速响应并进行自我保护 :
- QPS:Sentinel会对服务的调用请求进行统计,统计指标可以包括服务的QPS(每秒查询率)、响应时间、错误率等。这些指标可以动态设置,根据业务需要进行定制化配置。
- 阈值判断:当服务的错误率或者响应时间等指标超过预设的阈值时,Sentinel会判断服务可能出现了问题。
降级规则
- 慢调用比例:RT平均响应时间
- 异常比例:当资源的每秒请求量大于等于5,并且每秒异常总数占通过量的比值超过预设的阈值时,资源进入降级状态。
- 异常数降级:当资源在最近一分钟内的异常数目超过预设的阈值时,会触发降级。
Sentinel的限流方式有哪些, Sentinel怎么做限流
直接(默认)QPS限流:api达到限流条件,直接限流
关联:当关联的资料达到阈值时,就限流自己。当与A关联的资源B达到阈值后,就限流A
链路:链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流;
Sentinel有哪几种流控效果呢?
快速失败: 该方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException
预热(Warm Up):系统初始化后,由于各个服务需要加载,系统需要预热,限流会从小到大恢复
排队等待:匀速器(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式。这种方式严格控制了请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法
你们在网关上做了哪些事情
网关在微服务架构中扮演着至关重要的角色,不仅提供了统一的访问入口,还通过其丰富的功能如动态路由、负载均衡、服务监控等,增强了系统的安全性和可维护性。此外,网关的过滤器机制使得开发者可以根据需要自定义各种过滤器,以满足特定的业务需求
浏览器发送一个请求到Gateway,它是如何调用到微服务的。
1. 请求到达API Gateway
- 请求接收:首先,浏览器向API Gateway发送HTTP请求。这个请求可能包含URL、请求方法(如GET、POST)、请求头(Headers)、请求体(Body)等信息。
- 路由匹配:API Gateway接收请求后,会根据请求的URL或其他信息进行路由匹配。这通常通过预定义的路由规则来实现,这些规则定义了哪些URL路径应该被转发到哪些后端服务。
2. 转发请求到微服务
- 选择微服务:一旦API Gateway确定了请求应该被转发到哪个微服务,它就会根据这个决定来构建一个新的请求(可能修改URL、Headers等),然后通过网络(如HTTP/HTTPS)将请求发送到对应的微服务。
- 负载均衡:如果后端有多个相同服务的实例(为了提高可用性和性能),API Gateway还可能会执行负载均衡操作,将请求分发到这些实例中的一个。
3. 微服务处理请求
- 服务接收:微服务接收到来自API Gateway的请求后,会根据自己的业务逻辑来处理这个请求。
- 业务逻辑处理:微服务执行相应的数据库查询、数据处理、计算等操作,并准备响应数据。
4. 响应返回给API Gateway
- 响应准备:微服务准备好响应数据后,会构建HTTP响应(包括状态码、响应头、响应体等),并返回给API Gateway。
5. API Gateway转发响应给浏览器
- 响应接收:API Gateway接收到来自微服务的响应后,可能会进行一些额外的处理,如修改响应头、添加额外的安全层(如CORS策略)、记录日志等。
- 转发响应:最后,API Gateway将处理后的响应转发回给最初发起请求的浏览器。
6. 浏览器显示响应
- 渲染:浏览器接收到响应后,会根据响应内容(如HTML、JSON、图片等)来渲染页面或更新页面内容。
SpringCloud常用组件和作用。
SpringCloud是一套基于SpringBoot之上的微服务解决方案,它通过整合一系列优秀的组件来构建和管理微服务架构。以下是SpringCloud中一些常用的组件及其作用:
Eureka:做服务注册与发现,用来解决服务之间通信问题,
Ribbon/OpenFeign:用做客户端的负载均衡,也就是解决将请求路由到微服务集群的问题,
Hystrix:断路器,它的熔断、降级策略用来解决单节点故障,
Zuul:做服务网关,它是整个微服务的大门,可以用来实现登录、权限检查等业务,
Config:分布式配置中心,用来统一管理配置所有微服务的配置文件,
Bus:消息总线,用来给各个微服务广播消息,可以实现各个微服务配置的自动刷新,
Sleuth:链路追踪,用来实时监控各个微服务建的调用关系,快速定位故障节点
Gateway的Filter有几种,怎么用
在Spring Cloud Gateway中自定义filter,主要有两种方式:全局过滤器(Global Filter)和局部过滤器(Gateway Filter)。全局过滤器作用于所有路由,而局部过滤器只作用于特定的路由。
1. 创建自定义全局过滤器:
实现SpringCloudGatewayGlobalFilter接口,并将其作为Bean添加到上下文中。这种方式适用于需要对所有请求进行处理的场景。
2. 创建自定义局部过滤器:
实现GatewayFilter接口,并通过spring.cloud.routes.filters 配置在具体的路由下,这样只会作用于当前特定的路由。
在实现自定义过滤器时,还可以通过实现Ordered接口并重写getOrder()方法来指定过滤器的执行顺序,确保过滤器按照预期的顺序被调用。
此外,Spring Cloud Gateway还支持通过配置文件的方式来配置过滤器,这为在不同环境下的部署提供了便利。
结语
🔥如果文章对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下小老弟,蟹蟹大咖们~