SpringCloud面试题

SpringCloud面试题

1.微服务有什么好处?

单体项目的缺点:

  1. 可扩展性受限: 单体应用通常在可扩展性方面受到限制,因为整个应用程序必须一起扩展。这意味着即使只有一个组件需要更多资源,也必须扩展整个应用程序,这可能会导致资源浪费。
  2. 难以维护和更新: 随着时间的推移,单体应用程序往往变得越来越庞大和复杂,难以理解、维护和更新。每次修改都可能引发意想不到的影响。
  3. 高风险: 单体应用程序中的一个小错误或故障可能会导致整个应用程序崩溃,因此存在较高的风险。此外,长时间不更新的单体应用可能会受到安全威胁。
  4. 技术栈限制: 单体应用程序通常使用相同的技术栈,这可能会限制您在项目中使用最新的技术和工具的能力。
  5. 团队协作复杂: 单体应用程序的所有组件都在一个代码库中,这可能导致开发团队之间的冲突和协作问题,尤其在大型团队中更为突出。

现在,让我们看看微服务项目的一些优点:

微服务项目的优点:

  1. 可扩展性: 微服务架构允许您根据需要独立地扩展单个服务,而不必扩展整个应用程序,这提供了更高的可扩展性。
  2. 灵活性和快速开发: 微服务允许开发团队独立设计、开发和部署服务,这提高了灵活性,允许团队更快地推出新功能和更新。
  3. 故障隔离和容错性: 单个微服务的故障通常不会影响其他服务,提高了应用程序的容错性,同时更容易识别和解决故障。
  4. 技术多样性: 微服务允许您选择适合每个服务的最佳技术栈,这有助于充分利用各种技术和工具的优势。
  5. 独立部署和维护: 微服务可以独立部署和维护,这减少了风险,使团队能够更快速地进行修复和更新。
  6. 团队协作: 不同团队可以独立工作在不同服务上,这提高了团队的自治和协作能力,减少了冲突。

总的来说,微服务项目通过提供更高的可扩展性、灵活性和容错性,以及更容易管理的部署和维护过程,有助于克服单体应用程序的一些限制和缺点。但请注意,微服务架构也会引入一些新的复杂性,需要更多的管理和监控。选择适合您项目需求的架构取决于多种因素。

2.微服务带来了哪些挑战?

成本挑战:

    • 基础设施成本增加: 微服务应用通常需要更多的基础设施资源,例如服务器、容器管理、负载均衡器等,这可能导致运营成本增加。
    • 开发和维护成本: 管理多个微服务的开发、测试、部署和维护需要更多的工程师资源,这可能导致开发和维护成本上升。

复杂性挑战:

    • 分布式系统复杂性: 微服务应用是分布式系统,涉及多个独立运行的服务,这增加了系统的复杂性,包括网络通信、故障处理和事务管理等方面。
    • 服务发现和治理: 管理多个微服务的发现、注册、版本控制和路由需要额外的复杂性,例如使用服务网格或API网关。

部署挑战:

    • 自动化部署需求: 为了有效地部署多个微服务,需要建立自动化的部署流程,这可能需要额外的工作和资源。
    • 版本控制和回滚: 管理不同版本的微服务以及版本之间的兼容性可能会变得复杂,特别是在需要回滚时。

一致性挑战:

    • 数据一致性: 不同微服务可能拥有各自的数据存储,确保数据一致性和同步可能需要复杂的解决方案,如分布式事务或事件驱动的一致性。
    • 事务管理: 管理跨多个微服务的事务变得复杂,确保事务的一致性和隔离性需要额外的努力和技术。

监控和故障排除挑战:

    • 性能监控: 在微服务环境中,跟踪性能问题和故障排除可能更加困难,因为问题可能涉及多个服务,需要强大的监控和诊断工具。
    • 故障排除: 需要有效的方法来跟踪和诊断跨多个服务的故障,以便快速恢复。

微服务不是万金油,是用来处理海量用户、业务复杂和需求频繁变更场景下的一种架构风格。引用一句话“好的架构是演化出来的,而不是设计出来的”。任何一种架构的引入,都会带来利弊两个方面的影响,如何平衡才最重要。

3.现在有哪些流行的微服务解决方案?

目前最主流的微服务开源解决方案有三种:

  1. Dubbo:
    • Dubbo 是一个高性能、轻量级的 Java 微服务框架,最初由阿里巴巴(Alibaba)开发并于2011年开源。它提供了服务注册与发现、负载均衡、容错、分布式调用等功能,后来一度停止维护,在近两年,又重新开始迭代,并推出了Dubbo3。
    • Dubbo 使用基于 RPC(Remote Procedure Call)的通信模型,具有较高的性能和可扩展性。它支持多种传输协议(如TCP、HTTP、Redis)和序列化方式(如JSON、Hessian、Protobuf),可根据需求进行配置。
    • Dubbo更多地被认为是一个高性能的RPC(远程过程调用)框架,一些服务治理功能依赖于第三方组件实现,比如使用ZooKeeper、Apollo等等。
  1. Spring Cloud Netflix:
    • Spring Cloud Netflix 是 Spring Cloud 的一个子项目,结合了 Netflix 开源的多个组件,但是Netflix自2018年停止维护和更新Netflix OSS项目,包括Eureka、Hystrix等组件,所以Spring Cloud Netflix也逐渐进入了维护模式。
    • 该项目包含了许多流行的 Netflix 组件,如Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Hystrix(断路器)、Zuul(API 网关)等。它们都是高度可扩展的、经过大规模实践验证的微服务组件。
  1. Spring Cloud Alibaba:
    • Spring Cloud Alibaba 是 Spring Cloud 的另一个子项目,与阿里巴巴的分布式应用开发框架相关。它提供了一整套与 Alibaba 生态系统集成的解决方案。
    • 该项目包括 Nacos(服务注册与发现、配置管理)、Sentinel(流量控制、熔断降级)、RocketMQ(消息队列)等组件,以及与 Alibaba Cloud(阿里云)的集成。它为构建基于 Spring Cloud 的微服务架构提供了丰富的选项。
    • 据说SpringCloud Alibaba项目的发起人已经跑路去了腾讯,并发起了SpringCloud Tecent项目,社区发展存在隐忧

4.这三种方案有什么区别吗?

三种方案的区别:

特点DubboSpring Cloud NetflixSpring Cloud Alibaba
开发语言JavaJavaJava
服务治理提供完整的服务治理功能提供部分服务治理功能提供完整的服务治理功能
服务注册与发现ZooKeeper/NacosEureka/ConsulNacos
负载均衡自带负载均衡策略RibbonRibbon\Dubbo负载均衡策略
服务调用RPC方式RestTemplate/FeignFeign/RestTemplate/Dubbo
熔断器SentinelHystrixSentinel/Resilience4j
配置中心ApolloSpring Cloud ConfigNacos Config
API网关Higress/APISIXZuul/GatewaySpring Cloud Gateway
分布式事务Seata不支持分布式事务Seata
限流和降级SentinelHystrixSentinel
分布式追踪和监控SkywalkingSpring Cloud Sleuth + ZipkinSkyWalking或Sentinel Dashboard
微服务网格Dubbo Mesh不支持微服务网格Service Mesh(Nacos+Dubbo Mesh)
社区活跃度相对较高目前较低相对较高
孵化和成熟度孵化较早,成熟度较高成熟度较高孵化较新,但迅速发展
5.说下微服务有哪些组件?

微服务的各个组件和常见实现:

  1. 注册中心:用于服务的注册与发现,管理微服务的地址信息。常见的实现包括:
    • Spring Cloud Netflix:Eureka、Consul
    • Spring Cloud Alibaba:Nacos
  1. 配置中心:用于集中管理微服务的配置信息,可以动态修改配置而不需要重启服务。常见的实现包括:
    • Spring Cloud Netflix:Spring Cloud Config
    • Spring Cloud Alibaba:Nacos Config
  1. 远程调用:用于在不同的微服务之间进行通信和协作。常见的实现保包括:
    • RESTful API:如RestTemplate、Feign
    • RPC(远程过程调用):如Dubbo、gRPC
  1. API网关:作为微服务架构的入口,统一暴露服务,并提供路由、负载均衡、安全认证等功能。常见的实现包括:
    • Spring Cloud Netflix:Zuul、Gateway
    • Spring Cloud Alibaba:Gateway、Apisix等
  1. 分布式事务:保证跨多个微服务的一致性和原子性操作。常见的实现包括:
    • Spring Cloud Alibaba:Seata
  1. 熔断器:用于防止微服务之间的故障扩散,提高系统的容错能力。常见的实现包括:
    • Spring Cloud Netflix:Hystrix
    • Spring Cloud Alibaba:Sentinel、Resilience4j
  1. 限流和降级:用于防止微服务过载,对请求进行限制和降级处理。常见的实现包括:
    • Spring Cloud Netflix:Hystrix
    • Spring Cloud Alibaba:Sentinel
  1. 分布式追踪和监控:用于跟踪和监控微服务的请求流程和性能指标。常见的实现包括:
    • Spring Cloud Netflix:Spring Cloud Sleuth + Zipkin
    • Spring Cloud Alibaba:SkyWalking、Sentinel Dashboard

