SpringCloud架构师面试

一、微服务是什么

1、基本概念

微服务是一种架构风格(区别于单体架构、垂直架构、分布式架构、SOA架构),应用程序被划分为更小的、流程驱动的服务。

2、微服务的特征

  1. 轻量化:将复杂的系统或者服务进行纵向拆分,每个微服务专注于解决专项问题。
  2. 低耦合:拆分后的各个服务在代码、资源、环境上相互独立,可以独立地进行开发、测试、部署与维护,有利于系统的稳定性(发生问题时影响面降低)和扩展(扩展资源时资源评估更方便、风险更低                                        )。
  3. 跨平台:不同的微服务可以使用不同的开发语言,亦可以运行在不同的环境。

二、SpringCloud是什么

1、基本概念:

Spring Cloud是一个微服务框架,它提供了一系列分布式系统解决方案。通过组件化的方式提供微服务的开发部署、服务注册发现、服务治理与服务运维等能力。

2、常用组件:

1)Spring Cloud Netflix:

Eureka:注册中心

Ribbon:负载均衡

Feign   :远程调用

Hystrix :服务熔断

Zuul/Gateway:网关

2)Spring Cloud Config:集中化的配置管理工具,应用配置的外部化存储,可用于Spring或非Spring的应用。

3)Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或配置更改事件。

4)Spring Cloud Consul:服务发现与配置工具,与Docker容器无缝集成。

5)Spring Cloud Security:安全工具包,提供对应用安全和身份验证支持。

6)Spring Cloud Sleuth:分布式调用链跟踪,与Zipkin、HTrace和ELK跟踪兼容。

7)Spring Cloud Cluster:领导选举,通过对Zookeeper、Redis、Consul抽象实现。

8)Spring Cloud Data Flow:微服务编排,可以通过拖拽式界面或REST API简易使用。

9)Spring Cloud Stream:轻量级事件驱动微服务框架,快速构建连接外部系统的应用。

10) Spring Cloud Task:短期的微服务框架,快速构建完成批量数据处理任务的应用。

三、SpringCloud组件的使用步骤

springcloud教程 -- 3.微服务熔断机制,断路器hystrix的使用详解_java 熔断怎么配置-CSDN博客

springcloud教程 -- 4.网关zuul的使用详解_zuul使用教程-CSDN博客

1、Hystrix(熔断、降级、限流)

1)有什么作用?

        在分布式系统中,如果某个服务节点发生故障或者网络发生异常,都有可能导致调用方被阻塞等待,如果超时时间设置很长,调用方资源很可能被耗尽。这又导致了调用方的上游系统发生资源耗尽的情况,最终导致系统雪崩。熔断可以有效防止服务雪崩。

        如果遇到突增流量,一般的做法是对非核心业务功能采用服务降级的措施来保护核心业务功能正常服务,而对于核心功能服务,则需要采用限流的措施。

2)发生在客户端还是服务端?

服务熔断:一般是发生在服务端的(目的是让调用方快速失败),当某个服务超时或者异常时,就引起熔断,类似于现实生活中的保险丝。(有时也可以配置在客户端,当发现调用某个服务异常时让自己快速失败);
服务降级:一般是发生在客户端的,从整体网站请求负载考虑,当某个服务熔断或者关闭后,服务将不再调用;(有时也可以配置在服务端,当系统出现突发流量时对非核心功能进行降级保护核心功能);

限流:一般发生在服务端;

3)如何使用

  • 熔断:

        @EnableCircuitBreaker  :application上开启熔断器

        @HistrixCommand(fallbackMethod="xxxFallback",commandProperties = {
}) :熔断的注解是在降级的注解上增加,commandProperties = {} 里填熔断条件,具体熔断条件可点击HystrixPropertiesManager类查看。

