Bootstrap

SpringCloud面经

说说SpringBoot和SpringCloud的区别?
1、SpringCloud就是一个框架的整合集;
2、SpringCloud中最强的是SpringCloudAlibaba和Netflix(奈飞);
3、SpringBoot是用来快速开发Spring项目的;
4、SpringBoot和SpringCloud的关系是:由SpirngCloud将各类不同的框架整合,再由SpringBoot进行简化开发。

SpringCloud和Dubbo对比
1、SpringCloud与Dubbo都是实现微服务有效的工具;
2、Dubbo只是实现了服务治理,而SpringCloud子项目分别覆盖了微服务架构下的众多部件;
3、Dubbo使用RPC通讯协议(传输层,基于TPC协议),SpirngCloud使用RESTful完成通信(应用层,基于HTTP协议),Dubbo效率略高于SpringCloud。
注:
RPC是TCP层(传输层)协议,底于底层协议效率更高,但功能不够丰富;
RESTful是HTTP协议(应用层),功能丰富,操作更简单,但效率相对较低。

SpringCloud的核心组件有哪些?
1、服务发现—Netflix Eureka
2、客服端负载均衡—Netflix Ribbon
3、断路器—Netflix Hystrix
4、服务网关—Spring Cloud Gateway
5、分布式配置—Spring Cloud Config

说一说Eureka?
Eureka是Netfilix公司公源的一个服务注册与发现的组件。
Eureka和其他Netfilix公司的服务组件(例如负载均衡、熔断器、网关等)一起被SpringCloud社区整合为Spring-Cloud-Netflix模块。
Eureka包含两个组件:EurekaServer(注册中心)和EurekaClient(服务提供者、服务消费者)。
不过Eureka目前已经停止更新了,现在一般用的是Nacos。

什么是Eureka的自我保护机制?
如果一个Eureka服务器上面注册了多个微服务,其中一个微服务器已经死机,按理说,我们Eureka服务器会把这个微服务给剔除,但是Eureka一旦开启自我保护机制(默认开启),这种死掉的机器也不会被剔除。
自我保护机制是防止微服务假死或者网络波动而导致暂时的死亡,宁可保留也不选择剔除。

说一说Ribbon?
Ribbon是Netflix提供的一个基于HTTP和TCP的客户端负载均衡工具。(如果导入了Eureka的jar包,就不需要再导Ribbon的jar包)
Ribbo两大主要功能:
1、简化远程调用——通过服务名称,找到服务,自动进行URL自动拼接
2、负载均衡——创建代理对象

Ribbon的负载均衡策略有哪些?
Ribbon负载均衡策略(七种):
1、随机:RandomRule
2、轮询:RoundRobinRule 【默认】
3、最小并发(访问最闲的,由Eureka判断):BestAvaliableRule
4、过滤(过滤掉并发太高,或者坏掉的):AvailabilityFilteringRule
5、响应时间(发一个包,判断响应快慢):WeightedResponseTimeRule
6、轮询重试(再加一轮轮询):RetryRule
7、性能可用性(综合判断性能):ZoneAvoidanceRule

说一说Feign?
Feign是一个声明式的REST客户端,它用了“基于接口”的注解方式,很方便实现客户端配置。
Feign是对Ribbon的封装,所以也可以作负载均衡。本质作用还是实现两个服务之间的远程调用。
使用Feign进行远程调用,不需要再去写URL。
Feign的底层就是http协议。

说说Feign和Dubbo的区别是什么?
相同点:都依赖注册中心、负载均衡。
不同点:
Dubbo:
支持多传输协议(Dubbo、Rmi、http、redis等等),可以根据业务场景选择最佳的方式。非常灵活。
默认的Dubbo协议:利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景。
Feign:
基于Http传输协议,短连接,不适合高并发的访问。

Hystrix有什么作用?
Hystrix主要用于出现级联失败(也就是雪崩),也就是防止一个失败而导致的一连串的失败(区分“缓存雪崩”,两者不同)。
Hystrix在微服务的外面进行保护,主要功能有:
隔离
线程池隔离(操作线程):总线程池针对不同的服务,各自分配一定数量的线程数,从而防止一个服务失败,占用所有线程。
信号量隔离(操作变量):设置不同服务的线程阈(yu)值,达到阈值则不再给该服务分配线程,理由如上。
降级:服务失败后,失败的服务方执行降级方案,并回一个失败信息。调用方收到信息后,设置对失败服务调用的降级方案。(两头都会进行设置,降级方案见下)
熔断:如果服务一直失败,调用方会进行熔断,拒绝所有调用失败服务的请求;如果失败的服务恢复了,调用方又会自动重新连接上服务。
限流:限制请求访问频率,每次固定数量。