注册中心

6.注册中心是用来干什么的?

注册中心是用来管理和维护分布式系统中各个服务的地址和元数据的组件。它主要用于实现服务发现和服务注册功能。

总结一下注册中心的作用:

  1. 服务注册:各个服务在启动时向注册中心注册自己的网络地址、服务实例信息和其他相关元数据。这样,其他服务就可以通过注册中心获取到当前可用的服务列表。
  2. 服务发现:客户端通过向注册中心查询特定服务的注册信息,获得可用的服务实例列表。这样客户端就可以根据需要选择合适的服务进行调用,实现了服务间的解耦。
  3. 负载均衡:注册中心可以对同一服务的多个实例进行负载均衡,将请求分发到不同的实例上,提高整体的系统性能和可用性。
  4. 故障恢复:注册中心能够监测和检测服务的状态,当服务实例发生故障或下线时,可以及时更新注册信息,从而保证服务能够正常工作。
  5. 服务治理:通过注册中心可以进行服务的配置管理、动态扩缩容、服务路由、灰度发布等操作,实现对服务的动态管理和控制。
7.SpringCloud可以选择哪些注册中心?

SpringCloud可以与多种注册中心进行集成,常见的注册中心包括:

  1. Eureka:Eureka 是 Netflix 开源的服务发现框架,具有高可用、弹性、可扩展等特点,并与 Spring Cloud 集成良好,已闭源。ap
  2. Consul:Consul 是一种分布式服务发现和配置管理系统,由 HashiCorp 开发。它提供了服务注册、服务发现、健康检查、键值存储等功能,并支持多数据中心部署。c/ap
  3. ZooKeeper:ZooKeeper 是 Apache 基金会开源的分布式协调服务,可以用作服务注册中心。它具有高可用、一致性、可靠性等特点。 cp
  4. Nacos:Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它提供了服务注册和发现、配置管理、动态 DNS 服务等功能。 ap
  5. etcd:etcd 是 CoreOS 开源的一种分布式键值存储系统,可以被用作服务注册中心。它具有高可用、强一致性、分布式复制等特性。 cp
8.说下Eureka、ZooKeeper、Nacos的区别?
特性EurekaZooKeeperNacos
开发公司NetflixApache 基金会阿里巴巴
CAPAP(可用性和分区容忍性)CP(一致性和分区容忍性)既支持AP,也支持CP
功能服务注册与发现分布式协调、配置管理、分布式锁服务注册与发现、配置管理、服务管理
定位适用于构建基于 HTTP 的微服务架构通用的分布式协调服务框架适用于微服务和云原生应用
访问协议HTTPTCPHTTP/DNS
自我保护支持-支持
数据存储内嵌数据库、多个实例形成集群ACID 特性的分布式文件系统 ZAB 协议内嵌数据库、MySQL 等
健康检查Client BeatKeep AliveTCP/HTTP/MYSQL/Client Beat
特点简单易用、自我保护机制高性能、强一致性动态配置管理、流量管理、灰度发布等

可以看到Eureka和ZooKeeper的最大区别是一个支持AP,一个支持CP,Nacos既支持既支持AP,也支持CP。

9.Eureka实现原理了解吗?

Eureka的实现原理,大概可以从这几个方面来看:

  1. 服务注册与发现: 当一个服务实例启动时,它会向Eureka Server发送注册请求,将自己的信息注册到注册中心。Eureka Server会将这些信息保存在内存中,并提供REST接口供其他服务查询。服务消费者可以通过查询服务实例列表来获取可用的服务提供者实例,从而实现服务的发现。
  2. 服务健康检查: Eureka通过心跳机制来检测服务实例的健康状态。服务实例会定期向Eureka Server发送心跳,也就是续约,以表明自己的存活状态。如果Eureka Server在一定时间内没有收到某个服务实例的心跳,则会将其标记为不可用,并从服务列表中移除,下线实例。
  3. 服务负载均衡: Eureka客户端在调用其他服务时,会从本地缓存中获取服务的注册信息。如果缓存中没有对应的信息,则会向Eureka Server发送查询请求。Eureka Server会返回一个可用的服务实例列表给客户端,客户端可以使用负载均衡算法选择其中一个进行调用。

其它的注册中心,如Nacos、Consul等等,在服务注册和发现上,实现原理都是大同小异。

10.Eureka Server怎么保证高可用?
  1. 多实例部署: 通过将多个Eureka Server实例部署在不同的节点上,可以实现高可用性。当其中一个实例发生故障时,其他实例仍然可以提供服务,并保持注册信息的一致性。
  2. 服务注册信息的复制: 当一个服务实例向Eureka Server注册时,每个Eureka Server实例都会复制其他实例的注册信息,以保持数据的一致性。当某个Eureka Server实例发生故障时,其他实例可以接管其工作,保证整个系统的正常运行。
  3. 自我保护机制: Eureka还具有自我保护机制。当Eureka Server节点在一定时间内没有接收到心跳时,它会进入自我保护模式。在自我保护模式下,Eureka Server不再剔除注册表中的服务实例,以保护现有的注册信息。这样可以防止由于网络抖动或其他原因导致的误剔除,进一步提高系统的稳定性。

配置中心

11.为什么微服务需要配置中心?

微服务架构中的每个服务通常都需要一些配置信息,例如数据库连接地址、服务端口、日志级别等。这些配置可能因为不同环境、不同部署实例或者动态运行时需要进行调整和管理。

微服务的实例一般非常多,如果每个实例都需要一个个地去做这些配置,那么运维成本将会非常大,这时候就需要一个集中化的配置中心,去管理这些配置。

12.SpringCloud可以选择哪些配置中心?

和注册中心一样,SpringCloud也支持对多种配置中心的集成。常见的配置中心选型包括:

  1. Spring Cloud Config:官方推荐的配置中心,支持将配置文件存储在Git、SVN等版本控制系统中,并提供RESTful API进行访问和管理。
  2. ZooKeeper:一个开源的分布式协调服务,可以用作配置中心。它具有高可用性、一致性和通知机制等特性。
  3. Consul:另一个开源的分布式服务发现和配置管理工具,也可用作配置中心。支持多种配置文件格式,提供健康检查、故障转移和动态变更等功能。
  4. Etcd:一个分布式键值存储系统,可用作配置中心。它使用基于Raft算法的一致性机制,提供分布式数据一致性保证。
  5. Apollo:携程开源的配置中心,支持多种语言和框架。提供细粒度的配置权限管理、配置变更通知和灰度发布等高级特性,还有可视化的配置管理界面。
  6. Nacos:阿里巴巴开源的服务发现、配置管理和服务管理平台,也可以作为配置中心使用。支持服务注册与发现、动态配置管理、服务健康监测和动态DNS服务等功能。
13.Nacos配置中心的原理了解吗?

配置中心,说白了就是一句话:配置信息的CRUD。

具体的实现大概可以分成这么几个部分:

  1. 配置信息存储:Nacos默认使用内嵌数据库Derby来存储配置信息,还可以采用MySQL等关系型数据库。
  2. 注册配置信息:服务启动时,Nacos Client会向Nacos Server注册自己的配置信息,这个注册过程就是把配置信息写入存储,并生成版本号。
  3. 获取配置信息:服务运行期间,Nacos Client通过API从Nacos Server获取配置信息。Server根据键查找对应的配置信息,并返回给Client。
  4. 监听配置变化:Nacos Client可以通过注册监听器的方式,实现对配置信息的监听。当配置信息发生变化时,Nacos Server会通知已注册的监听器,并触发相应的回调方法。
14.Nacos配置中心长轮询机制?

一般来说客户端和服务端的交互分为两种:推(Push)和拉(Pull),Nacos在Pull的基础上,采用了长轮询来进行配置的动态刷新。

在长轮询模式下,客户端定时向服务端发起请求,检查配置信息是否发生变更。如果没有变更,服务端会"hold"住这个请求,即暂时不返回结果,直到配置发生变化或达到一定的超时时间。

  • 如果客户端发起 Pull 请求,服务端收到请求之后,先检查配置是否发生了变更:
  • 变更:返回变更配置;
  • 无变更:设置一个定时任务,延期 29.5s 执行,把当前的客户端长轮询连接加入 allSubs 队列;
  • 在这 29.5s 内的配置变化:
  • 配置无变化:等待 29.5s 后触发自动检查机制,返回配置;
  • 配置变化:在 29.5s 内任意一个时刻配置变化,会触发一个事件机制,监听到该事件的任务会遍历 allSubs 队列,找到发生变更的配置项对应的 ClientLongPolling 任务,将变更的数据通过该任务中的连接进行返回。相当于完成了一次 PUSH 操作;
  • 长轮询机制结合了 Pull 机制和 Push 机制的优点;

通过长轮询的方式,Nacos客户端能够实时感知配置的变化,并及时获取最新的配置信息。同时,这种方式也降低了服务端的压力,避免了大量的长连接占用内存资源。

远程调用

15.能说下HTTP和RPC的区别吗?

