SpringCloud面试题

内容分类详情
Java高频面试题汇总入口
JVMJVM面试题
并发并发面试题
SpringSpring面试题
分布式分布式面试题
SpringBootSpringBoot面试题
SpringCloudSpringCloud面试题
DubboDubbo面试题
MySQLMySQL面试题
MybatisMybatis面试题
RedisRedis面试题
RocketMQRocketMQ面试题
算法算法面试题
遇到的问题遇到的问题
面试官的其他问题面试官的其他问题
GitGit面试题

SpringBoot和SpringCloud的区别

  • SpringBoot专注于快速方便的开发单个个体微服务。
  • SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
  • 为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
  • SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系
  • SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

常用的SpringCloud由什么组成

  • Spring Cloud Eureka:服务注册与发现
  • Spring Cloud Zuul:服务网关
  • Spring Cloud Ribbon:客户端负载均衡
  • Spring Cloud Feign:声明性的Web服务客户端
  • Spring Cloud Hystrix:断路器
  • Spring Cloud Confifig:分布式统一配置管理

使用Spring Boot开发分布式微服务时会面临什么问题

  • 接口调用服务依赖复杂性提高
  • 服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该目录中注册服务,然后能够查找并连接到该目录中的服务。
  • 负载平衡复杂度提高-负载平衡改善跨多个计算资源的工作负荷,诸如计算机,计算机集群,网络链路,中央处理单元,或磁盘驱动器的分布。
  • 性能-问题由于各种运营开销导致的性能问题。
  • 部署服务的复杂性

Spring Cloud 和dubbo区别

  • 服务调用方式:dubbo是RPC springcloud Rest Api

  • 注册中心:dubbo 是zookeeper, nacos springcloud是eureka,也可以是zookeeper

  • 服务网关:dubbo本身没有实现,只能通过其他第三方技术整合,springcloud有Zuul路由网关,作为路由服务器,进行消费者的请求分发,springcloud支持断路器,与git完美集成配置文件支持版本控制,事物总线实现配置文件的更新与服务自动装配等等一系列的微服务架构要素。

Eureka的自我保护模式

默认情况下,如果 Eureka Service 在一定时间内没有接收到某个微服务的心跳, Eureka Service 会进入自我保护模式,在该模式下Eureka Service 会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式。

DiscoveryClient的作用

可以从注册中心中根据服务别名获取注册的服务器信息。

Eureka和ZooKeeper都可以提供服务注册与发现的功能,两个的区别

  • ZooKeeper中的节点服务挂了就要选举 在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的, 选举就是微服务做了集群,必须有一台主其他的都是从节点。
  • Eureka各个节点是平等关系,服务器挂了没关系,只要有一台Eureka就可以保证服务可用,数据都是最新的。 如果查询到的数据并不是最新的,就是因为Eureka的自我保护模式导致的。
  • Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像ZooKeeper 一样使得整个注册系统瘫痪

什么是网关

网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。

网关的作用

统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等

  • 它可以和Eureka,Ribbon,Hystrix等组件配合使用,
  • Zuul的应用场景: 对外暴露服务,权限校验,服务聚合(一个请求过来分发到多个服务,数据聚合到zull后再响应结果),日志审计等

网关与过滤器有什么区别

网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。

常用网关框架有那些

Nginx 、 Zuul 、 Gateway

Zuul与Nginx有什么区别

Zuul 是 java 语言实现的,主要为 java 服务提供网关服务,尤其在微服务架构中可以更加灵活的对网关进行操作。Nginx 是使用 C 语言实现,性能高于 Zuul ,但是实现自定义操作需要熟悉 lua 语言,对程序员要求较高,可以使用Nginx 做 Zuul 集群。

Zuul和Gateway的区别

  • 内部实现:gateway对比zuul多依赖了spring-webflux,在spring的支持下,功能更强大,内部实现了限流、负载均衡等,扩展性也更强,但同时也限制了仅适合于Spring Cloud套件zuul则可以扩展至其他微服务框架中,其内部没有实现限流、负载均衡等。

  • 是否支持异步:zuul仅支持同步,gateway支持异步。理论上gateway则更适合于提高系统吞吐量(但不一定能有更好的性能),最终性能还需要通过严密的压测来决定。

  • 框架设计的角度:gateway具有更好的扩展性,并且其已经发布了2.0.0的RELESE版本,稳定性也是非常好的。

  • 性能:WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的 开发 体验。Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划。

总的来说,在微服务架构,如果使用了Spring Cloud生态的基础组件,则Spring Cloud Gateway相比而言更加具备优势,单从流式编程+支持异步上就足以让开发者选择它了。
 对于小型微服务架构或是复杂架构(不仅包括微服务应用还有其他非Spring Cloud服务节点),zuul也是一个不错的选择。

如何设计一套API接口

考虑到 API 接口的分类可以将 API 接口分为开发 API 接口和内网 API 接口,内网 API 接口用于局域网,为内部服务器提供服务。开放API 接口用于对外部合作单位提供接口调用,需要遵循 Oauth2.0 权限认证协议。同时还需要考虑安全性、幂等性等问题。

ZuulFilter常用有那些方法

  • Run():过滤器的具体业务逻辑
  • shouldFilter():判断过滤器是否有效
  • fifilterOrder():过滤器执行顺序
  • fifilterType():过滤器拦截位置

Zuul网关如何搭建集群

使用 Nginx 的 upstream 设置 Zuul 服务集群,通过 location 拦截请求并转发到 upstream ,默认使用轮询机制对Zuul 集群发送请求。

为什么要实现本地负载均衡

避免单一应用由于并发等原因,导致应用宕机从而导致系统整体无法使用,多负载同时工作,可以很好的解决高并发的问题,实现服务的高可用。