@HystrixCommand(fallbackMethod = "xxxFallback",commandProperties = {//20秒内出现3个请求,失败率为30%,就会触发熔断,30秒内不再发送调用// 条件一: 请求数量达到3个@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "3"),// 条件二: 每20秒一个判断单位@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_INTERRUPT_ON_TIMEOUT,value = "20000"),// 条件三: 失败率30%@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "30"),// 结果: 熔断后, 30秒内不再请求远程服务@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "30000")})
  • 降级:

        新建xxxFallbackFactory类实现FallbackFactory并重写create方法,create里面定义降级方法。

        @FeignCliend(fallbackFactory=xxxFallbackFactory.class):Histrix集成到了Feign里面

       或者直接在方法上指定降级方法: @HistrixCommand(fallbackMethod="xxxFallback")

  • 限流:

        1、限流策略:

         1)、信号量限流

        信号量用来控制可同时并发的线程数。通过构造方法指定内部虚拟许可的数量。

         如果采用信号量隔离技术,每接收一个请求,都是服务自身线程去直接调用依赖服务,信号量就相当于一道关卡,每个线程通过关卡后,信号量数量减1,当为0时不再允许线程通过,而是直接执行fallback逻辑并返回,说白了仅仅做了一个限流。

信号量可以理解为一个计数器,计数器统计当前正在处理的请求数量,当计数器的值达到设定值,则不接受后续请求(或降级),需要等待,直到计数器值小于设定值,后续请求才能进入处理。

@HystrixCommand(commandProperties= {@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE"),@HystrixProperty(name="execution.isolation.semaphore.maxConcurrentRequests", value="20")},fallbackMethod = "errMethod"
)

         2)、线程池限流

@HystrixCommand(commandProperties = {@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD")},threadPoolKey = "createOrderThreadPool",threadPoolProperties = {@HystrixProperty(name = "coreSize", value = "20"),@HystrixProperty(name = "maxQueueSize", value = "100"),@HystrixProperty(name = "maximumSize", value = "30"),@HystrixProperty(name = "queueSizeRejectionThreshold", value = "120")},fallbackMethod = "errMethod"
)

这里要注意:在java的线程池中,如果线程数量超过coreSize,创建线程请求会优先进入队列,如果队列满了,就会继续创建线程直到线程数量达到maximumSize,之后走拒绝策略。但在hystrix配置的线程池中多了一个参数queueSizeRejectionThreshold,如果queueSizeRejectionThreshold < maxQueueSize,队列数量达到queueSizeRejectionThreshold就会走拒绝策略了,因此maximumSize失效了。如果queueSizeRejectionThreshold > maxQueueSize,队列数量达到maxQueueSize时,maximumSize是有效的,系统会继续创建线程直到数量达到maximumSize

        2、信号量限流和线程池限流区别:

        1)、性能层面:信号量使用原来的线程,性能消耗小;

        2)、系统稳定层面:线程池隔离,自己出问题不会影响其他线程池;

        3)、同步异步:因为信号量是使用的原有线程,所以是同步的,且是阻塞的。

        3、限流策略使用场景:

        当请求量非常密集,导致线程隔离的开销比较高的时候,建议使用信号量的方式降低负荷,这种情况通常用来应对非网络请求(不需要调用外部服务)。其他场景均建议使用线程池方式。

4)三者区别?

        限流仅仅只是限流,只要不超过流量限制,服务仍然可用(区别于熔断),也不一定非要降级(也可以抛出超出流量限制异常给到调用方自行处理)。所以下面仅仅说一下熔断和降级的区别:

  • 概念不同

        熔断是服务整体不可用(侧重的是自我保护),降级是退而求其次(侧重的是兜底),限流是流量不能超过多少。

  • 触发机制不同

        默认情况 hystrix 如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求。

        默认情况下,hystrix 在以下 4 种条件下都会触发降级机制:

  1. 方法抛出 HystrixBadRequestException
  2. 方法调用超时
  3. 熔断器开启拦截调用
  4. 线程池或队列或信号量已满
  • 归属关系不同

        熔断时可能会调用降级机制,而降级时通常不会调用熔断机制。因为熔断是从全局出发,为了保证系统稳定性而停用服务,而降级是退而求其次,提供一种保底的解决方案,所以它们的归属关系是不同(熔断 > 降级)。

2、Feign和RestTemplate

链接内容概要:

  1. 添加starter依赖;
  2. 添加注解:@EnableFeignClients;
  3. 创建Feign接口:

        @FeignClient(name="eureka-HA",fallbackFactory=DeptClientServiceFallbackFactory.class)