严格来讲,HTTP和不是一个层面的东西:

  • HTTP(Hypertext Transfer Protocol)是一种应用层协议,主要强调的是网络通信;
  • RPC(Remote Procedure Call,远程过程调用)是一种用于分布式系统之间通信的协议,强调的是服务之间的远程调用。

一些RPC框架比如gRPC,底层传输协议其实也是用的HTTP2,包括Dubbo3,也兼容了gRPC,使用了HTTP2作为传输层的一层协议。

HTTPRPC区别
定义HTTP(超文本传输协议)是一种用于传输超文本的协议。RPC(远程过程调用)是一种用于实现分布式系统中不同节点之间通信的协议。
通信方式基于请求-响应模型,客户端发送请求,服务器返回响应。基于方法调用模型,客户端调用远程方法并等待结果。
传输协议基于TCP协议,可使用其他传输层协议如TLS/SSL进行安全加密。可以使用多种传输协议,如TCP、UDP等。
数据格式基于文本,常用的数据格式有JSON、XML等。可以使用各种数据格式,如二进制、JSON、Protocol Buffers等。
接口定义使用RESTful风格的接口进行定义,常用的方法有GET、POST、PUT、DELETE等。使用IDL(接口定义语言)进行接口定义,如Protocol Buffers、Thrift等。
跨语言性支持跨语言通信,可以使用HTTP作为通信协议实现不同语言之间的通信。支持跨语言通信,可以使用IDL生成不同语言的客户端和服务端代码。
灵活性更加灵活,适用于不同类型的应用场景,如Web开发、API调用等。更加高效,适用于需要高性能和低延迟的分布式系统。

在微服务体系里,基于HTTP风格的远程调用通常使用框架如Feign来实现,基于RPC的远程调用通常使用框架如Dubbo来实现。

16.那Feign和Dubbo的区别呢?
FeignDubbo
定义Feign是一个声明式的Web服务客户端,用于简化HTTP API的调用。Dubbo是一个分布式服务框架,用于构建面向服务的微服务架构。
通信方式基于HTTP协议,使用RESTful风格的接口进行定义和调用。基于RPC协议,支持多种序列化协议如gRPC、Hessian等。
服务发现通常结合服务注册中心(如Eureka、Consul)进行服务发现和负载均衡。通过ZooKeeper、Nacos等进行服务注册和发现,并提供负载均衡功能。
服务治理不直接提供服务治理功能,需要结合其他组件或框架进行服务治理。提供服务注册与发现、负载均衡、容错机制、服务降级等服务治理功能。
跨语言性支持跨语言通信,可以使用HTTP作为通信协议实现不同语言之间的通信。支持跨语言通信,通过Dubbo的IDL生成不同语言的客户端和服务端代码。
生态系统集成了Spring Cloud生态系统,与Spring Boot无缝集成。拥有完整的生态系统,包括注册中心、配置中心、监控中心等组件。
适用场景适用于构建RESTful风格的微服务架构,特别适合基于HTTP的微服务调用。适用于构建面向服务的微服务架构,提供更全面的服务治理和容错机制。

需要注意的是,Feign和Dubbo并不是互斥的关系。实际上,Dubbo可以使用HTTP协议作为通信方式,而Feign也可以集成RPC协议进行远程调用。选择使用哪种远程调用方式取决于具体的业务需求和技术栈的选择。

17.服务端负载均衡器和客户端负载均衡器的区别

客户端负载均衡器的实现原理是通过注册中心,如 Nacos,将可用的服务列表拉取到本地(客户端),再通过客户端负载均衡器(设置的负载均衡策略)获取到某个服务器的具体 ip 和端口,然后再通过 Http 框架请求服务并得到结果

18.说一下Feign?

Feign是一个声明式的Web服务客户端,它简化了使用基于HTTP的远程服务的开发。

Feign是在RestTemplate 和 Ribbon的基础上进一步封装,使用RestTemplate实现Http调用,使用Ribbon实现负载均衡。

Feign的主要特点和功能包括:

  1. 声明式API:Feign允许开发者使用简单的注解来定义和描述对远程服务的访问。通过使用注解,开发者可以轻松地指定URL、HTTP方法、请求参数、请求头等信息,使得远程调用变得非常直观和易于理解。
  2. 集成负载均衡:Feign集成了Ribbon负载均衡器,可以自动实现客户端的负载均衡。它可以根据服务名和可用实例进行动态路由,并分发请求到不同的服务实例上,提高系统的可用性和可伸缩性。
  3. 容错机制:Feign支持集成Hystrix容错框架,可以在调用远程服务时提供容错和断路器功能。当远程服务不可用或响应时间过长时,Feign可以快速失败并返回预设的响应结果,避免对整个系统造成级联故障。
19.为什么Feign第一次调用耗时很长?

主要原因是由于Ribbon的懒加载机制,当第一次调用发生时,Feign会触发Ribbon的加载过程,包括从服务注册中心获取服务列表、建立连接池等操作,这个加载过程会增加首次调用的耗时。

那怎么解决这个问题呢?

可以在应用启动时预热Feign客户端,自动触发一次无关紧要的调用,来提前加载Ribbon和其他相关组件。这样,就相当于提前进行了第一次调用。

20.Feign怎么实现认证传递?

比较常见的一个做法是,使用拦截器传递认证信息。可以通过实现RequestInterceptor接口来定义拦截器,在拦截器里,把认证信息添加到请求头中,然后将其注册到Feign的配置中。

@Configuration
public class FeignClientConfig {

    @Bean
    public RequestInterceptor requestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate template) {
                // 添加认证信息到请求头中
                template.header("Authorization", "Bearer " + getToken());
            }
        };
    }

    private String getToken() {
        // 获取认证信息的逻辑,可以从SecurityContext或其他地方获取
        // 返回认证信息的字符串形式
        return "your_token";
    }
}
21.Fegin怎么做负载均衡?Ribbon?

在Feign中,负载均衡是通过集成Ribbon来实现的。

Ribbon是Netflix开源的一个客户端负载均衡器,可以与Feign无缝集成,为Feign提供负载均衡的能力。

Ribbon在发起请求前,会从“服务中心”获取服务列表(清单),然后按照一定的负载均衡策略去发起请求,从而实现客户端的负载均衡。Ribbon本身也维护着“服务提供者”清单的有效性。如果它发现“服务提供者”不可用,则会重新从“服务中心”获取有效的“服务提供者”清单来及时更新。

22.说说有哪些负载均衡算法?
  1. 轮询算法(Round Robin):轮询算法是最简单的负载均衡算法之一。它按照顺序将请求依次分配给每个后端服务器,循环往复。当请求到达时,负载均衡器按照事先定义的顺序选择下一个服务器。轮询算法适用于后端服务器具有相同的处理能力和性能的场景。
  2. 加权轮询算法(Weighted Round Robin):加权轮询算法在轮询算法的基础上增加了权重的概念。每个后端服务器都被赋予一个权重值,权重值越高,被选中的概率就越大。这样可以根据服务器的处理能力和性能调整请求的分配比例,使得性能较高的服务器能够处理更多的请求。
  3. 随机算法(Random):随机算法将请求随机分配给后端服务器。每个后端服务器有相等的被选中概率,没有考虑服务器的实际负载情况。这种算法简单快速,适用于后端服务器性能相近且无需考虑请求处理能力的场景。
  4. 加权随机算法(Weighted Random):加权随机算法在随机算法的基础上引入了权重的概念。每个后端服务器被赋予一个权重值,权重值越高,被选中的概率就越大。这样可以根据服务器的处理能力和性能调整请求的分配比例。
  5. 最少连接算法(Least Connection):最少连接算法会根据后端服务器当前的连接数来决定请求的分配。负载均衡器会选择当前连接数最少的服务器进行请求分配,以保证后端服务器的负载均衡。这种算法适用于后端服务器的处理能力不同或者请求的处理时间不同的场景。
  6. 哈希算法(Hash):哈希算法会根据请求的某个特定属性(如客户端IP地址、请求URL等)计算哈希值,然后根据哈希值选择相应的后端服务器。

常见的负载均衡器,比如Ribbion、Gateway等等,基本都支持这些负载均衡算法。

服务容灾

23.什么是服务雪崩?

在微服务中,假如一个或者多个服务出现故障,如果这时候,依赖的服务还在不断发起请求,或者重试,那么这些请求的压力会不断在下游堆积,导致下游服务的负载急剧增加。不断累计之下,可能会导致故障的进一步加剧,可能会导致级联式的失败,甚至导致整个系统崩溃,这就叫服务雪崩。

一般,为了防止服务雪崩,可以采用这些措施:

  1. 服务高可用部署:确保各个服务都具备高可用性,通过冗余部署、故障转移等方式来减少单点故障的影响。
  2. 限流和熔断:对服务之间的请求进行限流和熔断,以防止过多的请求涌入导致后端服务不可用。
  3. 缓存和降级:合理使用缓存来减轻后端服务的负载压力,并在必要时进行服务降级,保证核心功能的可用性。
24.什么是服务熔断?什么是服务降级?

什么是服务熔断

服务熔断是微服务架构中的容错机制,用于保护系统免受服务故障或异常的影响。当某个服务出现故障或异常时,服务熔断可以快速隔离该服务,确保系统稳定可用。