Ribbon底层实现原理

Ribbon 使用 discoveryClient 从注册中心读取目标服务信息,对同一接口请求进行计数,使用 % 取余算法获取目标服务集群索引,返回获取到的目标服务信息。

LoadBalanced注解的作用

开启客户端负载均衡。

雪崩效应

雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕
机,大型项目的微服务之间的调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务
中。存在雪崩的可能因素:

1.单个服务的代码存在bug.

2.请求访问量激增导致服务发生崩溃(如大型商城的枪红包,秒杀功能).

因为 Tomcat 默认情况下只有一个线程池来维护客户端发送的所有的请求,这时候某一接口在某一时刻被大量访问就会占据tomcat 线程池中的所有线程,其他请求处于等待状态,无法连接到服务接口。

3.服务器的硬件故障也会导致部分服务不可用.

Hystrix防止雪崩的方式

  • 服务降级:接口调用失败就调用本地的方法返回一个空
  • 服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息
  • 服务隔离:隔离服务之间相互影响
  • 服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。
    启用健康监控:Hystrix-Dashboard
    启动类添加@EnableHystrixDashboard注解

谈谈服务降级、熔断、服务隔离

  • 服务降级:当客户端请求服务器端的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返
    回一个友好的提示给客户端。
    触发原因:
    程序运行异常,超时,服务熔断触发服务降级,线程池/信号量打满。
    通常为了避免项目整体压力,控制某个服务的处理请求的数量。

  • 服务熔断:是在服务降级的基础上更直接的一种保护方式,当在一个统计时间范围内的请求失败数量
    达到设定值(requestVolume Threshold)或当前的请求错误率达到设定的错误率阈值
    (errorThresholdPercentage)时开启断路,之后的请求直接走fallback方法,在设定时间
    (sleepWindowlnMilliseconds)后尝试恢复。缺省是5秒内20次调用失败,就会启动熔断机制。
    服务熔断一般是某个服务(下游服务)故障引起,由本服务进行熔断处理,调用fallback方法,响应请求,避免服务出现联动异常。

  • 服务隔离:是Hystrix为隔离的服务开启一个独立的线程池, 这样在高并发的情况下不会影响其他
    服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池方式。

服务降级底层是如何实现的

Hystrix实现服务降级的功能是通过重写HystrixCommand中的getFallback()方法,当Hystrix的run方法或construct执行发生错误时转而执行getFallback()方法。

Feign的理解

  • Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易
  • 他将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,不需要自己构建Http请求了,直接调用接口就行了。

SpringCloud有几种调用接口方式

  • Feign
  • RestTemplate

SpringCloud核心组件

  • Eureka: 服务治理组件,包括服务端的注册中心和客户端的服务发现机制;
  • Ribbon: 负载均衡的服务调用组件,具有多种负载均衡调用策略;
  • Hystrix: 服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
  • Feign: 基于Ribbon和Hystrix的声明式服务调用组件;
  • Zuul: API网关组件,对请求提供路由及过滤功能。

Spring Cloud Bus的理解

在这里插入图片描述

Bus的事件推送由三个角色构成:

  • 事件对象:Bus中定义的一个事件类,通常是一个Pojo对象,包含了消费者需要的信息
  • 事件发布:Bus作为生产者,将事件对象通过广播的形式发布出去
  • 事件监听:由消费者主动监听Bus的事件发布动作,当获取到事件对象后会调用处理方法进行消费

Eureka工作流程

1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务

3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常

4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例

5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端

6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式

7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地

8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存

9、Eureka Client 获取到目标服务器信息,发起服务调用

10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

使用场景

  • 清空缓存:通知所有服务监听者清空某项业务的本地缓存信息,我们也可以在自定义的消息体中加业务属性,事件监听逻辑可以根据这些属性来定点清除某个特定业务对象的缓存
  • 数据同步:子系统依赖实时的数据库记录变动触发相应的业务逻辑,我们这里就可以将数据库的binlog抓取出来,通过广播功能同步到所有监听器,起到数据同步的作用
  • 动态刷新集群中的服务配置信息。

SpringCloud分层架构

在这里插入图片描述

Eureka工作流程

1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server 都存在独立完整的服务注册表信息

2、Eureka Client 启动时根据配置的 Eureka Server 地址去注册中心注册服务

3、Eureka Client 会每 30s 向 Eureka Server 发送一次心跳请求,证明客户端服务正常

4、当 Eureka Server 90s 内没有收到 Eureka Client 的心跳,注册中心则认为该节点失效,会注销该实例

5、单位时间内 Eureka Server 统计到有大量的 Eureka Client 没有上送心跳,则认为可能为网络异常,进入自我保护机制,不再剔除没有上送心跳的客户端

6、当 Eureka Client 心跳请求恢复正常之后,Eureka Server 自动退出自我保护模式

7、Eureka Client 定时全量或者增量从注册中心获取服务注册表,并且将获取到的信息缓存到本地

8、服务调用时,Eureka Client 会先从本地缓存找寻调取的服务。如果获取不到,先从注册中心刷新注册表,再同步到本地缓存

9、Eureka Client 获取到目标服务器信息,发起服务调用

10、Eureka Client 程序关闭时向 Eureka Server 发送取消请求,Eureka Server 将实例从注册表中删除

遇到的问题

值得注意的是,在使用HystrixCommand对RibbonClient进行包装的时候,你需要确保你配置的Hystrix超时时间要比Ribbon的超时时间长,包括由它们引起的重试时间,举个例子:如果你的Ribbon连接超时时间是1秒,并且Ribbon会连续重试请求3次,那么你的Hystrix连接超时时间需要配置成稍大于3秒。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gzh-程序员灿灿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值