springcloud教程 -- 1.快速搭建入门级demo,看这一篇就够了_叶巨岩-GitCode 开源社区废话不多讲,跟紧我,开启你的SpringCloud初体验首先回顾微服务的基本组成:[图片 here]生产者:提供服务消费者:消费服务服务注册/发现中心:服务注册,发现,监控所以,首先明白springcloud微服务的架构基础:生产者(client),消费者(client),服务注册/发现中心(server) 叶巨岩 GitCode 开源社区icon-default.png?t=N7T8https://gitcode.csdn.net/65e840841a836825ed78b9d0.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MzI1MTQ3NiwiZXhwIjoxNzIxMTM0MjcwLCJpYXQiOjE3MjA1Mjk0NzAsInVzZXJuYW1lIjoicXFfMTk5NTIwMjkifQ.7co5oRDfDrxtdqIsV-9AjJacdbURh-cikj5Rtxt7Z1c

3、Zuul的使用

参考:

SpringBoot项目架构实战之“网关zuul搭建“-CSDN博客

4、注册中心Eureka的使用

参考:

SpringBoot项目架构实战之“父项目搭建与注册中心搭建”_java搭建springboot父工程启动-CSDN博客

四、SpringCloud工作原理

1、Eureka工作原理:

  1. 服务注册:服务提供者在启动时,会向Eureka服务端发送注册请求,包括服务的IP地址、端口号、服务名等信息。Eureka服务端接收到注册请求后,会将服务信息保存到内存中,并对外提供服务注册信息查询功能。

  2. 服务发现:服务消费者在需要调用其他服务时,会向Eureka服务端发送服务发现请求,获取所需服务的实例列表。Eureka服务端接收到请求后,会返回对应服务的实例列表,包括服务的IP地址、端口号等信息。服务消费者根据返回的实例列表,选择其中一个服务实例进行调用(负载均衡)。

  3. 心跳健康检查:服务提供者会定期向Eureka服务端发送心跳包,以证明自身服务处于正常运行状态。如果Eureka服务端在一段时间内未接收到某个服务实例的心跳包,则认为该服务实例已经宕机,会将其从服务列表中移除。

五、SpringCloud底层源码

1、网关Zuul源码

SpringBoot项目架构实战之“网关zuul搭建“-CSDN博客文章浏览阅读227次。第三章网关zuul搭建前言:1、主要功能 zuul主要提供动态路由(内置ribbon实现)和过滤(可以做统一鉴权过滤器、灰度发布过滤器、黑白名单IP过滤器、服务限流过滤器(可以配合Sentinel实现))功能;2、和spring cloud GateWay的区别 属于两个不同开源组织提供的网关解决方案。spring cloud GateWay使用非阻塞API,内置限流过滤器,支持长连接(比如websockets),在高并发和后端服务响应慢的场景下比Zuul...https://blog.csdn.net/qq_19952029/article/details/124285479

2、注册中心Eureka源码

3、断路器Histrix源码

4、配置中心Config源码

5、负载均衡Ribbon源码

6、微服务调用Feign源码

六、SpringCloud如何实现分布式事务

Seata TCC模式实战(下)-阿里云开发者社区Seata TCC模式实战(下)icon-default.png?t=N7T8https://developer.aliyun.com/article/1053737?spm=5176.26934562.main.1.799c6a03T45SJ9上面博文未解决悬挂问题,可以通过不同状态标识来进行判断。

https://www.cnblogs.com/lilpig/p/16613226.htmlicon-default.png?t=N7T8https://www.cnblogs.com/lilpig/p/16613226.html

1、TCC模式角色

TM:事务管理器,随着@GlobalTransaction注解生成。

TC:协调者

RM:参与者

整个的流程就是:

TM代理你的全局事务,并在开始执行前向TC注册
TM开始执行全局事务中的每个分支事务,RM向TC注册报告分支事务以及执行状态
分支事务执行完成,TM向TC发起提交或回滚全局事务的请求

2、TCC资源预留、提交、回滚的含义。

预留表示将数据库资源锁定并更新为中间状态,待确认后进行二阶段提交时再改为生效状态。所以预留阶段和提交回滚阶段都涉及操作数据库,所以也可能存在confirm和rollback失败的情况,需要人工处理,可以通过记录日志、补偿重试等进行解决

3、TCC的优缺点

TCC模式优点

  1. 一阶段直接提交,无DB锁,无其它锁,性能好
  2. 预留和恢复逻辑由自己编写,不依赖数据库,可以用在非事务型数据库