它通过监控服务的调用情况,当错误率或响应时间超过阈值时,触发熔断机制,后续请求将返回默认值或错误信息,避免资源浪费和系统崩溃。

服务熔断还支持自动恢复,重新尝试对故障服务的请求,确保服务恢复正常后继续使用。

什么是服务降级

服务降级是也是一种微服务架构中的容错机制,用于在系统资源紧张或服务故障时保证核心功能的可用性。

当系统出现异常情况时,服务降级会主动屏蔽一些非核心或可选的功能,而只提供最基本的功能,以确保系统的稳定运行。通过减少对资源的依赖,服务降级可以保证系统的可用性和性能。

它可以根据业务需求和系统状况来制定策略,例如替换耗时操作、返回默认响应、返回静态错误页面等。

25.有哪些熔断降级方案实现?
框架实现方案特点
Spring CloudNetflix Hystrix- 提供线程隔离、服务降级、请求缓存、请求合并等功能 - 可与Spring Cloud其他组件无缝集成 - 官方已宣布停止维护,推荐使用Resilience4j代替
Spring CloudResilience4j- 轻量级服务熔断库 - 提供类似于Hystrix的功能 - 具有更好的性能和更简洁的API - 可与Spring Cloud其他组件无缝集成
Spring Cloud AlibabaSentinel- 阿里巴巴开源的流量控制和熔断降级组件 - 提供实时监控、流量控制、熔断降级等功能 - 与Spring Cloud Alibaba生态系统紧密集成
DubboDubbo自带熔断降级机制- Dubbo框架本身提供的熔断降级机制 - 可通过配置实现服务熔断和降级 - 与Dubbo的RPC框架紧密集成
26.Hystrix怎么实现服务容错?

尽管已经不再更新,但是Hystrix是非常经典的服务容错开源库,它提供了多种机制来保护系统:

  1. 服务熔断(Circuit Breaker):Hystrix通过设置阈值来监控服务的错误率或响应时间。当错误率或响应时间超过预设的阈值时,熔断器将会打开,后续的请求将不再发送到实际的服务提供方,而是返回预设的默认值或错误信息。这样可以快速隔离故障服务,防止故障扩散,提高系统的稳定性和可用性。

  2. 服务降级(Fallback):当服务熔断打开时,Hystrix可以提供一个备用的降级方法或返回默认值,以保证系统继续正常运行。开发者可以定义降级逻辑,例如返回缓存数据、执行简化的逻辑或调用其他可靠的服务,以提供有限但可用的功能。

  3. 请求缓存(Request Caching):Hystrix可以缓存对同一请求的响应结果,当下次请求相同的数据时,直接从缓存中获取,避免重复的网络请求,提高系统的性能和响应速度。

  4. 请求合并(Request Collapsing):Hystrix可 以将多个并发的请求合并为一个批量请求,减少网络开销和资源占用。这对于一些高并发的场景可以有效地减少请求次数,提高系统的性能。

  5. 实时监控和度量(Real-time Monitoring and Metrics):Hystrix提供了实时监控和度量功能,可以对服务的执行情况进行监控和统计,包括错误率、响应时间、并发量等指标。通过监控数据,可以及时发现和解决服务故障或性能问题。

  6. 线程池隔离(Thread Pool Isolation):Hystrix将每个依赖服务的请求都放在独立的线程池中执行,避免因某个服务的故障导致整个系统的线程资源耗尽。通过线程池隔离,可以提高系统的稳定性和可用性。

    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    
    /**
    * 服务降级示例
    **/
    @Service
    public class MyService {
    
        @HystrixCommand(fallbackMethod = "fallbackMethod")
        public String myServiceMethod() {
            // 实际的服务调用逻辑
            // ...
        }
    
        public String fallbackMethod() {
            // 降级方法的逻辑,当服务调用失败时会执行此方法
            // 可以返回默认值或执行其他备用逻辑
            // ...
        }
    }
    
27.Sentinel怎么实现限流的?

Sentinel通过动态管理限流规则,根据定义的规则对请求进行限流控制。具体实现步骤如下:

定义资源:在Sentinel中,资源可以是URL、方法等,用于标识需要进行限流的请求。

// 原本的业务方法.
@SentinelResource(blockHandler = "blockHandlerForGetUser")
public User getUserById(String id) {
    throw new RuntimeException("getUserById command failed");
}

// blockHandler 函数,原方法调用被限流/降级/系统保护的时候调用
public User blockHandlerForGetUser(String id, BlockException ex) {
    return new User("admin");
}

配置限流规则:在Sentinel的配置文件中定义资源的限流规则。规则可以包括资源名称、限流阈值、限流模式(令牌桶或漏桶)等。

private static void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();   
    FlowRule rule1 = new FlowRule();  // 创建一个流控规则
    rule1.setResource(resource);   // 设置要限流的资源名称
    rule1.setCount(20);  // 设置最大 QPS 为 20
    rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);  // 设置限流的维度为 QPS
    rule1.setLimitApp("default");  // 设置限制的应用名称为 "default"
    rules.add(rule1);  // 将规则添加到规则列表中
    FlowRuleManager.loadRules(rules);  // 加载规则列表,使限流规则生效
}

监控流量:Sentinel会监控每个资源的流量情况,包括请求的QPS(每秒请求数)、线程数、响应时间等。

限流控制:当请求到达时,Sentinel会根据资源的限流规则判断是否需要进行限流控制。如果请求超过了限流阈值,则可以进行限制、拒绝或进行其他降级处理。

28.Sentinel采用的什么限流算法?

Sentinel使用滑动窗口限流算法来实现限流。

滑动窗口限流算法是一种基于时间窗口的限流算法。它将一段时间划分为多个时间窗口,并在每个时间窗口内统计请求的数量。通过动态地调整时间窗口的大小和滑动步长,可以更精确地控制请求的通过速率。

29.Sentinel怎么实现集群限流?

Sentinel利用了Token Server和Token Client的机制来实现集群限流。

开启集群限流后,Client向Token Server发送请求,Token Server根据配置的规则决定是否限流。

服务网关

30.什么是API网关?

API网关(API Gateway)是一种中间层服务器,用于集中管理、保护和路由对后端服务的访问。它充当了客户端与后端服务之间的入口点,提供了一组统一的接口来管理和控制API的访问。

API网关的主要功能包括:

  1. 路由转发:API网关根据请求的URL路径或其他标识,将请求路由到相应的后端服务。通过配置路由规则,可以灵活地将请求分发给不同的后端服务。
  2. 负载均衡:API网关可以在后端服务之间实现负载均衡,将请求平均分发到多个实例上,提高系统的吞吐量和可扩展性。
  3. 安全认证与授权:API网关可以集中处理身份验证和授权,确保只有经过身份验证的客户端才能访问后端服务。它可以与身份提供者(如OAuth、OpenID Connect)集成,进行用户认证和授权操作。
  4. 缓存:API网关可以缓存后端服务的响应,减少对后端服务的请求次数,提高系统性能和响应速度。
  5. 监控与日志:API网关可以收集和记录请求的指标和日志,提供实时监控和分析,帮助开发人员和运维人员进行故障排查和性能优化。
  6. 数据转换与协议转换:API网关可以在客户端和后端服务之间进行数据格式转换和协议转换,如将请求从HTTP转换为WebSocket,或将请求的参数进行格式转换,以满足后端服务的需求。
  7. API版本管理:API网关可以管理不同版本的API,允许同时存在多个API版本,并通过路由规则将请求正确地路由到相应的API版本上。

通过使用API网关,可以简化前端与后端服务的交互,提供统一的接口和安全性保障,同时也方便了服务治理和监控。它是构建微服务架构和实现API管理的重要组件之一。

31.SpringCloud可以选择哪些API网关?

使用SpringCloud开发,可以采用以下的API网关选型:

  1. Netflix Zuul(已停止更新):Netflix Zuul是Spring Cloud早期版本中提供的默认API网关。它基于Servlet技术栈,可以进行路由、过滤、负载均衡等功能。然而,自2020年12月起,Netflix宣布停止对Zuul 1的维护,转而支持新的API网关项目。
  2. Spring Cloud Gateway:Spring Cloud Gateway是Spring Cloud官方推荐的API网关,取代了Netflix Zuul。它基于非阻塞的WebFlux框架,充分利用了响应式编程的优势,并提供了路由、过滤、断路器、限流等特性。Spring Cloud Gateway还支持与Spring Cloud的其他组件集成,如服务发现、负载均衡等。
  3. Kong:Kong是一个独立的、云原生的API网关和服务管理平台,可以与Spring Cloud集成。Kong基于Nginx,提供了强大的路由、认证、授权、监控和扩展能力。它支持多种插件和扩展,可满足不同的API管理需求。
  4. APISIX:APISIX基于Nginx和Lua开发,它具有强大的路由、流量控制、插件扩展等功能。APISIX支持灵活的配置方式,可以根据需求进行动态路由、负载均衡和限流等操作。
32.Spring Cloud Gateway核心概念?

