SpringCloud面试题大全总结

SpringCloud全系列组件架构图

SpringCloud全系列组件图:ProcessOn Mindmap

1、什么是微服务架构

微服务架构就是将单体的应用程序分成多个应用程序,这多个应用程序就成为微服务,每个微服务运行在自己的进程中,并使用轻量级的机制通信。这些服务围绕业务能力来划分,并通过自动化部署机制来独立部署。这些服务可以使用不同的编程语言,不同数据库,以保证最低限度的集中式管理。

分布式:将一个大的应用按功能进行拆分成多个小应用,部署在不同的服务器上,称为分布式。 集群:同一个业务,部署在不同的服务器,对外提供相同的功能。称为集群 微服务:将一个大的应用按功能进行拆分成多个小应用,每个小应用就称为微服务(常见的技术例如SpringBoot)

微服务架构简称为,面向服务的架构(SOA)。是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。

微服务架构的优点和缺点

优点:

1、微服务对服务的拆分变更的更细(复用性强)。

2、可根据需求使用新的技术

3、开发速度快(周期少)。适用于互联网项目。

4、进行高并发部署,可按需部署服务,减少因在同一个项目中出现资源浪费等。

缺点:

微服务过多,对服务的治理成本高。

服务的部署难度加大,需要结合Docker等云容器部署。

技术难点在增加(出现了很多分布式的技术,

例如:分布式ID/分布式事务/分布式日志/分布式Session/分布式锁等)


2、Spring Cloud 是什么

SpringCloud是分布式微服务治理解决方案。提供了一系列框架技术的有序集合。

利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

Spring Cloud是集大成者,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

3、SpringCloud的优缺点

优点:

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

6.组件化(模块化)、随时开箱拆箱。

缺点:

项目结构复杂,每一个组件或者每一个服务都需要创建一个项目。

部署门槛高,项目部署需要配合 Docker 等容器技术进行集群部署。

仅支持JAVA语言。

并不是所有的项目都需要SpringCloud。

4、SpringBoot和SpringCloud的区别?

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

SpringCloud是全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务

SpringBoot可以离开SpringCloud独立使用开发项目, SpringCloud基于SpringBoot ,不能脱离SpringBoot。

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

5、SpringCloud有哪些组件?

Spring Cloud Eureka:服务注册与发现

Spring Cloud Ribbon:客户端负载均衡

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

Spring Cloud Hystrix:断路器

Spring Cloud Zuul:服务网关

Spring Cloud Config:分布式统一配置管理其它组件详细地址:

https://www.processon.com/view/link/5ef6e8a96376891e81e8009d

6、为什么使用服务发现?

如果你在写代码调用一个有REST API或Thrift API的服务,你的代码需要知道一个服务实例的网络地址(IP地址和端口)。运行在物理硬件上的传统应用中,服务实例的网络地址是相对静态的,你的代码可以从一个很少更新的配置文件中读取网络地址。 在一个现代的,基于云的微服务应用中, 服务实例的网络地址是动态分配的。而且,由于自动扩展,失败和更新,服务实例的配置也经常变化。此时,需要服务注册与发现的组件来解决动态IP的变化等问题。

7、服务注册与发现需要具备哪些功能?

注册中心应具备以下功能:

服务注册表 服务注册表是注册中心的核心,它用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册与注销。

服务注册与发现 服务注册是指微服务在启动时,将自己的信息注册到注册中心的过程。服务发现是指查询可用的微服务列表及网络地址的机制。

服务检查 注册中心使用一定的机制定时检测已注册的服务,如发现某实例长时间无法访问,就会从服务注册表移除该实例。

8、Eureka组件

什么是Eureka

Eureka是作为SpringCloud的服务注册与发现组件功能服务器,是服务注册中心,系统中的其他服务使用Eureka的客户端将其连接到Eureka Service中,并且保持心跳,这样开发人员可以通过Eureka Service来监控各个微服务是否运行正常。