TCC模式缺点

  1. 编码复杂
  2. 弱一致
  3. 因为ConfirmCancel也可能失败,需要处理这个过程
  4. 有些业务并不适合TCC模式,比如下单操作是一个新增行的过程,没法也没必要使用TCC

4、XA模式

强一致性,通过协调各参与者的本地事务何时提交和回滚。

XA模式的优点

  1. 容易实现,因为大部分数据库都已经支持了XA事务,Seata只需要做简单的包装即可
  2. 强一致性

XA模式的缺点

  1. 每个事务都需要等待所有事务处理完成,占用数据库锁,性能较差,可用性较低
  2. 如果数据库不支持XA事务就无法使用

5、AT模式

弱一致性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android数据库基础

目录 1、安卓数据存储方式 2、数据库事务 数据库事务的特性(ACID) 事务的隔离级别 事务总结 3、ContetProvider 作用 ​编辑 统一资源标识符URI ​编辑 MIME类型 ContentProvider主要方法 4、ContentResolver 作用 主要方法 使用案例 辅助工具类 ContentUris Uri…

BPMN.js学习

查看流程图 processView: {title: ,open: false,index: undefined,xmlData:"", },<el-table-column label"模型名称" align"center" :show-overflow-tooltip"true"><template slot-scope"scope"><el-button…

抖音短视频矩阵系统源码开发与部署全解析

1. 需求分析与功能规划 在着手开发短视频矩阵源码之初&#xff0c;首要任务是界定项目需求。这包含对视频上传、编辑、分享、评论及点赞等功能的实现预期。同时&#xff0c;需深入理解目标用户群体的具体需求和使用习惯&#xff0c;以确保产品能够满足市场需求。 2. 技术选型…

游戏如何应对黑灰产工作室

游戏黑灰产工作室&#xff0c;是指以非法渠道、非法手段通过游戏进行牟利的团伙。使用脚本、外挂是黑灰产工作室的显著特征&#xff0c;其常见的牟利方式有&#xff1a;打金工作室、资源囤积号、初始号、自抽号、代练工作室以及营销欺诈等。 ▲ 常见的游戏黑灰产工作室牟利路径…

视频太大怎么压缩变小?这几种压缩方法值得收藏!

视频太大怎么压缩变小&#xff1f;在数字化浪潮汹涌的时代&#xff0c;处理大型视频文件已不再仅仅是存储空间的挑战&#xff0c;我们身处于数据洪流之中&#xff0c;数据的安全与隐私的保护已然成为了我们不得不面对的重大议题&#xff0c;特别是随着视频内容的井喷式增长及其…

Qt学生管理系统(付源码)

Qt学生管理系统 一、前言1.1 项目介绍1.2 项目目标 2、需求说明2.1 功能性说明2.2 非功能性说明 三、UX设计3.1 登录界面3.2 学生数据展示3.3 信息插入和更新 三、架构说明3.1 客户端结构如下3.2 数据流程图3.2.1 数据管理3.2.2 管理员登录 四、 设计说明3.1 数据库设计3.2 结构…

智能家居开发新进展:乐鑫 ESP-ZeroCode 与亚马逊 ACK for Matter 实现集成

日前&#xff0c;乐鑫 ESP-ZeroCode 与亚马逊 Alexa Connect Kit (ACK) for Matter 实现了集成。这对智能家居设备制造商来说是一项重大进展。开发人员无需编写固件或开发移动应用程序&#xff0c;即可轻松设计符合 Matter 标准的产品。不仅如此&#xff0c;开发者还可以在短短…

算法模块导学

算法分析版本迭代流程图设计算法实践 练就扎实的基本功&#xff0c;可量化&#xff0c;可评估的&#xff0c;不是停留在大脑中的感觉。 1、算法&测开之缘 我们学习算法的目标是为了测试服务的&#xff0c;所以我们要了解测开最终要具备什么样的能力。 测开需要具备的能力…

从0开始的STM32HAL库学习4

对射式红外传感器计数复现 配置工程 我们直接复制oled的工程&#xff0c;但是要重命名。 将PB14设置为中断引脚 自定义命名为sensorcount 设置为上升沿触发 打开中断 配置NVCI 都为默认就可以了 修改代码 修改stm32f1xx_it.c 文件 找到中断函数并修改 void EXTI15_10_I…

