• 中文
    • English
  • 注册
  • 查看作者
  • 这20道微服务面试题,阿里、字节、美团、百度面试都问了

    文章目录

    1、什么是微服务?

    2、微服务之间是如何通讯的?

    3、springcloud 与dubbo有哪些区别?

    4、请谈谈对SpringBoot 和SpringCloud的理解

    5、分布式系统面临的问题

    6、什么是服务熔断,什么是服务降级

    7、微服务的优缺点分别是什么?说下你在项目开发中碰到的坑?

    8、你所知道的微服务技术栈有哪些?请列举一二

    9、什么是 Eureka服务注册与发现

    10、Eureka的基本架构是什么?

    11、作为服务注册中心,Eureka比Zookeeper好在哪里?

    12、什么是 Ribbon负载均衡

    13、Ribbon负载均衡能干嘛?

    14、什么是 Feign 负载均衡

    15、Feign 能干什么

    16、什么是 Hystrix断路器

    17、Hystrix断路器能干嘛?

    18、什么是 zuul路由网关

    19、什么是SpringCloud Config分布式配置中心

    20、分布式配置中心能干嘛?

    这20道微服务面试题,阿里、字节、美团、百度面试都问了

    答案解析

    1、什么是微服务?

    微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。 服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。

    从技术维度来说:

    微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。

    2、微服务之间是如何通讯的?

    ① 远程过程调用(Remote Procedure Invocation)

    直接通过远程过程调用来访问别的service。

    示例:REST、gRPC、Apache、Thrift

    优点:

    简单,常见。因为没有中间件代理,系统更简单

    缺点:

    只支持请求/响应的模式,不支持别的,比如通知、请求/异步响应、发布/订阅、发布/异步响应

    降低了可用性,因为客户端和服务端在请求过程中必须都是可用的

    ② 消息

    使用异步消息来做服务间通信。服务间通过消息管道来交换消息,从而通信。

    示例:Apache Kafka、RabbitMQ

    优点:

    把客户端和服务端解耦,更松耦合 提高可用性,因为消息中间件缓存了消息,直到消费者可以消费

    支持很多通信机制比如通知、请求/异步响应、发布/订阅、发布/异步响应

    缺点:

    消息中间件有额外的复杂性

    3、springcloud 与dubbo有哪些区别?

    相同点:

    SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理。

    不同点:

    SpringCloud是一套目前比较网站微服务框架了,整合了分布式常用解决方案遇到了问题注册中心Eureka、负载均衡器Ribbon ,客户端调用工具Rest和Feign,分布式配置中心Config,服务保护Hystrix,网关Zuul Gateway ,服务链路Zipkin,消息总线Bus等。

    表 Spring Cloud与Dubbo功能对比

    这20道微服务面试题,阿里、字节、美团、百度面试都问了

    4、请谈谈对SpringBoot 和SpringCloud的理解

    ① SpringBoot专注于快速方便的开发单个个体微服务。

    ② SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,

    为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

    ③ SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖的关系.

    ④ SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

    Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。

    5、分布式系统面临的问题

    复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。

    服务雪崩

    多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.

    对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

    一般情况对于服务依赖的保护主要有以下三种解决方案:

    6、什么是服务熔断,什么是服务降级

    服务熔断

    熔断机制是应对雪崩效应的一种微服务链路保护机制。

    当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。

    Hystrix服务降级

    其实就是线程池中单个线程障处理,防止单个线程请求时间太长,导致资源长期被占有而得不到释放,从而导致线程池被快速占用完,导致服务崩溃。

    Hystrix能解决如下问题:

    7、微服务的优缺点分别是什么?说下你在项目开发中碰到的坑?

    优点

    缺点

    8、你所知道的微服务技术栈有哪些?请列举一二

    • 服务开发

    • Springboot、Spring、SpringMVC

    • 服务配置与管理

    • Netflix公司的Archaius、阿里的Diamond等

    • 服务注册与发现

    • Eureka、Consul、Zookeeper等

    • 服务调用

    • Rest、RPC、gRPC

    • 服务熔断器

    • Hystrix、Envoy等

    • 负载均衡

    • Ribbon、Nginx等

    • 服务接口调用(客户端调用服务的简化工具)

    • Feign等

    • 消息队列

    • Kafka、RabbitMQ、ActiveMQ等

    • 服务配置中心管理

    • SpringCloudConfig、Chef等

    • 服务路由(API网关)

    • Zuul等

    • 服务监控

    • Zabbix、Nagios、Metrics、Spectator等

    • 全链路追踪

    • Zipkin,Brave、Dapper等

    • 服务部署

    • Docker、OpenStack、Kubernetes等

    • 数据流操作开发包

    • SpringCloud Stream(封装与Redis,Rabbit、Kafka等发送接收消息)

    • 事件消息总线

    • Spring Cloud Bus

    9、什么是 Eureka服务注册与发现

    Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper。

    10、Eureka的基本架构是什么?

    Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。

    Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

    而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

    Eureka包含两个组件: Eureka Server 和 Eureka Client

    Eureka Server提供服务注册服务

    各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

    EurekaClient是一个Java客户端

    用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

    11、作为服务注册中心,Eureka比Zookeeper好在哪里?

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性P在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。

    因此,Zookeeper 保证的是CP, Eureka 则是AP。

    Zookeeper保证CP

    Eureka保证AP

    除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

    1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务

    2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)

    3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中

    因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

    12、什么是 Ribbon负载均衡

    Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。

    简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

    13、Ribbon负载均衡能干嘛?

    LB(负载均衡)

    集中式LB

    进程内LB

    注意: Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

    14、什么是 Feign 负载均衡

    Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。 Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

    Feign是一个声明式的Web服务客户端,使得编写Web服务客户端变得非常容易,只需要创建一个接口,然后在上面添加注解即可。

    15、Feign 能干什么

    Feign旨在使编写Java Http客户端变得更容易。

    前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

    Feign集成了Ribbon

    利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

    Feign通过接口的方法调用Rest服务(之前是Ribbon+RestTemplate),该请求发送给Eureka服务器( 链接,

    通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

    16、什么是 Hystrix断路器

    Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等, Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

    “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

    17、Hystrix断路器能干嘛?

    ① 服务降级

    整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来

    ② 服务熔断

    熔断机制是应对雪崩效应的一种微服务链路保护机制。

    当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。

    ③ 服务限流

    ④ 接近实时的监控

    除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix

    Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring

    Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。

    18、什么是 zuul路由网关

    Zuul 包含了对请求的路由和过滤两个最主要的功能:

    其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础.Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

    注意: Zuul服务最终还是会注册进Eureka

    提供=代理+路由+过滤 三大功能

    19、什么是SpringCloud Config分布式配置中心

    SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。

    20、分布式配置中心能干嘛?

    ① 集中管理配置文件,不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release

    ② 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息

    ③ 当配置发生变动时,服务不需要重启==即可感知到配置的变化并应用新的配置将配置信息以REST接口的形式暴露

    结语:

    最后,我把我面试前几个月准备复习攻克的所有面试题已整理成文档,需要获取的小伙伴可以+ VX: mxk6072

    大致内容包括了: 各类大小厂面经真题、Java 八股文集合、JVM、多线程、并发编程、设计模式、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、spring面试题、spring cloud面试题、spring boot面试题、spring教程 ?

    感谢大家的阅读,希望对大家有帮助,早日拿到大厂offer 。

    这20道微服务面试题,阿里、字节、美团、百度面试都问了

  • 0
  • 0
  • 0
  • 15
  • 请登录之后再进行评论

    登录
  • 任务
  • 实时动态
  • 发布
  • 单栏布局 侧栏位置: