参考自:
1 什么是微服务?谈谈你对微服务的理解?
是什么
将工程根据不同的业务规则拆分成微服务,部署在不同的服务器上
特点
一个独立运行的程序
服务之间通过RPC协议相互通信
服务集中化管理
优点
微服务的修改和部署对其他服务没有影响,提升发布的效率以及项目回滚的效率 <br><i style="font-weight: normal;">(拆分前修改一点东西都需要发布所有业务模块的代码,拆分后只需修改对应业务模块的代码)</i><br>
将复杂的业务简单化,减少了新人的学习成本<br>
具有很强的横向拓展能力
通过RPC协议通信,微服务可以采用任何的开发语言和技术来实现
采用的AP架构,具有<b>高可用分区容错</b>特点。<br>高可用主要体现在系统7x24不间断服务,他要求系统有<b>大量的服务器集群</b>,从而提高系统的负载能力。<br>分区容错也使得系统更加健壮<br>
缺点
需要选择合适的通信机制,并解决网络服务差时带来的风险<br>
分布式事务需要解决网络差时带来的风险
划分微服务需要非常了解业务<br>
2 什么是Spring Cloud?
是什么
是一系列框架的集合。利用spring boot开发的便利性简化分布式系统的基础设施的开发,<br>比如:注册中心、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,<br>都可以用Spring Boot的开发风格做到一键启动和部署<br>
优点
耦合度比较低。不会影响其他模块的开发
减轻团队的成本,可以并行开发,不用关注其他人怎么开发,先关注自己的开发
配置比较简单
每个微服务可以有自己的独立的数据库
直接写自己的后端代码即可,然后暴露接口,通过组件进行服务通信。
缺点
部署比较麻烦,给运维工程师带来一定的麻烦
针对数据的管理比麻烦,因为微服务可以每个微服务使用一个数据库
系统集成测试比较麻烦<br>
性能的监控比较麻烦
有哪些组件
Eureka,服务注册中心
Config,分布式配置中心
Zuul,API服务网关,功能有路由分发和过滤
Ribbon,客户端负载均衡
Hystrix,客户端容错保护,特性有服务降级、服务熔断、请求缓存、请求合并、依赖隔离
Feign,声明式服务调用,本质上就是Ribbon+Hystrix
Stream,消息驱动,有Sink、Source、Processor三种通道,特性有订阅发布、消费组、消息分区
Bus,消息总线,配合Config仓库修改的一种Stream实现
Sleuth,分布式服务追踪,需要搞清楚TraceID和SpanID以及抽样,如何与ELK整合
3 具体说说SpringCloud主要项目?
Spring Cloud的子项目主要分为2类
对现有<b>成熟框架"Spring Boot化"</b>的封装和抽象
开发了一部分分布式系统的<b>基础设施的实现</b>,如Spring Cloud Stream扮演的就是kafka, ActiveMQ这样的角色。
Config
集中<b>配置</b>管理工具,<i>可以支持客户端配置的刷新及加密、解密操作</i><br>
Netflix<br>
Zuul<br>
API网关组件,对请求提供<b>路由</b>及<b>过滤</b>功能。
Eureka
<b>服务治理</b>组件,<i>包括服务端的<b>注册中心</b>和客户端的<b>服务发现</b>机制</i><br>
Ribbon<br>
<b>负载均衡</b>的服务调用组件
Hystrix
服务<b>容错</b>组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
Feign
基于Ribbon和Hystrix的声明式<b>服务调用组件</b>
Bus
使用轻量级消息代理链接分布式系统中的节点,可以用来<b>动态刷新集群中的服务配置信息</b>
简单来说就是修改了配置文件,发送一次请求,所有客户端便会重新读取配置文件(需要利用中间插件MQ)。
Consul
用于实现分布式系统的<b>服务发现与配置,<i>(</i></b><i>内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)<b>),</b></i>使用 Go 语言编写,因此具有天然可移植性<br>
Security
提供了一组<b>原语</b>,用于<b>构建安全的应用程序和服务</b>,而且操作简便。<i>(在Spring Boot和Spring Security OAuth2的基础上,可以快速创建实现常见模式的系统,如单点登录,令牌中继和令牌交换。)</i><br>
Sleuth<br>
服务链路跟踪功能,帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能等等<br>
Stream<br>
轻量级<b>事件驱动</b>微服务框架,可以使用简单的声明式模型来发送及接收消息,主要实现为Apache Kafka及RabbitMQ。
Task<br>
为Spring Boot应用程序提供创建短运行期微服务的功能
Zookeeper
SpringCloud支持三种注册方式Eureka, Consul(go语言编写),zookeeper
Spring Cloud Zookeeper是基于Apache Zookeeper的服务治理组件
Gateway
旨在为微服务架构提供简单、有效和统一的<b>API路由管理</b>方式<br>
目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filer链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。
4 Spring Cloud项目部署架构?
5 Spring Cloud 和dubbo区别?
dubbo只是一个服务调用组件,而cloud是一套分布式解决方案,含有一系列框架
6 服务注册和发现是什么意思?Spring Cloud 如何实现<br>
是什么
服务注册和发现是指在分布式系统中,各个服务能够自动地注册自己的信息,并且能够动态地发现其他服务的位置和相关信息。
如何实现
Spring Cloud是一个基于Spring框架的开发工具集合,它提供了一套用于构建分布式系统的解决方案。在Spring Cloud中,服务注册和发现是通过使用Eureka、Consul、Zookeeper等注册中心来实现的。 <br>
具体而言,Spring Cloud通过集成这些注册中心,使得服务可以在启动时将自己的信息注册到注册中心,包括服务名称、IP地址、端口号等。其他服务可以通过查询注册中心获取到需要调用的服务的信息,从而实现服务之间的通信和协作。 <br>
除了服务注册和发现,Spring Cloud还提供了负载均衡、熔断器、配置管理等功能,帮助开发者构建弹性和可靠的分布式系统。
7 什么是Eureka的自我保护模式?
默认情况下,如果Eureka Service在一定时间内<b>没有接收到</b>某个微服务的<b>心跳</b>,Eureka Service会<b>进入自我保护模式</b>,在该模式下Eureka Service会保护服务注册表中的信息,<b>不再删除注册表中的数据</b>,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式
8 Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?
<b>ZooKeeper中的节点</b><b>挂了</b>则整个集群<b>无法提供服务</b>。<i>节点挂了就要选举,在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的</i>
Eureka各个节点是平等关系,服务器挂了没关系,<b>只要有一台Eureka就可以保证服务可用</b>,数据都是最新的。如果查询到的数据并不是最新的,就是因为Eureka的自我保护模式导致的
总结:ZooKeeper保证的是CP,Eureka保证的是AP
9 什么是网关?
网关相当于一个<b>网络</b>服务架构的<b>入口</b>,所有网络请求必须<b>通过网关转发到具体的服务</b>。
10 网关的作用是什么?
统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制<b>黑名单</b>和<b>白名单</b>等
11 什么是Spring Cloud Zuul(服务网关)?
是什么
他会根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,他<b>对外隐蔽了微服务的真正接口地址</b>
三个重要概念
动态路由表:Zuul支持Eureka路由,手动配置路由,这俩种都支持自动更新
路由定位:根据请求路径,Zuul有自己的一套定位服务规则以及路由表达式匹配
反向代理:客户端请求到路由网关,网关受理之后,在对目标发送请求,拿到响应之后在 给客户端
它可以和Eureka,Ribbon,Hystrix等组件配合使用
Zuul的应用场景
对外暴露,权限校验,服务聚合,日志审计等
12 网关与过滤器有什么区别?
网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言
13 常用网关框架有那些?
Nginx、Zuul、Gateway
14 Zuul与Nginx有什么区别?
Zuul是java语言实现的,主要为java服务提供网关服务,尤其在微服务架构中可以更加灵活的对网关进行操作
Nginx是使用C语言实现,性能高于Zuul,但是实现自定义操作需要熟悉lua语言,对程序员要求较高,可以使用Nginx做Zuul集群
15 既然Nginx可以实现网关?为什么还需要使用Zuul框架?
总结:Zuul能与cloud无缝集成,并且提供了很多灵活的功能<br>
Zuul是一个专门为微服务架构设计的网关框架,它与Spring Cloud完美集成,<b>提供了许多</b>与微服务相关的特性和<b>功能</b>。它可以与Eureka、Ribbon、Hystrix等Spring Cloud组件<b>无缝集成</b>,使得服务注册、负载均衡、熔断等功能更加方便和高效。
Zuul<b>提供了更强大的路由和过滤功能</b>。它支持动态路由,可以根据请求的URL路径将请求路由到不同的微服务实例上。同时,Zuul还<b>支持自定义过滤器</b>,可以在请求进入和响应返回的过程中执行一些自定义的逻辑,例如<b>身份验证、请求日志记录</b>等。
Zuul还提供了<b>可视化</b>的路由配置和监控功能,使得开发人员可以更方便地管理和监控网关的路由规则和性能。
16 Nginx与Ribbon的区别?
Nginx是一个高性能的<b>反向代理服务器</b>,可以用作负载均衡器。它可以接收客户端请求,并将请求转发给后端的多个服务器。<br>Nginx还可以提供静态文件的缓存和压缩,以提高性能和吞吐量<br>
Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,<b>全程在客户端</b>操作
17 Ribbon底层实现原理?<br>
<b>服务发现</b>:Ribbon通过与服务注册中心(如Eureka、Consul等)集成,获取可用的服务实例列表。<br>它会定期从注册中心拉取服务实例的信息,并<b>缓存</b>在本地。<br>
<b>负载均衡算法</b>:Ribbon提供了多种负载均衡算法,如轮询、随机、加权轮询、加权随机等。<br>根据配置和服务实例的健康状态,Ribbon会选择合适的负载均衡算法来分配请求。<br>
<b>服务实例选择:</b>当客户端发起请求时,Ribbon会根据负载均衡算法选择一个可用的服务实例。<br>Ribbon会考虑服务实例的可用性、健康状态、响应时间等因素来做出选择。<br>
<b>重试机制</b>:Ribbon支持请求重试机制,当请求失败或超时时,Ribbon可以自动重试其他可用的服务实例,以提高系统的可靠性和容错性。
<b>缓存机制</b>:为了提高性能,Ribbon会缓存服务实例的信息,并定期更新。这样可以避免每次请求都与服务注册中心通信,减少网络开销。
18 @LoadBalanced注解的作用?
开启客户端负载均衡。<br>
19 什么是断路器
是什么
断路器(Circuit Breaker)是一种用于<b>处理</b>分布式系统中<b>故障和延迟的机制</b>。它可以<b>防止故障的扩散</b>,并提供了<b>容错</b>和<b>恢复</b>机制。
主要作用
在服务调用时<b>监控对目标服务的请求</b>,并根据一定的规则来判断目标服务是否正常。<br>当目标服务出现故障或延迟时,断路器可以快速地<b>短路请求</b>,避免等待超时或长时间的阻塞。<br>
应用
Spring Cloud中的断路器主要通过Hystrix来实现。Hystrix可以通过设置超时时间、熔断阈值、线程池大小等参数来控制服务调用的行为。当服务调用失败或超时达到一定阈值时,Hystrix会打开断路器,将请求快速失败,而不是一直等待响应。同时,Hystrix还提供了降级策略,可以在目标服务不可用时返回预设的默认值或执行备选逻辑,以保证系统的可用性。<br>
20 什么是 Hystrix?
是什么
在分布式系统,我们一定会依赖各种服务,那么这些个服务一定会出现失败的情况,就会导致雪崩,Hystrix就是这样的一个工具,防雪崩利器,它具有服务降级,服务熔断,服务隔离,监控等一些<b>防止雪崩的技术</b>。
有四种防雪崩方式
服务降级:接口调用失败就调用本地的方法返回一个空
服务熔断:接口调用失败就会进入调用接口提前定义好的一个熔断的方法,返回错误信息<br>
服务隔离:隔离服务之间相互影响
服务监控:在服务发生调用时,会将每秒请求数、成功请求数等运行指标记录下来。
21 服务降级和服务熔断区别
<b>触发原因</b>不一样,服务熔断由链路上<b>某个服务</b>引起的,服务降级是从<b>整体的负载</b>考虑<br>
<b>管理目标层次</b>不一样,服务熔断是一个<b>框架层次</b>的处理,服务降级是<b>业务层次</b>的处理
实现方式不一样,服务熔断一般是<b>自我</b>熔断恢复,服务降级相当于<b>人工</b>控制
22 Ribbon和Feign调用服务的区别?
Ribbon需要我们自己<b>构建Http请求</b>,模拟Http请求然后通过<b>RestTemplate</b>发给其他服务,步骤相当繁琐
Feign则是在Ribbon的基础上进行了一次改进,<b>采用接口的形式</b>,将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,直接调用接口就行了<br>
23 什么是什么是 Spring Cloud Bus
是什么
是Spring Cloud中的一个组件,用于在分布式系统中实现消息总线功能。
作用
Spring Cloud Bus利用消息代理(如RabbitMQ或Kafka)作为通信中介,将分布式系统中的各个微服务连接起来。它可以通过消息广播的方式将配置信息、状态变化等事件传播到所有的微服务实例。<br>
应用
通过使用Spring Cloud Bus,开发者可以实现<b>集中式的配置管理</b>和<b>动态刷新配置</b>的能力。当配置发生变化时,只需向消息总线发送一个事件,所有订阅该事件的微服务都会接收到通知,并根据需要重新加载配置。这样可以避免每个微服务都需要手动刷新配置,提高了配置的一致性和可维护性。
支持消息广播和点对点的消息传递模式
Springcloud config实时刷新也必须采用SpringCloud Bus消息总线
24 分布式配置中心有那些框架?<br>
Apollo、zookeeper、springcloud config、nacos
25 分布式配置中心的作用?
动态变更项目配置信息而不必重新部署项目<br>
26 什么是Spring Cloud Config?
是什么
Spring Cloud Config允许开发者将应用程序的配置信息集中存储在一个远程仓库(如Git、SVN等)中,并通过Spring Cloud Config服务器提供对这些配置的访问。这样,应用程序可以从配置服务器动态地获取配置信息,而无需硬编码在代码中。
主要功能
集中式配置存储<br>
动态刷新配置<br>
多环境支持<br>
安全性和加密<br>
提供了对配置信息的加密和解密功能,以确保配置的安全性
27 SpringCloud Config 可以实现实时刷新吗?
springcloud config实时刷新采用SpringCloud Bus消息总线。
28 什么是Spring Cloud Gateway?
是什么
是Spring Cloud官方推出的<b>第二代网关框架,取代Zuul网关</b>。它可以用于路由请求、执行过滤操作、进行负载均衡等。<i>网关常见的功能有路由转发、权限校验、限流控制等作用。</i><br>
主要特性
动态路由:可以根据请求的路径、方法、头部等条件将请求路由到不同的目标服务
过滤器链:提供了一系列的过滤器,可以在请求和响应的不同阶段进行处理,例如鉴权、请求日志记录、请求转发等。
负载均衡:支持集成常见的负载均衡器,如Ribbon,以在多个实例之间进行请求的负载均衡
断路器支持:集成了断路器模式,例如Hystrix,以提高系统的弹性和容错能力
动态刷新:支持动态刷新路由配置,无需重启网关服务