Spring Cloud相关面试题
什么是Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
什么是微服务
微服务就是一个独立的职责单一的服务应用程序。在idea 工具里面就是一个个独立的模块,具体就是使用springboot 开发的一个模块,一个模块只做一个事情。微服务强调的是服务大小,关注的是某一个点,具体解决某一个问题/落地对应的一个服务应用。
微服务的优缺点
优点:
- 组件丰富,功能齐全。Spring Cloud 为微服务架构提供了非常完整的支持。例如、配置管理、服务发现、断路器、微服务网关等;
- 服务拆分粒度更细,耦合度比较低,有利于资源重复利用,有利于提高开发效率
- 可以更精准的制定优化服务方案,提高系统的可维护性
- 减轻团队的成本,可以并行开发
- 微服务可以是跨平台的,可以用任何一种语言开发
缺点:
- 微服务过多,治理成本高,不利于维护系统
- 分布式系统开发的成本高(容错,分布式事务等)对团队挑战大
微服务之间如何独立通讯
同步通信:dobbo通过 RPC 远程过程调用、springcloud通过REST 接口json调用等。
异步:消息队列,如:RabbitMq
、ActiveM
、Kafka
等消息队列。
Spring Cloud 的核心组件有哪些?
- Eureka:服务注册于发现。
- Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。
- Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
- Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。
- Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。
什么是服务熔断?什么是服务降级?
熔断机制是应对雪崩效应的一种微服务链路保护机制。当某个微服务不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Spring Cloud框架里熔断机制通过Hystrix实现,Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内调用20次,如果失败,就会启动熔断机制。
服务降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的fallback回调,返回一个缺省值。
Hystrix
相关注解@EnableHystrix
:开启熔断 @HystrixCommand(fallbackMethod=”XXX”)
,声明一个失败回滚处理函数XXX
,当被注解的方法执行超时(默认是1000毫秒),就会执行fallback
函数,返回错误提示。
Eureka和zookeeper 的区别?
Zookeeper保证了CP,Eureka保证了AP。 CAP:高可用、一致性、分区容错性
- 当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的信息,但不能容忍直接down掉不可用。也就是说,服务注册功能对高可用要求比较高,但zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新选leader。问题在于,选取leader时间过长,30 ~ 120s,且选取期间zk集群都不可用,这样就会导致选取期间注册服务瘫痪。漫长的选取时间导致的注册长期不可用是不能容忍的。
- Eureka保证了可用性,Eureka各个节点是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点仍然可以提供注册和查询服务。而Eureka的客户端向某个Eureka注册或发现时发生连接失败,则会自动切换到其他节点,只要有一台Eureka还在,就能保证注册服务可用,只是查到的信息可能不是最新的。
负载平衡的意义什么?
负载平衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源 的过载。使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性。
什么是Hystrix?如何实现容错
Hystrix是一个延迟和容错库,旨在隔离远程系统或服务,当出现不可避免的故障时,停止级联故障并在复杂的分布式系统中实现弹性。
假设现在有个集群,服务1一直请求到服务9,微服务9失败了,那么使用传统方法我们将传播一个异常。但这就会导致整个系统崩溃。 我们在这种情况下使用Hystrix定义了一个回退方法。这种后备方法应该具有与公开服务相同的返回类型。如果暴露服务中出现异常,则回退方法将返回一些值。
什么是Hystrix断路器
由于某些原因,使用Hystrix我们定义了一个回退方法。如果在公开服务中发生异常,则回退方法返回一些默认值。 如果异常继续发生,则Hystrix电路将中断,并且调用方将一起跳过异常的方法,直接调用回退方法。 断路器的目的是给调用其他方法留出时间,并导致异常恢复。
RPC的实现原理
即远程过程调用,是一种计算机通讯协议。
建立通信
主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有相关的数据都在这个连接里面进行传输交换。这个连接可以是短连接或长连接。
服务寻址
即A机器上的应用A要调用B机器上的应用B,通常情况下我们需要提供B机器主机名或IP地址以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。
基于Web服务协议栈的RPC,就需要提供一个endpoint URI。
网络传输
当A机器上的应用发起一个RPC调用时,需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所以要进行序列化。
当B机器接收到A机器的应用发来的请求之后,需要对接收到的参数等信息进行反序列化操作
然后再找到对应的方法进行本地调用,本地调用一般是通过生成代理Proxy去调用, 通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值 。
服务调用
B机器进行本地调用之后得到返回值,再把返回值发送回A机器,同样也需要经过序列化和反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理。
Eureka的自我保护机制
当Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端),节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式。
什么是Ribbon?
Ribbon是一个负载均衡客户端,可以很好地控制http和tcp的一些行为。feign默认集成了ribbon
。
什么是 Netflix Feign?它的优点是什么?
Feign 是Netflix 公司开发的一个声明式的 REST 调用客户端。
特点:
- Feign 采用的是基于接口的注解
- Feign 整合了ribbon,具有负载均衡的能力,Feign在Ribbon+RestTemplate的基础上做了进一步封装,在Feign封装之后,我们只需创建一个接口并使用注解的方式来配置,即可完成对服务提供方的接口绑定,简化了使用Ribbon + RestTemplate的调用,自动封装服务调用客户端,减少代码开发量;
- 整合了Hystrix,具有熔断的能力
使用方式
- 添加pom依赖。
- 启动类添加
@EnableFeignClients
- 定义一个接口
@FeignClient(name=“xxx”)
指定调用哪个服务
Ribbon和Feign的区别?
- 都是调用其他服务,但方式不同。
- 启动类注解不同,Ribbon是@RibbonClient ,feign的是@EnableFeignClients
- 服务指定的位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
- 调用方式不同,Ribbon需要自己构建模拟http请求
Spring Cloud如何实现服务的注册?
创建Eureka Server
- 创建一个Maven工程eureka.server,pom文件引入spring clund、eureka、eureka server、config等依赖
- 用Spring Boot创建一个服务类EurekaServerApplication,需要一个注解@EnableEurekaServer加在springboot工程的启动类上
- eureka server的配置文件appication.yml,其中registerWithEureka:false和fetchRegistry:false表明自己是一个eureka server
- 启动eureka server,然后访问8761端口, “No instances available” 表示无client注册
创建Eureka Client
- 创建一个Maven工Eureka.client ,pom文件引入spring clund、eureka、config等依赖
- 创建主类EurekaClientApplication,使用@EnableEurekaClient注解表明是client
- eureka client的配置文件appication配置server: port: 8762
- Client启动后,第二次访问服务器端口, 可以看到Service已经自动注册到之前的server中
Spring Cloud Config
Spring Cloud Config是最早的配置中心 。主要解决两个问题:
- 集中式管理。在开发中多个微服务可能使用相同的配置,假设有50个微服务,如果配置需要修改配置文件,就意味着我们需要修改50个微服务的yml文件。使用配置中心后,就可以做到一处修改,处处修改。
- 动态修改配置。使用配置中心,配合actuator可以实现配置的动态修改,无需重启服务
Spring Cloud Bus
Spring Cloud Bus 将分布式系统的节点与轻量级消息代理链接。这可以用于广播状态更改(例如配置更改)或其他管理指令。一个关键的想法是,Bus 就像一个扩展的 Spring Boot 应用程序的分布式执行器,但也可以用作应用程序之间的通信渠道。
借助Spring Cloud Bus的广播功能,让client端都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus就把此事件广播到其他订阅端,以此来达到批量更新。
SpringCloud Gateway
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
SpringCloud Gateway 特征
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
- 集成 Hystrix 断路器
- 集成 Spring Cloud DiscoveryClient
- Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
- 具备一些网关的高级功能:动态路由、限流、路径重写
SpringCloud Alibaba介绍
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
spring clund Alibaba主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则。
服务注册与发现:适配Spring Cloud服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于Spring Cloud Stream为微服务应用构建消息驱动能力。
分布式事务:使用@GlobalTransactional注解, 高效并且对业务零侵入地解决分布式事务问题。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。
阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
spring clund alibaba主要组件
- Sentinel :把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
- Nacos :一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- RocketMQ :一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠 的消息发布与订阅服务。
- Dubbo : Apache Dubbo是一款高性能 Java RPC 框架。
- Seata :阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
- Alibaba Cloud ACM :一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
- Alibaba Cloud OSS : 阿里云对象存储服务( Object Storage Service ,简称 OSS ),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和 访问任意类型的数据。
- Alibaba Cloud SchedulerX : 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精 准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
- Alibaba Cloud SMS : 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速 搭建客户触达通道。
有了clund为什么还要alibaba
最重要的原因在于spring cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,在使用过程中也存在着细小的问题;由此他的替代产品,也就是spring cloud alibaba。
项目 | Spring Clund | Spring clund alibaba |
---|---|---|
服务注册中心 | Eureka | Zookeeper、Consul、Nacos(推荐) |
配置中心 | Config | Nacos |
服务总线 | Bus | Nacos |
负载均衡 | Ribbon | LoadBalancer |
服务调用 | Feign | OpenFeign、Dubbo |
服务网关 | Zuul | gateway |
服务降级 | Hystrix | Sentinel |
SpringClound常用注解
@InitBinder 一般用于controller ,防止xss攻击,比如可以将字符串类型的日期转换成date类型
@EnableCaching 注解自动化配置合适的缓存管理器。
@EnableWebSecurity 注解开启spring security的功能,集成websercrityconfigureadapter。
@EnableDiscoveryclient 注册应用为Eureka客户端应用,以获得服务发现的能力
@EnableEurekaClient配置本应用将使用服务注册和服务发现。
@EnableEurekaServer 启动一个服务注册中心
@EnableHystrix表示启动断路器,断路器依赖于服务注册和发现。
@HystrixCommand注解方法失败后,系统将切换到fallbackMethod方法执行。指定回调方法
@FeignClient注解中的fallbank属性指定回调类
@RestController 返回json字符串的数据,直接可以编写RESTFul的接口;
@FeignClient springboot调用外部接口:声明接口之后,在代码中通过@Resource注入之后即可使用。@FeignClient标签的常用属性如下:name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为