在Spring Cloud Gateway里,有三个关键组件:

  • Route(路由):路由是Spring Cloud Gateway的基本构建块,它定义了请求的匹配规则和转发目标。通过配置路由,可以将请求映射到后端的服务实例或URL上。路由规则可以根据请求的路径、方法、请求头等条件进行匹配,并指定转发的目标URI。
  • Predicate(断言):断言用于匹配请求的条件,如果请求满足断言的条件,则会应用所配置的过滤器。Spring Cloud Gateway提供了多种内置的断言,如Path(路径匹配)、Method(请求方法匹配)、Header(请求头匹配)等,同时也支持自定义断言。
  • Filter(过滤器):过滤器用于对请求进行处理和转换,可以修改请求、响应以及执行其他自定义逻辑。Spring Cloud Gateway提供了多个内置的过滤器,如请求转发、请求重试、请求限流等。同时也支持自定义过滤器,可以根据需求编写自己的过滤器逻辑。

又有两个比较重要的概念:

  • Gateway Handler(网关处理器):网关处理器是Spring Cloud Gateway的核心组件,负责将请求转发到匹配的路由上。它根据路由配置和断言条件进行路由匹配,选择合适的路由进行请求转发。网关处理器还会依次应用配置的过滤器链,对请求进行处理和转换。
  • Gateway Filter Chain(网关过滤器链):网关过滤器链由一系列过滤器组成,按照配置的顺序依次执行。每个过滤器可以在请求前、请求后或请求发生错误时进行处理。过滤器链的执行过程可以修改请求、响应以及执行其他自定义逻辑。
33.为什么要用微服务链路追踪?

在微服务中,有的上下游可能有十几个服务,如果某一环出了问题,排查起来非常困难,所以,就需要进行链路追踪,来帮助排查问题。

通过链路追踪,可以可视化地追踪请求从一个微服务到另一个微服务的调用情况。除了排查问题,链路追踪黑还可以帮助优化性能,可视化依赖关系、服务监控和告警。

34.SpringCloud可以选择哪些微服务链路追踪方案?

Spring Cloud提供了多种选择的微服务链路追踪方案。以下是一些常用的方案:

  1. Zipkin:Zipkin 是一个开源的分布式实时追踪系统,由 Twitter 开发并贡献给开源社区。Spring Cloud Sleuth 提供了与 Zipkin 的集成,可以通过在微服务中添加相应的依赖和配置,将追踪信息发送到 Zipkin 服务器,并通过 Zipkin UI 进行可视化展示和查询。
  2. Jaeger:Jaeger 是 Uber 开源的分布式追踪系统,也被纳入了 CNCF(云原生计算基金会)的维护。通过使用 Spring Cloud Sleuth 和 Jaeger 客户端库,可以将追踪信息发送到 Jaeger 并进行可视化展示和查询。
  3. SkyWalking:Apache SkyWalking 是一款开源的应用性能监控与分析系统,提供了对 Java、.NET 和 Node.js 等语言的支持。它可以与 Spring Cloud Sleuth 集成,将追踪数据发送到 SkyWalking 服务器进行可视化展示和分析。
  4. Pinpoint:Pinpoint 是 Naver 开源的分布式应用性能监控系统,支持 Java 和 .NET。它提供了与 Spring Cloud Sleuth 的集成,可以将追踪数据发送到 Pinpoint 服务器,并通过其 UI 进行分析和监控。

这些方案都可以与 Spring Cloud Sleuth 进行集成,Spring Cloud Sleuth 是 Spring Cloud 中的一个组件,提供了在微服务调用时生成追踪信息的能力。

分布式事务

35.Seata支持哪些模式的分布式事务?

Seata以下几种模式的分布式事务:

  1. AT(Atomikos)模式:AT模式是Seata默认支持的模式,也是最常用的模式之一。在AT模式下,Seata通过在业务代码中嵌入事务上下文,实现对分布式事务的管理。Seata会拦截并解析业务代码中的SQL语句,通过对数据库连接进行拦截和代理,实现事务的管理和协调。
  2. TCC(Try-Confirm-Cancel)模式:TCC模式是一种基于补偿机制的分布式事务模式。在TCC模式中,业务逻辑需要实现Try、Confirm和Cancel三个阶段的操作。Seata通过调用业务代码中的Try、Confirm和Cancel方法,并在每个阶段记录相关的操作日志,来实现分布式事务的一致性。
  3. SAGA模式:SAGA模式是一种基于事件驱动的分布式事务模式。在SAGA模式中,每个服务都可以发布和订阅事件,通过事件的传递和处理来实现分布式事务的一致性。Seata提供了与SAGA模式兼容的Saga框架,用于管理和协调分布式事务的各个阶段。
  4. XA模式:XA模式是一种基于两阶段提交(Two-Phase Commit)协议的分布式事务模式。在XA模式中,Seata通过与数据库的XA事务协议进行交互,实现对分布式事务的管理和协调。XA模式需要数据库本身支持XA事务,并且需要在应用程序中配置相应的XA数据源。
36.了解Seata的实现原理吗?

Seata的实现原理主要包括三个核心组件:事务协调器(Transaction Coordinator)、事务管理器(Transaction Manager)和资源管理器(Resource Manager)。

  • 事务协调器(Transaction Coordinator):事务协调器负责协调和管理分布式事务的整个过程。它接收事务的开始和结束请求,并根据事务的状态进行协调和处理。事务协调器还负责记录和管理事务的全局事务 ID(Global Transaction ID)和分支事务 ID(Branch Transaction ID)。
  • 事务管理器(Transaction Manager):事务管理器负责全局事务的管理和控制。它协调各个分支事务的提交或回滚,并保证分布式事务的一致性和隔离性。事务管理器还负责与事务协调器进行通信,并将事务的状态变更进行持久化。
  • 资源管理器(Resource Manager):资源管理器负责管理和控制各个参与者(Participant)的事务操作。它与事务管理器进行通信,并根据事务管理器的指令执行相应的事务操作,包括提交和回滚。

Seata的实现原理基于两阶段提交(Two-Phase Commit)协议,具体的机制如下:

  1. 一阶段:在事务提交的过程中,首先进行预提交阶段。事务协调器向各个资源管理器发送预提交请求,资源管理器执行相应的事务操作并返回执行结果。在此阶段,业务数据和回滚日志记录在同一个本地事务中提交,并释放本地锁和连接资源。
  2. 二阶段:在预提交阶段成功后,进入真正的提交阶段。此阶段主要包括提交异步化和回滚反向补偿两个步骤:
    • 提交异步化:事务协调器发出真正的提交请求,各个资源管理器执行最终的提交操作。这个阶段的操作是非常快速的,以确保事务的提交效率。
    • 回滚反向补偿:如果在预提交阶段中有任何一个资源管理器返回失败结果,事务协调器发出回滚请求,各个资源管理器执行回滚操作,利用一阶段的回滚日志进行反向补偿。
37.Seata的事务执行流程是什么样的?

Seata事务的执行流程可以简要概括为以下几个步骤:

  1. 事务发起方(Transaction Starter)发起全局事务:事务发起方是指发起分布式事务的应用程序或服务。它向Seata的事务协调器发送全局事务的开始请求,生成全局事务ID(Global Transaction ID)。
  2. 事务协调器创建全局事务记录:事务协调器接收到全局事务的开始请求后,会为该事务创建相应的全局事务记录,并生成分支事务ID(Branch Transaction ID)。
  3. 分支事务注册:事务发起方将全局事务ID和分支事务ID发送给各个参与者(Participant),即资源管理器。参与者将分支事务ID注册到本地事务管理器,并将事务的执行结果反馈给事务协调器。
  4. 执行业务逻辑:在分布式事务的上下文中,各个参与者执行各自的本地事务,即执行业务逻辑和数据库操作。
  5. 预提交阶段:事务发起方向事务协调器发送预提交请求,事务协调器将预提交请求发送给各个参与者。
  6. 执行本地事务确认:参与者接收到预提交请求后,执行本地事务的确认操作,并将本地事务的执行结果反馈给事务协调器。
  7. 全局事务提交或回滚:事务协调器根据参与者反馈的结果进行判断,如果所有参与者的本地事务都执行成功,事务协调器发送真正的提交请求给参与者,参与者执行最终的提交操作;如果有任何一个参与者的本地事务执行失败,事务协调器发送回滚请求给参与者,参与者执行回滚操作。
  8. 完成全局事务:事务协调器接收到参与者的提交或回滚结果后,根据结果更新全局事务的状态,并通知事务发起方全局事务的最终结果。
38.全局事务ID和分支事务ID是怎么传递的?

全局事务ID和分支事务ID在分布式事务中通过上下文传递的方式进行传递。常见的传递方式包括参数传递、线程上下文传递和消息中间件传递。具体的传递方式可以根据业务场景和技术选型进行选择和调整。

39.Seata的事务回滚是怎么实现的?

Seata的事务回滚是通过回滚日志实现的。每个参与者在执行本地事务期间生成回滚日志,记录了对数据的修改操作。

当需要回滚事务时,事务协调器向参与者发送回滚请求,参与者根据回滚日志中的信息执行撤销操作,将数据恢复到事务开始前的状态。

