SpringCloud面试题
- 微服务是什么
- 微服务是一种架构风格,它将一个大型应用程序拆分成一组小型、自治的服务,每个服务都运行在自己的进程中,通过轻量级的通信机制来相互协作,以达到高度灵活、可伸缩、可维护和可测试的目的。
- 每个服务都可以独立地开发、部署和扩展,并且可以使用不同的编程语言和技术栈来实现。微服务架构的核心思想是将应用程序按照业务功能划分出一组小的服务,每个服务都有自己的数据存储和业务逻辑,而服务之间通过网络通信协作完成整个应用的功能。
- 你知道哪些RPC框架
- RPC(远程过程调用)框架是一种用于实现分布式中不同进程或不同计算机之间通信的技术,我这里只了解Dubbo和Feign
- Dubbo:阿里巴巴开源的高性能RPC框架,支持多种协议和注册中心,提供丰富的监控和治理功能
- Spring Cloud Feign:基于Netflix Feign的Spring Cloud组件,支持声明式REST调用和负载均衡
- gRPC:Google开源的高性能RPC框架,支持多种编程语言,基于Protocol Buffers进行序列化和反序列化
- Thrift:Facebook开源的跨语言RPC框架,支持多种语言和数据格式,具有良好的性能和扩展性
- Hessian:Caucho Technology开源的轻量级RPC框架,支持多种语言和数据格式,易于使用和部署
- Apache CXF:Apache基金会的开源RPC框架,支持多种协议和数据格式,提供丰富的安全和SOAP支持
- Apache DubboX:Dubbo的扩展版本,支持更多的协议和注册中心,提供更多的功能和扩展点
- Apache Avro:Apache基金会的开源RPC框架,支持多种语言和数据格式,具有较好的性能和跨语言支持
- SpringCloud和Dubbo有什么区别
- Spring Cloud和Dubbo都是用于构建分布式系统的框架,但它们有一些区别,主要体现在以下几个方面
- 技术选型:SpringCloud采用了Spring全家桶作为技术栈,包括SpringBoot、SpringCloud Netflix、SpringCloud Config等,而Dubbo采用了Netty、Zookeeper、Hessian等技术
- 生态环境:SpringCloud是基于Spring生态环境构建的,拥有丰富的第三方库和工具,而Dubbo是阿里巴巴自主研开发的生态环境,相对较为封闭
- 协议支持:Dubbo支持多种协议,包括Dubbo、HTTP、REST等,而SpringCloud则主要只是HTTP和REST协议
- 注册中心:Dubbo的注册中心采用Zookeeper,而SpringCloud支持多种注册中心,包括Eureka、Consul、Zookeeper等
- 功能特性:Dubbo在服务治理、负载均衡、容错、监控等方面具有更为丰富和成熟的功能特性,而SpringCloud则更加注重开发体验和易用性,提供了更多的快速开发和集成解决方案
- SpringCloud由什么组成
- SpringCloud是基于SpringBoot的微服务架构框架,由多个子项目组成,包括
- SpringCloud Config:提供集中式配置管理,支持Git、SVN等多种配置源
- SpringCloud Netflix:提供对Netflix OSS组件的集成,包括Eureka服务注册中心、Zuul网管、Hystrix断路器等
- SpringCloud Gateway:基于Spring WebFlux的网关服务,提供动态路由、负载均衡、安全控制等功能
- SpringCloud OpenFeign:基于Netflix Feign的声明式REST客户端,简化服务调用的开发
- SpringCloud Bus:基于消息代理的事件总线,用于实现配置刷新、服务状态同步等功能
- SpringCloud Sleuth:提供分布式追踪解决方案,支持Zipkin、ELK等多种追踪系统
- SpringCloud Stream:基于Spring Integration的消息中渐渐框架,支持多种消息代理,包括RabbitMQ、Kafka等
- SpringCloud Security:提供基于OAuth2的安全控制解决方案,支持都中身份认证方式
- 此外,SpringCloud还提供了一些其他的子项目,包括SpringCloud Task、SpringCloud Data Flow、SpringCloud Function等,用于解决特定的问题和场景。这些子项目可以根据实际需求进行选择和集成,以构建出符合自己需求的微服务架构
- 什么是配置中心
- 配置中心是一种集中式管理配置信息的解决方案,用于管理分布式系统中的配置信息。在微服务架构中,由于服务数量众多,每个服务器都需要一些配置信息,如数据库连接、缓存配置、日记级别等,这些配置信息都需要被管理和更新,而配置中心就是为了解决这个问题而出现的
- 通常情况下,配置中心会提供一个Web界面,让管理员或开发者可以在上面修改配置信息,然后配置中心会将这些配置信息推送给各个微服务。这种方式可以大大简化配置管理的工作,并提高配置信息的可维护性和可读性。
- 为什么要使用配置中心
- 使用配置中心的好处主要有以下几点
- 集中化管理:将配置信息集中存储在一个地方,方便管理员或开发者管理和修改,减少手动修改配置文件
- 动态更新:配置中心可以支持动态更新配置信息,当配置信息发生变化时,配置中心可以自动推送更新到各个微服务,不需要重新启动应用
- 灵活性:配置中心支持多种配置文件格式,可以根据实际需求选择合适的格式,而且支持多种存储方式,如Git、SVN等版本控制系统
- 安全性:配置中心可以提供安全控制功能,如访问权限控制、数据加密等,保证配置信息的安全性
- 可扩展性:配置中心可以根据实际需求进行扩展,如增加高可用性、数据备份等功能
- 配置中心一般都会配置什么内容
- 数据库连接信息:数据库IP、端口、用户名、密码等
- 缓存配置信息:缓存服务器IP、端口、缓存策略等
- 服务调用地址:包括各个微服务的调用地址、端口等
- 日志级别:用于控制各个服务的日志级别
- 应用配置信息:应用名、版本号、环境等
- 业务参数信息:用于控制业务逻辑的参数,如超时时间、重试次数等
- 安全配置信息:包括访问权限控制、数据加密等安全配置
- SpringCloud有什么优势
- SpringCloud是基于SpringBoot的微服务开发框架,它提供了一系列的组件和工具,用于构建分布式系统中的微服务架构,其主要优势包括
- 易用性:SpringCloud提供了一系列简单易用的组件和工具,开发者可以快速构建分布式系统中的微服务架构,大大提高了开发效率
- 高可靠性:SpringCloud提供了一系列容错和故障恢复机制,包括服务发现、熔断、限流、负载均衡等,可以帮助开发者构建高可靠、高可用的分布式系统
- 可扩展性:SpringCloud支持各种开源技术和标准,如Nerflix OSS、Consul、Zookeeper、Ribbon、Feign等,可以方便地扩展和集成其他技术组件,以满足不同的也无需求
- 可管理性:SpringCloud提供了多种监控和管理工具,如Hystrix DashBoard、Turbine、Zipkin等,可以方便地监控和管理分布式系统中的微服务
- 社区支持:SpringCloud拥有庞大的社区支持,开发者可以从社区中获取各种资源和解决方案,以解决分布式系统中的各种问题。
- 项目中为什么要定义bootstrap.yml文件
- SpringBoot应用在启动时,会先加载bootstrap.yml文件,再加载application.yml文件,因此可以在bootstrap.yml中定义一些应用程序的基础配置,例如连接配置中心的相关配置。
- 在分布式系统中,使用bootstrap.yml中的配置信息连接到配置中心,可以从配置中心获取应用程序的配置信息,并将配置信息动态地推送到各个应用程序中,从而实现配置信息的动态更新和统一管理。
- 同时bootstrap.yml中的配置具有更高的优先级,可以覆盖application.yml中的配置。因此可以将一些重要的配置信息放在bootstrap.yml中,确保其优先生效
- 什么是Nacos
- Nacos(Naming and Configuration Service),是一个支持配置管理、服务发现和动态DNS服务的开源平台,由阿里巴巴开源。它可以帮助开发人员快速构建微服务应用。
- Nacos提供了服务注册与发现、配置管理、服务治理等功能,可以用于支持微服务架构中的服务注册、配置管理和动态路由等需求。其主要功能包括
- 服务注册与发现:Nacos可以帮助微服务应用完成服务的注册与发现,提供了多种服务注册方式,并支持动态服务发现
- 配置管理:Nacos可以作为配置中心,帮助微服务应用完成配置的统一管理,提供了多种配置格式和挂历方式,支持动态刷新配置
- 服务路由与调用:Nacos支持动态路由和负载均衡;可以帮助微服务应用实现服务之间的调用
- 服务监控与治理:Nacos提供了服务的健康检查、流量控制、降级和容错等功能,可以帮助开发人员实现服务的高可用和自动化治理
- 微服务是否可以读取共享配置
- 微服务可以读取共享配置。共享配置是指将一些公共的配置信息抽离出来,放到配置中心进行统一管理,不同的微服务可以根据自身需求通过配置中心来获取这些共享配置信息,这样就可以避免在每个微服务应用中都单独管理一份相同的配置,提高了配置的可维护性和统一性
- 例如Redis连接信息、日志级别等都可以作为共享配置信息,存储在配置中心。
- Ribbon的作用
- Ribbon是一个客户端负载均衡框架,可以将请求分摊到多个服务实例上,从而提高系统的可用性和性能。Ribbon是SpringCloud的一部分,通常与Eureka、Zookeeper等注册中心配合使用
- Ribbon的主要作用有两个
- 服务实例的选择:Ribbon可以根据一定的规则(如随机、轮询、加权轮询等)选择合适的服务实例,从而实现负载均衡
- 请求的重试:Ribbon还可以实现请求的重试机制,在某些情况下,由于网络等原因,请求可能会失败,此时Ribbon会根据一定的规则(如最大重试次数、重试间隔等)进行重试,从而提高请求的成功率。
- Ribbon的原理
- Ribbon的原理比较简单,主要包括以下几个步骤
- 获取服务列表:客户端向注册中心(如Eureka、Zookeeper等)获取服务列表
- 选择服务实例:根据一定的负载均衡算法(如轮询、随机、加权查询等),从服务列表中选择一个服务实例
- 发送请求:客户端向所选的服务实例发送请求,并等待响应结果
- 处理响应:如果服务实例返回响应结果,则客户端处理响应结果,并根据需要进行重试
- Ribbon和Nginx的区别
- Ribbon和Nginx都是负载均衡的工具,但它们有一些区别
- 应用场景不用:Nginx通常用于反向代理和静态文件服务,适用于Web服务器、缓存、HTTP负载均衡、反向代理等场景。而Ribbon通常用于微服务架构中,适用于客户端负载均衡的场景
- 工作原理不同:Nginx是通过将客户端请求分发到不同的后端服务器上来实现负载均衡的,而Ribbon则是在客户端上进行负载均衡。Ribbon会从注册中心获取服务列表,并选择一个合适的服务实例来处理客户端请求
- 功能不同:Nginx支持HTTP、TCP、UDP协议,可以进行反向大力、负载均衡、缓存等功能。而Ribbon则只支持HTTP和TCP协议,主要用于客户端负载均衡
- 部署方式不同;Nginx通常是以独立进程的方式运行,可以通过配置文件进行管理。而Ribbon则是作为客户端集成到应用程序中,与应用程序一起部署
- Feign的作用
- Feign是一个声明式、模块化的HTTP客户端,它可以让开发者更加方便地调用HTTP API。在SpringCloud微服务架构中,Feign通常用于简化服务间的HTTP调用,并且与Ribbon负载均衡结合使用,提供更加稳定和高效的服务调用
- 使用Feign时,只需要定义一个接口,然后使用注解来描述接口中的方法和参数。Feign会根据这些注解自动构建出HTTP请求,并且处理响应结果。这样就避免了手动构建HTTP请求的麻烦,并且可以提高代码的可读性和可维护性
- Feign的主要作用有
- 简化服务间的HTTP调用,提高开发效率
- 集成了Ribbon负载均衡,提供更加稳定和高效的服务调用
- 可以自动将HTTP请求转换为Java方法调用,并将响应结果转换为Java对象
- 支持自定义解码器、拦截器、错误处理等功能,具有良好的扩展性
- 总之,Feign是一个非常实用的HTTP客户端库,在SpringCloud微服务架构中具有重要的作用,可以简化服务间的HTTP调用,提高开发效率和代码质量
- SpringCloud有几种调用接口的方式
- 在SpringCloud微服务架构中,常见的调用接口的方式有以下几种
- RestTemplate:Spring提供的RESTful风格的HTTP客户端,可以用于调用HTTP接口,支持HTTP GET、POST、PUT、DELETE等请求方式。使用RestTemplate需要手动构建HTTP请求和解析响应结果
- Feign:一个声明式、模板化的HTTP客户端,可以让开发者更加方便地调用HTTP API。使用Feign时,之需要定义一个接口,然后使用注解来描述接口中的方法和参数。Feign会根据这些注解自动构建出HTTP请求,并且处理响应结果
- WebClient:Spring 5.0引入的响应式Web客户端,可以用于调用HTTP接口,并且支持异步非阻塞的HTTP请求和响应。WebClient支持GET、POST、PUT、DELETE等请求方式,并且支持基于Flux和Mono的响应式编程
- Gateway:SpringCloud Gateway是一个基于Spring WebFlux的API网关,可以用于对外暴露API接口,并且可以通过路由、过滤器等方式进行自定义扩展。Gateway支持HTTP请求转发、负载均衡、熔断、限流等功能,可以哟用于构建高可用、高性能的为服务架构。
- 总之,SpringCloud提供了多种调用接口的方式,可以根据具体的业务场景和需求来选择合适的方式进行调用。RestTemplate、Feign、WebClient适用于传统的非响应式的HTTP接口调用,而Gateway适用于API网关的场景
- Ribbon和Feign调用服务的区别
- Ribbon和Feign都是SpringCloud中用于调用服务的组件,二者的区别如下
- 使用方式不同:Ribbon是一个负载均衡组件,需要手动创建RestTemplate并添加负载均衡器,然后使用RestTemplate调用服务,而Feign是一个声明式的HTTP客户端,使用注解来描述需要调用的服务接口,Feign会自动根据注解生成实现,并且已经集成了Ribbon,可以自动实现负载均衡
- 对服务注册中心的依赖不同:Ribbon需要依赖Eureka或其他服务注册中心来获取服务列表,然后进行负载均衡。而Feign可以直接调用服务,也可以使用服务注册中心来实现负载均衡
- 粒度不同:Ribbon是一个底层组件,可以用于实现更细粒度的服务调用逻辑,例如在代码中手动选择服务实例,或者时间自定义的负载均衡策略。而Feign是一个高层组件,对于服务调用的实现和逻辑已经封装好了,通常只需要使用注解来描述接口,不需要关心具体的调用逻辑
- 综上所述,Ribbon和Feign都可以用于服务调用和负载均衡,二者在使用方式、服务注册中心依赖和粒度等方面存在一些差异,根据实际的业务场景和需求来选择合适的组件进行服务调用
- 说说什么是服务雪崩
- 服务雪崩通常是由于某个服务出现了故障或者过载,导致对依赖该服务的请求都超时或失败,进而引发连锁反应。此时如果没有合适的容错机制和限流措施,那么整个系统可能会因为过度的请求而崩溃。
- 为了避免服务雪崩,可以采取以下措施:
- 服务的容错机制:例如对服务进行熔断、降级等,保证出错的服务不会对其他服务造成影响。
- 服务的限流措施:例如通过限制并发请求、流量控制等方式来保证系统的稳定性。
- 服务的高可用性:通过部署多个服务实例和负载均衡等方式来保证服务的可用性。
- 监控和预警机制:及时发现服务故障并采取相应的措施,避免故障扩散。
- Hystrix断路器是什么
- Hystrix是Netflix开源的一款容错框架,用于处理分布式系统中的延迟和容错问题。它主要是为了解决服务雪崩效应而设计的,提供了断路器模式,使得在一个微服务调用失败或延迟过长时,能够通过断路器来快速地切换到备用的逻辑或服务,从而保证整个服务的稳定心和可靠性
- Hystrix的核心原理是在服务调用中添加一个拦截器,在拦截器中对服务的调用进行监控和控制,当服务调用失败或者超时时,会启动熔断器,直接返回一个快速失败的响应,避免因连锁反应导致服务雪崩的问题。同时Hystrix还提供了可视化的监控面板,方便开发者进行实时监控和调试
- 什么是服务降级、服务熔断、服务隔离
- 服务降级、服务熔断、服务隔离都是为服务架构中常见的容错机制,用于保证系统的稳定性和可靠性
- 服务降级是指当下系统出现异常或负载过高时,通过调整系统的运行策略,优先保证系统的核心功能,而暂时关闭非核心或者低优先级的功能,从而减轻系统负担,保证系统的可用性。
- 服务熔断是指当系统出现异常或负载过高时,通过关闭对一些服务的访问,从而避免不断地请求导致系统崩溃,从而保证系统的稳定性。同时,熔断器还提供了快速失败的响应,避免客户端长时间等待导致系统响应时间变慢
- 服务隔离是指将不同的服务部署在不同的容器中,通过限制每个服务的资源使用,避免由于某个服务的异常或者负载过高,导致整个系统奔溃,从而保证系统的可用性和稳定性。
- 说说RPC的实现原理
- RPC(Remote Procedure Call)是一种远程过程调用协议,其实现原理基本可以分为以下几个步骤
- 定义服务接口:定义服务的方法接口,包括方法名称、参数、返回值等信息。
- 生成代理类:客户端通过代理类来调用服务端的方法。
- 序列化数据:将客户端传递的方法名和参数等数据序列化为二进制数据。
- 发送请求:客户端通过网络将序列化后的数据发送给服务端。
- 反序列化数据:服务端接收到客户端发送的请求数据后,需要将其反序列化成具体的方法名和参数等数据。
- 调用服务:服务端根据反序列化得到的方方和参数调用对应的方法
- 序列化响应:服务端将方法的返回值序列化成二进制数据
- 发送相应:服务端将序列化后的数据通过网络发送给客户端
- 反序列化响应:客户端接收到服务端发送的响应数据后,需要将其反序列化为具体的返回值
- SpringBoot和SpringCloud的区别
- SpringBoot和SpringCloud都是基于Spring Framework的框架。SpringBoot主要关注于快速构建单体应用程序,而SpringCloud主要关注构建分布式系统的基础设施和提供微服务开发的解决方案。
- 具体来说,二者的区别如下
- 目标不同:SpringBoot旨在简化单体应用的构建,而SpringCloud旨在构建分布式系统的基础设施和微服务
- 功能不同:SpringBoot提供了一系列开箱即用的功能,如自动配置、内嵌Tomcat、SpringMVC、SpringData、SpringSecurity等;而SpringCloud则提供了一些分布式系统的基础设施和微服务解决方案,如服务注册与发现、配置中心、负载均衡、断路器、消息总线等
- 使用方式不同:SpringBoo是一个单体应用框架,开发者可以使用期快速构建单体应用,而SpringCloud则是一个基础设施框架,需要在SpringBoot的基础上进行集成和使用
- 总的来说,SpringBoot和SpringCloud都是SpringFramework的扩展和增强,但是在目标、功能和使用方式等方面有所不同。在开发分布式系统好微服务时,通常需要同时使用SpringBoot和SpringCloud
- 负载均衡的意义是什么
- 负载均衡(Load Balancing)是指将网络请求、数据流量等分发到多个服务器上,以达到提高系统性能、增加系统可用性和可伸缩性的目的。其意义主要在于以下几个方面
- 提高系统的性能:负载均衡可以将请求分散到多个服务器上进行处理,从而缩短响应时间,提高系统的吞吐量和性能
- 提高系统的可用性:负载均衡可以将请求分发到多台服务器上,当其中某一台服务器出现故障时,可以自动将请求切换到其他正常的服务器上,从而保证系统的可用性
- 提高系统的可伸缩性:负载均衡可以将请求分发到多台服务器上,当系统的负载增加是,可以通过增加服务器的数量来扩展系统的处理能力,从而提高系统的可伸缩性
- 什么是SpringCloud Gateway
- SpringCloud Gateway是SpringCloud生态系统中的一个API网关,提供了一种简单而有效的方法来对微服务的请求进行路由、过滤和转换。它是基于SpringFramework 5、Project Reactor和SpringBoot 2构建的,SpringCloud Gateway的目标是提供统一的API路由管理方式,实现请求的动态路由、熔断降级、限流控制等功能,同时可以继承第三方的服务发现组件(例如Eureka、Consul、Zookeeper等)来实现服务的注册和发现。
评论