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. 因为Confirm和Cancel也可能失败,需要处理这个过程
  4. 有些业务并不适合TCC模式,比如下单操作是一个新增行的过程,没法也没必要使用TCC

4、XA模式

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

XA模式的优点:

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

XA模式的缺点:

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

5、AT模式

弱一致性

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;特别是随着视频内容的井喷式增长及其…

音视频开发——FFmpeg 实现MP4转FLV文件 C语言实现

文章目录 转换步骤关键代码完整代码 转换步骤 初始化FFmpeg库打开输入文件找到输入文件的流信息打开输出文件并设置输出格式创建输出文件的流初始化解码器和编码器读取输入文件的帧并写入输出文件释放资源 关键代码 1 初始化FFmpeg库&#xff1a; av_register_all();打开输…

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 结构…

EdgeOne安全能力开箱测评挑战赛

活动地址&#xff1a;EdgeOne安全能力开箱测评挑战赛-腾讯云开发者社区-腾讯云 随着网络攻击日益频繁&#xff0c;企业网站面临着数据泄露、DDoS攻击、CC攻击等多种安全威胁。如何有效保护企业网站安全&#xff0c;成为企业IT部门的重要任务。腾讯云EdgeOne作为一款集成了CDN和…

智能家居开发新进展:乐鑫 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…

Qt:14.容器类控件(QGroupBox、QTabWidget-创建选项卡式界面的控件)

目录 一、QGroupBox&#xff1a; 1.1QGroupBox介绍&#xff1a; 1.2 属性介绍&#xff1a; 二、QTabWidget-创建选项卡式界面的控件&#xff1a; 2.1 QTabWidget介绍&#xff1a; 2.2 属性介绍&#xff1a; 一、QGroupBox&#xff1a; 1.1QGroupBox介绍&#xff1a; QGro…

操作系统安全保护

操作系统安全概述 操作系统&#xff08;Operating System, OS&#xff09;是计算机系统的核心软件&#xff0c;管理硬件资源&#xff0c;提供基本服务&#xff0c;支持应用程序运行。操作系统安全是确保OS及其管理的资源免受未经授权访问、使用、修改和破坏的重要过程。操作系…

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大数据生产力平台架构图。 有…

html页面实现socket.io

使用CDN&#xff1a;https://socket.io/zh-CN/docs/v4/client-installation/ socket.on 监听服务端的事件 socket.emit 是客户端的事件 <!DOCTYPE html> <html> <head><title>长时间任务</title><script src"https://cdnjs.cloudflare…

linux 文件末尾追加内容

1、echo echo "Hello, World!" >> example.txt 2、printf printf "Hello, World!\n" >> example.txt 3、cat 多行添加 cat >> example.txt <<EOF Line 1 Line 2 Line 3 EOF 4、sed sed -i ‘$a\要添加的文本’ example.txt 其中…

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

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