回滚日志的管理和存储是Seata的核心机制,可以选择将日志存储在不同的介质中。通过回滚日志的持久化和恢复,Seata确保了事务的一致性和恢复性。

40.你们的服务怎么做监控和告警?

我们使用Prometheus和Grafana来实现整个微服务集群的监控和告警:

  1. Prometheus:Prometheus 是一个开源的监控系统,具有灵活的数据模型和强大的查询语言,能够收集和存储时间序列数据。它可以通过HTTP协议定期拉取微服务的指标数据,并提供可扩展的存储和查询功能。
  2. Grafana:Grafana 是一个开源的可视化仪表板工具,可以与 Prometheus 结合使用,创建实时和历史数据的仪表板。Grafana 提供了丰富的图表和可视化选项,可以帮助用户更好地理解和分析微服务的性能和状态。
41.你们的服务怎么做日志收集?

日志收集有很多种方案,我们用的是ELK:

  • Elasticsearch:Elasticsearch是一个分布式搜索和分析引擎,用于存储和索引大量的日志数据。它提供了快速的搜索和聚合功能,可以高效地处理大规模的日志数据。
  • Logstash:Logstash是一个用于收集、过滤和转发日志数据的工具。它可以从各种来源(如文件、网络、消息队列等)收集日志数据,并对数据进行处理和转换,然后将其发送到Elasticsearch进行存储和索引。
  • Kibana:Kibana是一个用于日志数据可视化和分析的工具。它提供了丰富的图表、仪表盘和搜索功能,可以帮助用户实时监控和分析日志数据,发现潜在的问题和趋势。

简单说,这三者里Elasticsearch提供数据存储和检索能力,Logstash负责将日志收集到ES,Kibana负责日志数据的可视化分析。

  1. 在每个微服务中配置日志输出:将微服务的日志输出到标准输出(stdout)或日志文件。
  2. 使用Logstash收集日志:配置Logstash收集器,通过配置输入插件(如文件输入、网络输入等)监听微服务的日志输出,并进行过滤和处理。
  3. 将日志数据发送到Elasticsearch:配置Logstash的输出插件,将经过处理的日志数据发送到Elasticsearch进行存储和索引。
  4. 使用Kibana进行可视化和分析:通过Kibana连接到Elasticsearch,创建仪表盘、图表和搜索查询,实时监控和分析微服务的日志数据。

除了应用最广泛的ELK,还有一些其它的方案比如Fluentd、Graylog、Loki、Filebeat,一些云厂商也提供了付费方案,比如阿里云的sls。

42.使用OAuth2时,如何存储和传输敏感信息,例如用户名和密码

使用OAuth2时,不建议直接存储和传输敏感信息,比如用户名和密码。这是由于OAuth2协议自身的设计,它鼓励使用临时凭证(例如访问令牌和刷新令牌)进行安全地授权和认证,而不是直接使用敏感的用户信息。

以下是使用OAuth2时存储和传输敏感信息的常见做法:

  1. 用户登录并授权:用户在客户端应用程序(比如网站或移动应用)上输入他们的用户名和密码,然后客户端应用程序将用户提交的信息发送到授权服务器进行验证。如果用户信息验证成功,授权服务器将生成一个访问令牌并将其发送回客户端应用程序。
  2. 访问令牌的使用:客户端应用程序存储访问令牌,并将其包含在每个请求中,以证明它们的身份。然而,客户端应用程序不应存储敏感的用户名和密码信息。
  3. 刷新令牌的使用:访问令牌通常有一个有限的生命周期,当它过期时,客户端应用程序可以使用刷新令牌从授权服务器获取一个新的访问令牌。同样地,客户端应用程序不应存储敏感的用户名和密码信息。
  4. 敏感信息的存储:敏感的用户信息(如密码)应存储在安全的环境中,如数据库或密钥管理系统中。这些信息应被适当地加密和保护,以防止未经授权的访问。
  5. 安全的通信协议:在传输敏感信息和访问令牌时,应使用安全的通信协议(如HTTPS)以确保信息不被拦截或篡改。

以上是一般的做法,但实际操作中可能还需要考虑其他因素,比如数据的备份和恢复策略、对第三方服务的信任程度等。

43.OAuth2有哪几种授权模式

OAuth2的授权模式包括以下四种:

  1. 授权码模式:这是最常用且安全相最高的授权模式。在具有后端服务器web客户端的环境中,token令牌保存在客户端后端,对资源服务器访问在后端完成,可以有效避免token泄露。
  2. 隐式授权模式/简化模式:这种模式下,用户的授权码直接被返回到客户端,而不是在后端保存。隐式授权模式与简化模式在实际应用中具有较高的安全性。
  3. 密码模式:在这种模式下,用户向客户端提供他们的密码,客户端用密码来获取访问令牌。这种模式在实现上最简单,但在安全性方面却存在一些问题,因为密码可能会被泄露。
  4. 客户端凭证模式:在此模式下,客户端以自己的身份去访问资源服务器,这种模式在实现上也比较简单,但同样存在安全性的问题。

以上是OAuth2的四种授权模式,具体选择哪种模式需要根据实际应用场景和安全需求来决定。

44.使用OAuth2有什么优点和缺点

使用OAuth2有以下几个优点:

  1. 安全性:OAuth2协议允许客户端不接触用户密码,这提高了系统的安全性。服务器端也更容易集中保护用户信息,因为所有的认证和授权信息都集中在服务器端,而不是分散在各个客户端。
  2. 广泛使用:OAuth2是一个广泛应用的认证标准,已经被许多公司和组织采用,因此,使用OAuth2可以使你的应用更容易被其他公司或组织集成。
  3. 令牌短寿命和封装:OAuth2使用短寿命的访问令牌,这减少了泄露和攻击的风险。并且,OAuth2还提供了灵活的令牌封装机制,这使得不同的客户端和应用可以方便地使用令牌来获取授权。
  4. 资源服务器和授权服务器解耦:在OAuth2中,资源服务器和授权服务器是分离的,这使得系统的结构清晰,同时也方便了不同系统之间的集成。
  5. 集中式授权:OAuth2通过专门的服务来进行授权认证,这简化了客户端的处理。客户端只需要与这个授权服务器进行交互,就可以获得授权。

然而,使用OAuth2也存在一些缺点:

  1. 对接流程长:使用OAuth2进行认证和授权需要理解并实现许多概念,这可能会使对接流程变得相对复杂和耗时。
  2. 使用不当可能造成安全漏洞:虽然OAuth2协议本身是安全的,但如果使用不当,例如令牌管理不善或者授权过大,都可能导致安全漏洞。
  3. 不同的实现方式可能存在兼容性问题:不同的公司和组织可能会根据OAuth2协议实现自己的认证系统,这可能会导致不同系统之间的兼容性问题。
45.什么是限流算法,网关如何实现限流

限流算法是指用于限制单位时间内服务的请求数量的算法,目的是防止服务被过高的请求压力所击垮。常见的限流算法包括计数器算法、滑动窗口算法、漏桶算法、令牌桶算法

网关如何实现限流:

  1. 利用限流算法插件/模块:网关可以集成限流算法插件/模块,通过配置相关参数(如令牌桶大小、令牌生成速率等)来实现限流。例如,Spring Cloud Gateway可以使用Redis的RateLimiter限流算法插件来实现限流。
  2. 自定义限流逻辑:网关可以通过编程方式自定义实现限流逻辑。例如,在微服务架构中,可以在每个服务的网关层(如Nacos、Eureka等)实现限流逻辑,或者使用限流SDK(如Sentinel)对请求进行限流。
  3. 利用云平台提供的限流功能:一些云平台提供了自动化的限流功能,例如AWS CloudWatch、Azure Application Insights等,网关可以利用这些云平台的功能来实现限流。
46.在微服务架构中,网关的作用是什么

在微服务架构中,网关(Gateway)具有以下作用:

  1. 统一入口:网关为所有的微服务提供一个唯一的入口点,从而简化了客户端与服务的交互,同时保障了后台服务的安全性。
  2. 鉴权校验:网关能够识别每个进来的请求,并根据其权限进行校验,阻止不符合要求的请求通过。
  3. 动态路由:根据需要,网关可以动态地将请求路由到不同的后端集群中,实现服务的灵活调度。
  4. 降低耦合度:通过在网关层做映射,可以将客户端与服务解耦,使服务可以独立发展,减少两者之间的依赖。
  5. 提供附加功能:网关不仅可以保护微服务,还可以为服务提供和沉淀更多附加功能,如熔断、限流等。
47.什么情况下需要用到分布式事务?有哪些方案?

分布式事务是指在多个网络节点或服务之间进行数据一致性处理的情况。以下是一些可能需要使用分布式事务的场景:

  1. 微服务之间通过远程调用完成事务操作:当不同的微服务之间需要进行数据一致性保证时,就需要使用分布式事务。例如,一个电商微服务中的订单服务和库存服务需要通过远程调用进行事务操作,保证库存数量和订单信息的同步更新,避免出现超卖或缺货的情况。
  2. 单体系统访问多个数据库实例:当一个系统需要访问多个数据库实例时,例如用户信息和订单信息分别存储在两个不同的数据库实例中,需要通过分布式事务保证数据一致性,避免出现数据不一致的情况。
  3. 多服务访问同一个数据库实例:当多个服务访问同一个数据库实例时,例如订单微服务和库存微服务都需要访问同一个数据库,也可能需要使用分布式事务。因为跨JVM进程的多个服务同时持有不同的数据库连接进行数据库操作,可能会出现数据不一致的情况。