Python精神病算法和自我认知异类数学模型

&#x1f3af;要点 &#x1f3af;空间不确定性和动态相互作用自我认知异类模型 | &#x1f3af;精神病神经元算法推理 | &#x1f3af;集体信念催化个人行动力数学模型 | &#x1f3af;物种基因进化关系网络算法 | &#x1f3af;电路噪声低功耗容错解码算法 &#x1f4dc;和-…

【Java】零散知识--感觉每条都有知识在进入脑子唤起回忆

1&#xff0c;什么是双亲委派 AppClassLoader在加载类时&#xff0c;会向上委派&#xff0c;取查找缓存。 AppClassLoader >>ExtClassLoader >>BootStrapClassLoader 情况一 向上委派时查找到了&#xff0c;直接返回。 情况二 当委派到顶层之后&#xff0c;缓…

CSS特效:pointer-events: none;的一种特殊应用

一、需求描述 今天看到一个设计需求&#xff1a;需要在弹框中显示如下界面&#xff0c;其中有两个效果&#xff1a; 1.顶部点击项目&#xff0c;下面的内容能相应滚动定位&#xff0c;同时滚动的时候顶部项目也能相应激活显示 2.顶部右侧有一个模糊渐变效果&#xff0c;并且要…

从0到1搭建数据中台(1)

初识 数据仓库&#xff0c;数据湖&#xff0c;大数据平台&#xff0c;数据中台的发展历程梳理&#xff1b;数据中台的搭建方法论&#xff1b;数据中台搭建的初步落地&#xff0c;参考大神郭忆的课程&#xff0c;看完就会对全貌有个理解。 Easydata大数据生产力平台架构图。 有…

vue实例和容器的一夫一制——04

//准备容器 <div classapp> <h1>{{mag}}</h1> </div> //准备容器 <div classapp> <h1>{{mag}}</h1> </div> //准备容器 <div classapp2> <h1>{{name}}</h1> </div> <script> // 验…

久期分析与久期模型

目录 一、久期分析的理论原理 二、数据准备 三、Stata 程序代码及解释 四、代码运行结果 一、久期分析的理论原理 久期&#xff08;Duration&#xff09;是衡量债券价格对利率变动敏感性的重要指标。它不仅仅是一个简单的时间概念&#xff0c;更是反映了债券现金流回收的平均…

Elasticsearch:Node.js ECS 日志记录 - Pino

在我的上一篇文章 “Beats&#xff1a;使用 Filebeat 从 Python 应用程序中提取日志” 里&#xff0c;我详述了如何使用 Python 来生成日志&#xff0c;并使用 Filebeat 来收集日志到 Elasticsearch 中。在今天的文章中&#xff0c;我来详细描述如何使用 Node.js 来生成 ECS 相…

龙迅#LT6711GXE适用于HDMI2.1转DP1.4/TPYE-C应用方案,分辨率高达8K30HZ,4K144HZ!

1. 描述 LT6711GXE 是带有 PD 控制器的 HD-DVI2.1 到 DP1.4a 转换器。 对于 HD-DVI2.1 输入&#xff0c;LT6711GXE可以配置为 3/4 通道。自适应均衡使其适用于长电缆应用&#xff0c;最大带宽高达 40Gbps。它支持最高分辨率的8K30Hz、4K144Hz或8K60Hz压缩数据&#xff08;直通&…

小巧低调的黑盒子,打造个性化音乐体验,欧尼士ONIX Alpha小尾巴上手

欧尼士ONIX的产品很有辨识度&#xff0c;这家来自英国的品牌&#xff0c;有着鲜明的黑金设计色彩&#xff0c;以及低调奢华的质感&#xff0c;当然最重要的是&#xff0c;欧尼士的音质表现非常出色&#xff0c;因此深受音乐爱好者的喜爱。在以手机等设备为载体的流媒体音乐盛行…

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…

前端预览图片的两种方式:转Base64预览或转本地blob的URL预览,并再重新转回去

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 预览图片 一般情况下&#xff0c;预览图片功能&#xff0c;是后端返回一个图片地址资源&#xff08;字符串&#xff09;给前端&#xff0c;如&#xff1a;ashuai.work/static…