Java后端面试题(微服务相关)(day12)
目录
- 分布式与微服务区别?
- 什么是CAP原则?
- Spring Cloud Alibaba 组件有哪些?
- Nacos配置中心动态刷新原理
- 目前主流的负载方案有哪些?
- Nginx作为服务端负载均衡器,常见的负载均衡策略有哪些?
- Spring Ribbon相关
- Spring Ribbon是什么?
- Ribbon负载均衡策略有哪些?
- Ribbon第一次调用为什么会很慢?
- Feign 和 OpenFeign 的区别?
- 流量网关与服务网关的区别?
- 降级和熔断有什么区别?
分布式与微服务区别?
- 概念层面:
- 微服务是设计层面的东西,一般考虑如何将系统从逻辑上进行拆分,也就是垂直拆分;
- 分布式是部署层面的东西,即强调物理层面的组成,即系统的各子系统部署在不同计算机上。
- 粒度划分:
- 微服务倾向于更细粒度的服务划分,每个服务只专注于一个特定的业务功能,并力求做到“做一件事并做好”
- 分布式系统中的服务划分粒度可大可小,可以包含多个紧密相关的业务功能
- 目标:
- 微服务架构的核心理念是围绕业务能力组织服务,强调服务之间的松耦合和高内聚
- 分布式系统的设计目标是为了提高系统的可靠性、可用性、可扩展性和稳定性
一句话概括:分布式:分散部署;微服务:分散能力。
什么是CAP原则?
- 一致性(Consistency):所有节点在同一时刻看到相同的数据。
- 可用性(Availability):每个请求不管成功或者失败都应该在合理的时间内得到响应。
- 分区容错性(Partition tolerance):分区容错性是说当网络故障导致分布式系统的一部分节点无法与其他节点通信(有节点挂掉时),系统仍应该能够运作。
在一个分布式系统中,不可能同时实现一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。因此,设计分布式系统时必须在这三个属性之间做出选择,只能同时满足其中的两个。
常见的有CA、CP、AP三种系统,而我们通常使用AP保证可用性和分区容错性,不追求实时一致性,只保证最终一致性即可。
Spring Cloud Alibaba 组件有哪些?
Spring Cloud Alibaba 是阿里开源的一套微服务开发组件,致力于提供微服务开发的一站式解决方案,核心组件有下面这些:
- Sentinel:以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
- Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
- Seata:分布式事务解决方案。
除了上面这些之外,使用 Spring Cloud Alibaba 的时候一般会搭配下面这些 Spring Cloud 组件一起使用:
- OpenFeign:轻量级 RESTful 的 HTTP 服务客户端,用于替代已经进入停更维护状态的 Feign(Netflix Feign)
- Gateway:用于网关服务,实现请求的转发和路由。
- Ribbon:用于客户端负载均衡,将请求分发给不同的微服务实例。
Nacos配置中心动态刷新原理
Nacos 使用长轮询机制来实现实时配置更新。具体过程如下:
- 客户端发起请求:客户端通过后台线程发起一个 HTTP 请求 到 Nacos 服务端,用于 监听配置变化。
- 服务端挂起连接:Nacos 服务端接收到请求后,会挂起(hold)这个 HTTP 连接一段时间(例如 30 秒),在此期间服务端监控配置文件的变化。
- 两种情况
- 无变化情况:若在这段时间内没有检测到配置文件有任何变更,服务端将释放连接并向客户端返回一个指示,表明配置没有更新。
- 配置变更情况:如果在挂起期间检测到配置文件发生变化,服务端会立即释放连接并将最新的配置推送给客户端。
- 循环轮询:无论哪种情况,客户端在接收完响应后,会在短暂延迟(如 10 毫秒)之后重新发起一个新的 HTTP 请求,从而形成循环轮询机制以持续监听配置更新。
这种方式使得客户端能够及时获取到最新的配置信息,同时减少了不必要的频繁请求。
目前主流的负载方案有哪些?
目前主流的负载方案分为以下两种:
- 服务端负载均衡
在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx,OpenResty) - 客户端负载均衡器
客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡。
Nginx作为服务端负载均衡器,常见的负载均衡策略有哪些?
- Round Robin Rule :轮询策略,依次选择每个服务实例。
- Least Connections:最少连接数,最少连接数算法将请求分配给当前活动连接数最少的后端服务器。这有助于避免某些服务器过载,而其他服务器则处于空闲状态的情况。
- IP Hash:IP哈希,IP哈希算法根据客户端IP地址的哈希值将请求分配给后端服务器。这样,同一个客户端的请求总是被分配到同一台后端服务器,从而实现会话粘性。
- URL Hash:URL哈希,URL哈希算法根据请求URL的哈希值将请求分配给后端服务器。这样,相同URL的请求总是被分配到同一台后端服务器。
- Weighted Round Robin:加权轮询,加权轮询算法在轮询的基础上,为每台后端服务器分配一个权重。数字越大,权重越高,分配到的请求越多。适用于后端服务器性能差异较大的情况。
Spring Ribbon相关
最少连接数算法将请求分配给当前活动连接数最少的后端服务器。这有助于避免某些服务器过载,而其他服务器则处于空闲状态的情况。
Spring Ribbon是什么?
Spring Ribbon 是一个客户端负载均衡工具,它可以在调用微服务时动态地从多个实例中选择一个来进行访问。Ribbon主要作为Netflix OSS组件集成在Spring Cloud中使用,帮助服务消费者在不同的服务实例之间进行负载均衡,通过这种方式增加系统的可用性和容错性
Ribbon负载均衡策略有哪些?
- Round Robin Rule :轮询策略,依次选择每个服务实例。
- Random Rule :随机策略,随机选择一个服务实例。
- Weighted Response Time Rule :根据响应时间来分配权重,响应时间短的服务实例权重越大。
Ribbon第一次调用为什么会很慢?
Ribbon默认是采用懒加载,Ribbon 客户端在第一次使用时需要初始化一些内部状态,例如从服务注册中心拉取服务实例列表、构建连接池,TCP 三次握手创建连接等,因此第一次调用会很慢。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时。
Feign 和 OpenFeign 的区别?
-
- Feign是由Netflix开发的一个声明式的HTTP客户端库
-
- OpenFeign是Spring Cloud官方基于Feign开发的一个分支
- 提供了对Spring MVC的支持
- 提供了对Spring的自动配置支持,使得集成更加简便
- 整合了更多的扩展 (请求重试策略、超时控制、请求拦截器)
- OpenFeign是Spring Cloud官方基于Feign开发的一个分支
流量网关与服务网关的区别?
流量网关和服务网关在系统整体架构中所处的位置如上图所示,
-
流量网关:(如Nignx,OpenResty,Kong)是指提供全局性的、与后端业务应用无关的策略,例如 HTTPS证书认证、Web防火墙、全局流量监控,黑白名单等。
-
服务网关:(如Spring Cloud Gateway)是指与业务紧耦合的、提供单个业务域级别的策略,如服务治理、token认证,负载均衡等。也就是说,流量网关负责南北向流量调度及安全防护,微服务网关负责东西向流量调度及服务治理。
在微服务架构中,降级(Degradation)和熔断(Circuit Breaker)都是用来提升系统稳定性和可用性的技术手段。虽然它们的目的都是为了应对服务间的依赖关系所带来的风险,但它们的作用机制和应用场景有所不同。
降级和熔断有什么区别?
- 目的:
- 熔断(Circuit Breaker):当某个依赖服务出现故障或响应时间过长时,暂时停止对该服务的请求,避免进一步加重故障服务的负担,并保护调用方免受性能影响。
- 降级(Degradation):当系统资源紧张或服务性能下降时,通过主动降低服务质量来保证核心功能的可用性。
- 触发条件:熔断是自动的,通常由框架或库实现;降级则是手动设计的策略,需要开发者明确指定哪些功能可以降级处理。
- 恢复机制:熔断有自动恢复机制,即半开状态下的试探性恢复;降级则需要根据实际情况手动或通过某种策略恢复。
- 使用场景:熔断更多用于处理服务间的依赖问题,而降级则更广泛地应用于整个系统的资源管理