说说Hystrix的降级机制?
作用:当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作。
方式:
——快速失败:
表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
——安全失败:
表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

使用Hystrix的降级机制时,如果出现超时或异常,Hystrix一定会降级吗?
不一定。Hystrix在外部接收所有请求,Feign只是内部微服务调用。
如果是在与浏览器之间的请求发生异常或超时,就会直接被Hystrix降级,显示的是Hystrix的降级消息;
如果是对外连接成功,在内部进行微服务的调用时,发生异常或超时,会被Feign(底层Ribbo)降级,显示的是Feign的降级消息。

说说Hystrix的熔断机制?
Hystrix熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会自动打开断路器,拒绝所有请求(不论是否降级);断路器开启时间达到默认时间5秒时,断路器会变为半开状态,当调用成功次数达到阈值,说明服务恢复正常,断路器会自动关闭,否则仍会打开断路器。

说说Gateway网关?
网关本质上就是一个服务器,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,如:认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等。
解决以下问题:
客户端多次请求不同的微服务,增加客户端的复杂性
认证复杂,每个服务都要进行认证
http请求不同服务次数增加,性能不高:每个请求都要三次握手,四次挥手。

Gateway有哪些重点路由配置?
路由(routes)最重要的三个配置就是:id、uri、predicates (/'predɪkət/)
Id:唯一标识。默认是一个UUID;
Uri:转发路径
Predicates:条件,用于请求网关的匹配规则(比如:Path=/goods/**)

Gateway有几种过滤器?
两种:
局部过滤器:针对单个路由;
全局过滤器:针对所有路由。

Cloud Alibaba
Cloud ALibaba跟SpringCloud在使用上有什么区别?
伴随着在2018-12-12号Netflix 宣布停止开发Spring Cloud的相关服务:Ribbon、Feign、Eureka、Hystrix。因此阿里对外开源了一套用于管理springboot的微服务云框架Spring Cloud Alibaba。其采用阿里中间件作为基础,实现了 Spring Cloud 的微服务规范。
内部也有很多的组件,如通过Nacos替换Eureka,通过Nacos替换Spring Cloud Config,通过Sentinel替换Hystrix。将Dubbo 将会作为 Spring Cloud Alibaba 的 RPC 组件,并与 Spring Cloud 原生的 Feign 以及 RestTemplate 进行无缝整合。
但是由于Spring Cloud Alibaba还没有纳入到Spring Cloud的主版本管理中,所以在使用的时候,还需要额外去引入它的依赖信息。

SpringCloudAlibaba包括哪些常用组件?
Sentinel(使用):把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Nacos(使用):一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:Apache Dubbo™(使用) 是一款高性能 Java RPC 框架。
Seata(使用):阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
Alibaba Cloud OSS(使用): 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX(收费,用XXL-Job替换): 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS(使用): 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

为什么使用Nacos而不使用Eureka?
1、Eureka在2018年就停止更新了;
2、Nacos=Spring cloud注册中心+Spring CLoud配置中心,使用Nacos,就不用再使用Config了。

Nacos配置文件动态刷新怎么做的?
在需要动态获取配置信息的类上添加@RefreshScope 进行自动刷新。

为什么@RefreshScope可以实时更新远程配置?
这个类中的属性对nacos配置进行监听,一旦nacos重新发布新的属性值则自动创建一个新的AppConfig对象替换旧对象实现自动更新。

Nacos服务注册发现步骤是什么?

(1) 服务提供者将注册信息写入到Nacos注册中心的服务注册表中。(写)
(2) 服务注册中心将服务提供者的实例交给Service Holder(服务持有容器)处理,服务实例将会挂载在Service Holder的空间下。(放)
(3) 服务注册成功后,提供者将与服务中心维持心跳,未能及时发送心跳的服务将会被剔除。(连)
(4) 服务发现支持两种场景。(收)
1、消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。
2、【使用】服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。

Seata的使用流程是怎么样子的?
使用四步:
1、加依赖
2、改配置
2、注意datasource数据源只能替换用druid
3、加注解,启动Seata服务器

Seata的结构有了解吗?
Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager ™: 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager (RM): 控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

Seata的实现原理有了解吗?
Seata将一个本地事务做为一个分布式事务分支,所以若干个分布在不同微服务中的本地事务共同组成了一个全局事务,结构如下。

TM先向TC申请开启一个全局事务,TM同意后会给分布式事务开启全局唯一事务ID,每个成员事务会找TC注册自己的事务分支,TC会将唯一ID给每一个分支事务,所有分支收到ID后,TM会向TC发起全局提交或全局回滚的决议,TC就会向所有RM发送最终提交还是回滚的指令(undo log实现),所有RM接受指令执行。

;