Spring Cloud相关面试题

什么是Spring Cloud

一个基于Spring Boot的一系列开源框架的集合,利用Spring Boot的开发便利性简化了分布式系统基础设施的开发,提供了在分布式系统中集成各种服务治理功能的工具

Spring Cloud的优缺点

优点

  • 耦合度比较低。不会影响其他模块的开发
  • 减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发
  • 配置比较简单,基本用注解就能实现,不用使用过多的配置文件
  • 微服务跨平台的,可以用任何一种语言开发
  • 每个微服务可以有自己的独立的数据库也有用公共的数据库
  • 直接写后端的代码,不用关注前端怎么开发,直接写自己的后端代码即可,然后暴露接口,通过组件进行 服务通信。

缺点

  • 部署麻烦
  • 数据的管理比麻烦,因为微服务可以每个微服务使用一个数据库
  • 系统集成测试比较麻烦
  • 性能的监控比较麻烦

Spring Cloud由什么框架组成

  • Spring Cloud Eureka:服务注册与发现
  • Spring Cloud Zuul:服务网关
  • Spring Cloud Ribbon:客户端负载均衡
  • Spring Cloud Feign:声明性的Web服务客户端
  • Spring Cloud Hystrix:断路器
  • Spring Cloud Config:分布式统一配置管理等20几个框架,开源一直在更新
  • Spring Cloud Bus:消息总线

Eureka:服务注册与发现

服务注册中心,系统中其他服务使用Eureka的客户端将其连接到Eureka Service中
通过EurekaService来监控各个微服务是否运行正常
通过注解@EnableEurekaClient启用

Eureka的自我保护模式

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


Zuul:服务网关

什么是网关,网关的作用

网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。
它能统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等

Zuul的作用

Zuul是对SpringCloud提供的成熟网关路由方案,根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,对外隐蔽了微服务的真正接口地址

  • 动态路由表:Zuul支持Eureka路由,手动配置路由,这俩种都支持自动更新
  • 路由定位:根据请求路径,Zuul有自己的一套定位服务规则以及路由表达式匹配
  • 反向代理:客户端请求到路由网关,网关受理之后,在对目标发送请求,拿到响应之后在 给客户端

应用场景:对外暴露,权限校验,服务聚合,日志审计等

ZuulFilter常用方法

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

Zuul网关如何搭建集群

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


Ribbon:客户端负载均衡

负载均衡的意义(好处)

  • 负载平衡可以改善跨计算资源的工作负载分布
  • 优化资源使用,最大化吞吐量,最小化响应时间,避免任何单一资源的过载
  • 使用多个组件进行负载平衡而不是单个组件可能会通过冗余来提高可靠性和可用性

Nginx和Ribbon的区别

  • Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发
  • Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作

Ribbon实现原理

Ribbon使用discoveryClient从注册中心读取目标服务信息
对同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回获取到的目标服务信息。
使用@LoadBalanced注解开启客户端负载均衡。


Feign:声明性的Web服务客户端

什么是Feign

一个声明web服务客户端,将我们需要调用的服务方法定义成抽象方法保存在本地,不需要自己构建Http请求了,直接调用接口


Hystrix:断路器

什么是断路器

断路器本身是一种开关装置,当电路过载时,能够及时切断故障电源防止发生严重后果
在Spring Cloud分布式系统中,当一个服务调用另一个服务由于网络原因或自身原因出现问题,调用者就会等待被调用者的响应,当更多的服务请求到这些资源导致更多的请求等待,为了防止发生雪崩效应,从而需要Hystrix这种断路器

Hystrix的四种防雪崩方式

  • 服务降级:接口调用失败就调用本地的方法返回一个空
  • 服务熔断:一个统计时间范围内的请求失败数量达到设定值,或当前的请求错误率达到设定的错误率阈值,接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息,在设定时间后尝试恢复
  • 服务隔离:为隔离的服务开启一个独立的线程池,隔离服务之间相互不影响
  • 服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来