在这些场景下,我们需要使用分布式事务来保证数据的一致性。常用的分布式事务方案包括两阶段提交(2PC)、三阶段提交(3PC)、TCC、Saga、本地消息表等。其中,两阶段提交和三阶段提交都是基于锁机制实现的,而TCC、Saga和本地消息表则是基于业务逻辑实现的。选择哪种方案取决于业务需求、系统复杂性和性能等多个因素

48.说说Seata的执行流程

Seata的整体执行流程设计为两阶段提交,其执行流程如下:

第一阶段:

  1. 所有RM(Resource Manager,资源管理者,业务代码中被远程调用的部分)执行自己的本地事务。在执行本地事务时,seata使用数据源代理,在执行SQL前,对SQL进行解析,生成前置镜像SQL和后置镜像SQL,同时向undo log插入一条数据,方便后期出现异常做回滚,然后向TC(Transaction Coordinator,事务协调器)注册分支事务,提交本地事务,最后向TC提交它的分支事务状态。

第二阶段:

  1. 所有RM本地事务执行成功,此时TM(Transaction Manager,事务管理器)会向TC发起全局事务提交,TC会立马释放全局锁然后异步驱动所有RM做分支事务的提交。
  2. 存在一个RM本地事务不成功,此时TM会向TC发起全局事务回滚,TC会驱动所有的RM做回滚操作,等待所有的RM回滚成功后然后再释放全局锁。
49.什么是Seata?谈谈你对Seata的理解

Seata是一款开源的分布式事务解决方案,它主要用于解决在分布式系统中全局事务的一致性问题。

在分布式系统中,由于一次业务操作需要跨多个数据源或进行远程调用,往往会产生分布式事务问题。例如,在一个电商微服务系统中,订单服务和库存服务需要协同工作,如果订单服务已经创建成功,但库存服务因为某些原因失败了,就会导致数据不一致的问题。Seata就是为解决这个问题而产生的。

Seata的主要特点是无侵入以及高性能。它对业务无侵入,可以减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入,同时高性能则是减少分布式事务解决方案所带来的性能消耗。

在Seata的事务处理中主要有三个重要的角色:事务的协调者(TC)、事务的管理者(TM)和事务的作业管理器(RM)。

  • **事务协调者(TC)**主要负责管理全局的分支事务的状态,用于全局性事务的提交和回滚。它会对所有的分支事务进行注册,然后根据各个分支事务的状态来决定是否提交或者回滚全局事务。
  • **事务管理者(TM)**用于开启、提交或回滚事务。它会根据业务逻辑来决定何时开启一个新的事务,并在适当的时候提交或回滚该事务。
  • **资源管理器(RM)**用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接收TC的命令来提交或者回滚分支事务。
50.Sentinel 与Hystrix的区别是什么

Hystrix和Sentinel都是微服务架构中实现熔断和限流的工具,它们有以下区别和特点:

Hystrix是Netflix开源的熔断器实现,主要用于保护分布式系统中的服务调用。它的主要特点包括线程隔离、资源保护和降级处理。Hystrix通过将每个服务调用放入独立的线程池中来实现线程隔离,防止一个服务的延迟或故障影响其他服务。它通过监控服务调用的成功率、延迟等指标来保护后端资源,并在失败的请求或响应超时达到一定阈值时自动打开熔断器,避免连锁故障。此外,Hystrix还提供了降级处理功能,可以在服务不可用或响应过慢时返回预定义的降级响应,保证系统的可用性。

Sentinel是阿里巴巴开源的流量控制和系统保护工具,主要用于实现微服务架构中的流量控制、熔断、降级和系统负载保护等。它的主要特点包括实时监控和动态规则配置、丰富的流量控制策略、细粒度的服务保护以及支持多种编程语言。Sentinel可以实时监控服务的请求流量和各项指标,并提供实时的仪表盘和可视化的监控界面。它还支持通过API动态配置流量控制和熔断规则,可以根据实际情况进行动态调整。Sentinel提供了多种流量控制策略,包括基于QPS、线程数、并发连接数等多种指标进行的流量控制。此外,Sentinel还支持对每个具体的服务接口进行熔断、降级和限流等操作,以实现精确的服务保护策略。同时,Sentinel不仅支持Java,还支持Go、Python等多种编程语言,使其适用于跨语言的微服务架构。

总的来说,Hystrix注重线程隔离和资源保护,适用于保护单个服务调用。而Sentinel注重流量控制和动态规则配置,适用于对整个系统的流量进行监控和保护。根据实际需求和技术栈,可以选择适合的工具来实现微服务架构中的熔断和限流功能。

51.如果 Sentinel 的异常处理规则不满足需求,应该怎么办?

如果 Sentinel 的默认异常处理机制无法满足您的需求,您可以选择自定义异常处理规则。 Sentinel 允许您通过自定义实现 BlockedExceptionHandler 接口,然后将自定义的异常处理器对象交给 Spring 容器进行管理。 您可以根据实际业务需求,定制化异常处理策略,例如全局兜底处理、日志打印、空指针检查等。 同时,您还可以在处理器中加入自定义的业务逻辑,例如对异常进行分类、统计和反馈等。 这样,您可以根据具体的应用场景和业务需求,灵活地扩展 Sentinel 的异常处理能力。

若有收获,就点个赞吧

52.Sentinel 是什么?它是如何工作的?

Sentinel 是阿里巴巴开源的一款分布式服务架构的轻量级流量控制产品,它主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。

Sentinel 的基本概念包括资源、规则和处理器。资源是 Sentinel 的关键概念,可以是 Java 应用程序中的任何内容,例如由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。规则是围绕资源的实时状态设定的,可以包括流量控制规则、熔断降级规则以及系统保护规则,所有规则可以动态实时调整。

Sentinel 的主要功能有:

  1. 流量控制:Sentinel 可以控制每个服务或接口的并发请求数量,避免因为并发请求过多导致服务崩溃。
  2. 熔断降级:当某个服务或接口不可用时,Sentinel 可以自动触发熔断机制,避免因单个服务或接口故障导致整个系统的瘫痪。
  3. 系统负载保护:Sentinel 通过控制系统的整体负载,避免因系统过载导致服务性能下降甚至崩溃。

Sentinel 的工作原理主要分为三个步骤:

  1. 数据采集:Sentinel 通过代理模式将流量数据采集到自身,并进行数据清洗和整合。
  2. 策略计算:根据预先设定的规则和算法,Sentinel 计算并判断是否需要控制流量、熔断降级或保护系统负载。
  3. 结果执行:根据计算结果,Sentinel 对流量进行控制、熔断降级或保护系统负载等操作,以保障服务的稳定性。

总之,Sentinel 作为一款轻量级流量控制产品,适用于各种分布式服务架构,能够帮助您有效地保护服务的稳定性,提高系统的可用性和容错性。

53.什么是降级熔断?为什么要进行熔断?

熔断降级是一种分布式系统的保护机制,用于应对服务不稳定或不可用的情况。

熔断是指当某个服务的调用失败次数或异常比例达到一定阈值时,自动切断对该服务的调用,让请求快速失败,避免影响其他服务而导致雪崩效应。熔断后,一段时间内不再调用该服务,直到服务恢复正常或者超过最大等待时间。

降级是指当某个服务不可用或响应缓慢时,提供一个备用的处理逻辑,例如返回默认值、缓存值、错误提示等,以保证服务的可用性和容错性。降级可以在熔断时触发,也可以在其他情况下触发,例如系统负载过高、资源紧张等。

熔断降级的目的是为了保护系统的稳定性和可用性,防止故障扩散和蔓延,提高用户体验和信任度。

54.Seata是什么?它的工作原理是什么?

Seata是一款开源的分布式事务解决方案,它提供了一个简单、高性能和易于使用的分布式事务服务。Seata的工作原理是基于两阶段提交协议的演变,通过将业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源,然后通过异步提交的方式快速完成事务。在回滚阶段,Seata通过一阶段的回滚日志进行反向补偿。此外,Seata还提供了多种事务模式,包括AT、TCC、Saga和XA事务模式,以适应不同的业务场景。

在Seata中,分布式事务的核心组件包括全局事务管理器(GTM)和分支事务管理器(BTM)。GTM负责协调和管理全局事务,而BTM则负责管理分支事务。在分布式环境中,每个应用节点都会与GTM和BTM交互,以确保全局事务的一致性和数据的一致性。

具体来说,当一个应用启动一个全局事务时,GTM会为该事务分配一个全局事务ID,并将该ID发送给所有的应用节点。每个应用节点在执行本地事务时,都需要将全局事务ID与本地事务绑定,并将执行结果发送给BTM。如果某个节点出现故障,BTM会向GTM申请回滚全局事务,否则GTM会向所有节点广播提交指令。