什么是Eureka的自我保护模式,

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

Renew服务租约

Eureka Client 在默认的情况下会每隔 30 秒发送一次心跳来进行服务续约。通过服务续约 来告知 Eureka Server 该 Eureka Client 仍然可用,没有出现故障。正常情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的心跳, Eureka Server 会将 Eureka Client 实例从注册列表中 删除。

Eviction什么时候会对服务进行剔除

在默认情况下,当 Eureka Client 连续 90 秒没有向 Eureka Server 发送服务续约(即心跳〉 时, Eureka Server 会将该服务实例从服务注册列表删除,即服务剔除。

Eureka怎么实现高可用

注册多台Eureka,SpringCloud服务间互相注册,客户端从Eureka获取信息时,按照Eureka的顺序依次来访问。

9、Ribbon组件

Ribbon是什么?

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的服务间调用和服务的负载均衡。

RibbonEureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等。简单的说,就是在配置文件中列出后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。(有点类似Nginx)

Nginx与Ribbon的区别

Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx服务器进行转发。

Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。(默认是轮循操作)

Ribbon底层实现原理

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

10、Feign组件

什么是Feign?

Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易

Feign可帮助我们更加便捷,优雅的调用HTTP API。 在SpringCloud中,使用Feign非常简单——创建一个接口,并在接口上添加一些注解,代码就完 成了。 Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。SpringCloud对Feign进行了增强,使Feign支持了SpringMVC注解,并整合了Ribbon和Eureka, 从而让Feign的使用更加方便。

Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端Feign。(Feign默认集成了Ribbon,并和Eureka结合)。默认实现了负载均衡的效果。

Ribbon和Feign调用服务的区别

调用方式同:Ribbon需要我们自己构建Http请求,模拟Http请求然后通过RestTemplate发给其他服务,步骤相当繁琐

而Feign则是在Ribbon的基础上进行了一次改进,采用接口的形式,将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,不需要自己构建Http请求了,直接调用接口就行了,不过要注意,调用方法要和本地抽象方法的签名完全一致。

11、Hystrix组件

什么是 Hystrix?

在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,就会导致雪崩,

Hystrix是由Netflix开源的一个针对分布式系统容错处理的开源组件。能够提供断路,降级,监控等多种服务。它具有服务降级,服务熔断,服务隔离,监控等一些防止雪崩的技术。

Hystrix提供了哪些功能?

Hystrix有四种防雪崩方式:

服务降级:接口调用失败就调用本地的方法返回一个空

服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息

服务隔离:隔离服务之间相互影响

服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。

服务雪崩效应产生的原因

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

在微服务中,如何保护服务?

一般使用使用Hystrix框架,实现服务隔离来避免出现服务的雪崩效应,从而达到保护服务的效果。当微服务中,高并发的数据库访问量导致服务线程阻塞,使单个服务宕机,服务的不可用会蔓延到其他服务,引起整体服务灾难性后果,使用服务降级能有效为不同的服务分配资源,一旦服务不可用则返回友好提示,不占用其他服务资源,从而避免单个服务崩溃引发整体服务的不可用.

服务容错的相关知识概念

服务容错的核心知识 雪崩效应

在微服务架构中,一个请求需要调用多个服务是非常常见的。如客户端访问A服务,而A服务需要调用B 服务,B服务需要调用C服务,由于网络原因或者自身的原因,如果B服务或者C服务不能及时响应,A服 务将处于阻塞状态,直到B服务C服务响应。此时若有大量的请求涌入,容器的线程资源会被消耗完毕, 导致服务瘫痪。服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难 性的严重后果,这就是服务故障的“雪崩”效应。(服务熔断服务降级就可以视为解决服务雪崩的手段之一)

服务隔离

顾名思义,它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相对独立,无强依赖。 当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体 的系统服务。

服务熔断

熔断这一概念来源于电子工程中的断路器(Circuit Breaker)

在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断

服务降级

降级,就是当某个服务熔断之后,服务器将不再被调用,此时客户端可以自己准备一个本地的 fallback回调,返回一个缺省值。

Hystrix实现两个核心注解

@HystrixCommand 注解

@FeignClient注解:fallback 如果接口服务不能访问或延迟,则运行对应其接口实现类。

12、网关组件

什么是网关?

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

API网关,顾名思义,是统一管理API的一个网络关口、通道,是整个微服务平台所有请求的唯一入口,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

网关的作用是什么

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


网关与过滤器有什么区别

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

ZuulFilter常用有那些方法

Run():过滤器的具体业务逻辑

shouldFilter():判断过滤器是否有效

filterOrder():过滤器执行顺序

filterType():过滤器拦截位置

Zuul与Nginx有什么区别?

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

Nginx可以实现网关?为什么还需要使用Zuul框架

Zuul是SpringCloud集成的网关,使用Java语言编写,可以对SpringCloud架构提供更灵活的服务。

如何实现动态Zuul网关路由转发

通过path配置拦截请求,通过ServiceId到配置中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。

Zuul网关如何搭建集群

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

13、配置中心组件

分布式配置中心有那些框架?

SpringCloud Config、Apollo、Zookeeper。

什么是Spring Cloud Config?

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持,可以方便的对微服务各个环境下的配置进行集中式管理。Spring Cloud Config分为Config Server和Config Client两部分。Config Server负责读取配置文件,并且暴露Http API接口,Config Client通过调用Config Server的接口来读取配置文件。

Spring Cloud Config

Config能够管理所有微服务的配置文件

集中配置管理工具,分布式系统中统一的外部配置管理,默认使用Git来存储配置,可以支持客户端配置的刷新及加密、解密操作。

分布式配置中心的作用?

动态变更项目配置信息而不必重新部署项目。

SpringCloud Config 可以实现实时刷新吗?

SpringCloud Config实时刷新采用SpringCloud Bus消息总线。

http://assets.processon.com/chart_image/5e46afc1e4b00aefb7e063aa.png

14、Spring Cloud Bus

用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置信息。

简单来说就是修改了配置文件,发送一次请求,所有客户端便会重新读取配置文件。需要利用中间插件MQ

15、Spring Cloud Sleuth组件

在微服务中,通常根据业务模块分服务,项目中前端发起一个请求,后端可能跨几个服务调用才能完成这个请求。如果系统越来越庞大,服务之间的调用与被调用关系就会变得很复杂,假如一个请求中需要跨几个服务调用,其中一个服务由于网络延迟等原因挂掉了,那么这时候我们需要分析具体哪一个服务出问题了就会显得很困难。

Spring Cloud Sleuth服务链路跟踪功能就可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能等等。

16、Spring Cloud Stream组件

轻量级事件驱动微服务框架,可以使用简单的声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。

17、Spring Cloud Task组件

Spring Cloud Task的目标是为Spring Boot应用程序提供创建短运行期微服务的功能。在Spring Cloud Task中,我们可以灵活地动态运行任何任务,按需分配资源并在任务完成后检索结果。Tasks是Spring Cloud Data Flow中的一个基础项目,允许用户将几乎任何Spring Boot应用程序作为一个短期任务执行。

18、Spring Cloud Sidecar组件

在我们的分布式项目中,经常会出现一部分服务是 Java 语言写的,一部分服务是非 Java 语言写的,Java 语言写的服务可以通过我们的 SpringCloud 组件来进行服务发现,网关路由等操作,但是非 Java语言的程序 则无法实现这个功能,为了解决这个问题,Netfilix 提供了 Sidecar 来解决,其基本思想就是 sidecar 是一个 Java 语言的程序,然后内容通过配置访问非 Java语言的程序,然后注册到我们的 SpringCloud组件中,实现我们的功能,本质上其就是一个代理








展开阅读全文

页面更新:2024-05-02

标签:注解   分布式   网关   集群   组件   客户端   接口   语言   功能   大全   系统

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top