55.谈谈Ribbon和Feign区别

在分布式系统的微服务构建中,Ribbon和Feign都是Netflix开发的Java库。

Ribbon是一个客户端负载均衡器,作用在于多个微服务实例间分发请求,提升可用性和性能。它可与各种HTTP客户端如RestTemplate配合使用来发送HTTP请求并进行负载均衡。

Feign则是一个声明式的HTTP客户端,通过编写接口来定义对远程微服务的需求。Feign使用注解和模板方法简化了远程调用的编写,使得调用远程服务的代码更加清晰和简洁。它更注重简洁的声明式编程模型,你只需编写接口并使用注解描述HTTP请求,Feign会在运行时生成实现类来执行实际的HTTP请求。

Ribbon和Feign都用于构建分布式系统中的微服务,但两者在用途、编程模型和集成上存在差异。Ribbon更注重负载均衡,需要配合其他库如RestTemplate来发送http请求,而Feign则采用声明式编程模型,只需编写接口和注解即可。此外,Ribbon提供了自定义负载均衡策略的能力,而Feign通常与Ribbon一起使用以实现负载均衡

总的来说,如果你需要更多的控制和自定义负载均衡策略,可以选择Ribbon;如果你更喜欢简洁的声明式编程模型,可以选择Feign。

56.Nacos的服务注册表结构是怎样的?

Nacos采用了数据的分级存储模型,最外层是Namespace,用来隔离环境。然后是Group,用来对服务分组。接下来就是服务(Service)了,一个服务包含多个实例,但是可能处于不同机房,因此Service下有多个集群(Cluster),Cluster下是不同的实例(Instance)。

对应到Java代码中,Nacos采用了一个多层的Map来表示。结构为Map<String, Map<String, Service>>,其中最外层Map的key就是namespaceId,值是一个Map。内层Map的key是group拼接serviceName,值是Service对象。Service对象内部又是一个Map,key是集群名称,值是Cluster对象。而Cluster对象内部维护了Instance的集合。

57.Nacos中的Namespace是什么?如何使用它来组织和管理微服务

**Nacos中的Namespace是用于隔离不同环境或应用之间的配置和服务信息的概念。**通过使用Namespace,可以将不同的环境(例如开发、测试和生产)或不同的应用程序(例如Web应用和移动应用)的配置和服务信息分离开来,以避免冲突和错误。

在Nacos中,每个Namespace都有自己独立的配置和服务注册表。这意味着,如果您有多个应用程序需要使用Nacos,您可以将它们分别放置在不同的Namespace中。每个Namespace都有自己的命名空间ID,用于标识该Namespace。要使用Namespace,在Nacos客户端初始化时,您需要指定要使用的Namespace ID。

通过使用Namespace,您可以对不同Namespace下的服务进行分组和管理,例如可以使用Nacos提供的Group功能对同一Namespace下的服务进行分组,方便管理和查找。同时,使用Namespace还可以对不同环境下的配置进行隔离,避免不同环境之间的配置冲突。

58.Nacos、Eureka、Zookeeper注册中心的区别

Nacos、Eureka和Zookeeper都是常用的注册中心,它们在功能和实现方式上存在一些不同。

  • Nacos除了作为注册中心外,还提供了配置管理、服务发现和事件通知等功能。Nacos默认情况下采用AP架构保证服务可用性,CP架构底层采用Raft协议保证数据的一致性。Nacos适合作为微服务注册中心和配置管理中心,支持快速发现、配置管理和服务治理等功能。
  • Eureka是只提供注册中心功能的工具,它的设计理念是AP,即保证服务的可用性,不保证一致性。Eureka的各个节点之间相互注册,只要有一台Eureka节点存在,整个微服务就可以通讯。
  • 而Zookeeper相比前两者,除了注册中心的功能,还提供了分布式协调服务,比如通知、公告、配置管理等。Zookeeper采用CP设计,可以保证数据的一致性,但是牺牲了一部分服务的可用性。Zookeeper适用于需要分布式协调服务的场景,如配置管理、命名服务等。
59.说下你对DDD的理解

领域驱动设计(DDD)是一种软件开发方法,旨在帮助开发人员更好地理解和设计复杂的软件系统。它的主要目的是让开发人员和领域专家能够更好地协作,以满足业务需求。

**DDD的关键概念包括领域模型和限界上下文。**领域模型描述了业务领域的规则和逻辑,让开发人员更好地理解业务需求;限界上下文则定义了一个特定的业务领域内的模型和代码,使其可以独立于其他上下文进行开发和维护。

此外,DDD还强调了分层架构和事件溯源的重要性。分层架构将系统划分为不同层次,各层次有不同的职责和角色,便于开发和维护;事件溯源则是一种存储和处理业务事件的技术,支持审计、合规和业务分析等需求。

总之,DDD是一种设计和开发复杂软件系统的 方法,它通过建立领域模型、分层架构、限界上下文和事件溯源等技术,使得开发人员能够更好地理解和满足业务需求。

60.说下Hystrix与Sentinel的区别

Hystrix和Sentinel都是服务熔断器,用于提高分布式系统的弹性。它们的主要区别在于实现方式、适用场景和资源模型设计。

Hystrix基于命令模式设计,将外部资源的调用封装在命令对象中,通过线程池或信号量来实现隔离。它提供了丰富的配置选项,如线程池大小、超时时间等,以实现对系统资源的有力控制。Hystrix更适用于需要高并发、快速响应的场景,因为它可以快速隔离和恢复故障。

Sentinel则基于流量控制和熔断降级的思想,可以与Spring Cloud、gRPC、Dubbo等框架集成。它通过定义资源规则和应用策略来实现对系统资源的控制。Sentinel更适用于需要流量控制和熔断降级的场景,它可以根据系统负载和响应时间来实现自动熔断和降级操作。

总之,Hystrix和Sentinel都是服务熔断器,用于提高系统的弹性。它们在实现方式、适用场景和资源模型设计等方面存在一些不同。具体选择哪个工具取决于系统的具体需求和场景

61.单体应用、SOA 和微服务架构有什么区别

单体应用、SOA和微服务架构都是不同的架构风格,适用于不同的情况。

单体应用像一个整体,所有的功能都打包在一个应用中。这种架构风格容易部署和测试,但随着系统规模的扩大,它的灵活性和可维护性会降低。

SOA是一种面向服务的架构风格,将系统划分为多个独立的服务。这些服务可以通过网络调用,并且可以跨平台、跨语言进行交互。SOA的优点是提供了跨系统的服务复用和松散耦合的交互方式,但实现SOA需要投入大量的工作,包括服务的定义、接口的选择、协议的制定等。

微服务架构进一步将系统划分为多个小型、独立的服务,每个服务都是一个单独的应用程序,可以独立部署、运行和扩展。微服务架构具有更高的灵活性和可维护性,适用于复杂的大型系统,强调服务的自治和独立性。但是,实施微服务架构也需要投入大量的工作,包括服务的定义、通信机制的选择、服务的管理等。

62.你对微服务是怎么理解的

微服务是一种架构思想,它将应用程序拆分为一系列小型、独立的服务,每个服务负责处理一项特定业务功能。这种架构风格的特点是服务之间松散耦合、独立部署和运行。微服务架构使得开发人员可以更加专注于单个服务的开发与测试,降低了系统的复杂性,提高了系统的可维护性和可扩展性。同时,每个服务可以根据具体的业务需求选择合适的语言、工具进行构建,提高了系统的灵活性和可维护性。在微服务架构中,服务之间通过轻量级的通信机制(如RPC、HTTP等)进行通信,每个服务都可以独立地进行部署、扩展和升级,从而提高了系统的可靠性和可用性。总的来说,微服务架构思想使得应用程序更加灵活、可维护和可扩展,为构建高效、可靠的大型应用程序提供了有力支持。

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringCloud面试题是指涉及SpringCloud框架的一系列问题。面试题的主题包括了SpringCloud的基本概念、特性、优势、微服务架构、服务注册与发现、负载均衡、熔断与降级、配置管理、消息队列、分布式事务等方面的知识。这些面试题旨在评估面试者对SpringCloud的理解和实践经验。根据引用和引用,可以找到一套包含大量经典的SpringCloud面试题及答案的参考资料。这套资料汇总了SpringCloud的常见面试题、工程师高级面试题以及一些大厂开发面试宝典。可以参考这些面试题来准备SpringCloud的面试。而引用提到的DRY原则(Don't Repeat Yourself)也是编程中的一个重要原则,它鼓励代码的重用,促进开发和共享库的使用。这也是在SpringCloud开发中需要注意的一个原则。 所以,SpringCloud面试题是一系列涉及SpringCloud框架的问题,包括基本概念、特性、优势、微服务架构、服务注册与发现、负载均衡、熔断与降级、配置管理、消息队列、分布式事务等方面的知识。可以通过参考引用和引用提供的面试题资料来准备相关面试。另外,DRY原则也是在SpringCloud开发中需要遵循的重要原则。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringCloud面试题及答案 300道,springcloud面试题总结 (持续更新)](https://blog.csdn.net/u012889902/article/details/121994645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值