【Java面试】九、微服务篇-SpringCloud(上)
文章目录
- 1、SpringCloud五大组件
- 2、服务注册和发现
- 2.1 Eurake
- 2.2 Eurake和Nacos的区别
- 3、Ribbon负载均衡
- 3.1 策略
- 3.2 自定义负载均衡策略
- 4、服务雪崩与熔断降级
- 4.1 服务雪崩
- 4.2 服务降级
- 4.3 服务熔断
- 5、服务限流
- 5.1 Nginx限流
- 5.2 网关限流
- 6、微服务监控
- 7、面试
1、SpringCloud五大组件

通常情况下:
- Eureka:服务注册中心(注册自己的地址上来,方便后续路由转发到对应的服务上去干活儿)
- Ribbon:负载均衡
- Feign:远程调用
- Hystrix:服务熔断
- zuul/Gateway:网关
实际项目用到了SpringCloudAlibaba相关的组件:
- Nacos:服务注册中心/配置管理
- Ribbon:负载均衡
- Feign:远程调用
- Sentinel:服务熔断
- Gateway:网关
2、服务注册和发现
微服务中,关于注册中心:
- 作用:服务注册和发现
- 常见选择:Nacos、Eureka、Zookeeper
2.1 Eurake
以Eureka为例:

比如order服务需要远程调用user服务,则前者为服务消费者、后者为服务提供者,服务启动后详情如下,体现了Eurake的三个功能:
- 服务注册:微服务向注册中心注册自己的实例信息(服务名称、IP、端口),比如user有三个实例(Pod),地址分别为localhost:8081、8082、8083
- 服务发现:order作为服务消费者调用user服务时,从注册中心拉取注册信息,并利用负载均衡算法选择user的某一个实例,进行远程调用
- 服务监控:每个实例定期向注册中心发送心跳,比如user-service:8083实例挂掉,注册中心收不到其心跳信息,则从服务列表中删掉其注册信息
2.2 Eurake和Nacos的区别
二者的共同点:
- 都支持服务的注册和注册信息拉取
- 都支持服务提供者心跳方式做健康检查
区别:
1)Nacos还支持做配置管理,Eurake只有注册中心
2)Nacos临时实例采用心跳模式,非临时实例采用主动检测模式
使用Nacos时,可以加这个配置,设置为非临时实例(默认临时实例):

默认的临时实例,其健康检测和Eurake一样,但当设置为非临时实例时,Nacos注册中心会主动发消息询问这个实例还活着没,而不是实例向注册中心发送心跳信息。临时实例心跳不正常会被剔除,非临时实例则不会被剔除。

3)服务注册信息发生变化时,Naocs会将列表变更推送到服务消费者,即服务列表实时更新
如上图,即Nacos即支持服务主动定时pull拉取注册列表信息,也支持主动将变更push到服务
4)Nacos集群默认是AP,即追求高可用,但当集群中存在非临时实例时,采用CP模式,即强一致性,而Eurake采用AP
3、Ribbon负载均衡
3.1 策略
采用Feign远程调用时,底层是Ribbon在做负载均衡,流程如下: 从注册中心拉取的服务提供者实例列表,根据负载均衡策略,选择一个实例,比如轮询策略

Ribbon负载均衡策略:轮流、随机、选响应快的、选比较空闲的
- 轮询:RoundRobinRule
- 按照权重来选实例,响应时间越长,权重越小:WeightedResponseTimeRule
- 随机选择一个可用的实例:RandomRule
- 忽略那些短路的实例,并选择并发数较低的实例(比较空闲的一个):BestAvailableRule
- 重试(轮询的实例宕机,重试):RetryRule
- 可用性敏感策略,先过滤非健康的,再选择连接数较小的实例:AvailabilityFilteringRule
- 区域敏感策略(默认策略,以区域可用的实例为基础进行实例的选择,使用 Zone 对实例进行分类,这个 Zone 可以理解为一个机房、一个机架等,后再对 Zone 内的多个服务做轮询。比如就近选择上海的机房服务器,而不选择放在北京的服务器,没有区域的概念则就是一个轮询):ZoneAvoidanceRule
3.2 自定义负载均衡策略
方式一:
在服务消费方(发起调用的那一方),创建IRule的Bean,返回一个IRule接口的实现类,不同的实现类,对应上面的一个个策略。如此,order调用任何一个微服务,都是这种负载均衡策略。
方式二:
在配置文件中,针对调用哪一个微服务时,使用哪种策略,局部生效,只针对order调用user这一个微服务时生效。

4、服务雪崩与熔断降级
4.1 服务雪崩
服务雪崩即:一个服务宕机,导致整个调用链上的其他服务因连接数耗尽也不可用

如上,D被A远程调用,后面A被B调用,此时D实例宕机,A远程请求一直得不到响应,积累久了,A的可用连接数就没了(一个服务的最大连接数是有限的,而调用失败的那些连接不会立马释放)。如此A也不可用,以此类推,整个系统都挂了。解决方案:
- 熔断降级
- 限流(只能起个预防作用)
4.2 服务降级
服务D远程调用不通时,走降级逻辑。

Feign时,用fallback指定降级逻辑:

4.3 服务熔断
只有降级也不行,降级只是返回了另一个提前定义好的失败调用结果,后面请求进来,还是先会去远程请求,直到超时失败才走降级代码,因此,需要加上熔断。即:远程调用失败次数到达一定阈值,请求过来,直接走降级逻辑,不再去先远程调用等到超时。

Hystrix 熔断机制,用于监控微服务调用情况。默认关闭,开启熔断可在引导类上添加注解@EnableCircuitBreaker,如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制,断路器打开,请求过来,不管远程调用通不通,直接走降级代码。之后每隔 5 秒重新尝试请求微服务(断路器半开,放行一个请求),如果微服务还不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求流程。
最后,注意,降级是针对远程调用某一个接口的,而熔断发生时,是全部接口。比如A远程调用B,请求B失败率到达阈值,触发熔断,则不管你直接请求B还是远程调用请求B,都是立即失败

5、服务限流
限流的原因:
- 有突发流量,并发高
- 防止用户恶意刷接口

实现方式:
- 设置Tomcat最大连接数

- Nginx:漏桶算法
- 网关:令牌桶算法
- 自定义拦截器
5.1 Nginx限流
漏桶算法即请求过来后,存起来,以固定的、微服务能处理及的速率放出来,装不下的请求等待或抛弃。削峰的味道。

具体实现:
方式一:控制速率

语法: limit_req_zone key zone rate
参数:
- key:定义限流对象, binary_remote_addr 就是一种 key ,即基于客户端 ip 限流
- Zone:定义共享存储区来存储访问信息,上图serviceReateLimit这个是自定义的名称,10m可以存储 16wip 地址访问信息
- Rate:最大访问速率,rate=10r/s,表示每秒最多放出10个请求
- burst=20:相当于桶的大小
- nodelay:快速处理,桶里的请求快速处理,桶外的请求快速丢弃
方式二:控制并发连接数

语法: limit_req_zone key zone rate
参数:
- limit_conn perip 20:对应的 key是 $binary_remote addr ,表示限制单个 |P 同时最多能持有 20 个连接
- limit_conn perserver 100:对应的 key是 $server name,表示虛拟主机(server)同时能处理并发连接的总数
5.2 网关限流
请求过来时,先去桶里申请令牌。拿到令牌,正常请求,拿不到令牌,阻塞或丢弃

和漏桶算法相比,二者的区别:比如漏桶设置了漏出速率为3,令牌桶设置了每秒生成的令牌数也为3.此时:
- 使用漏桶,可以保证最多每秒处理3个请求
- 令牌桶,每秒最多可处理6个请求:比如第1秒无请求,攒了3个令牌,第2秒来了6个请求,用掉已有的三个令牌,同时这一秒又生成3个新令牌,这一秒就可以处理6个请求
Spring Cloud Gateway网关限流的实现,是在配置中加局部过滤器RequestRateLimiter:

- key-resolver :定义限流对象( ip 、路径、参数),需代码实现,使用 spel表达式获取
- replenishRate :令牌桶每秒填充平均速率(令牌存Redis,因此需要配置Redis)
- burstCapacity :令牌桶总容量
6、微服务监控
常见技术选型:
- SpringBoot-Admin
- Prometheus + Grafana(偏监控,搭建复杂)
- Zipkin(偏链路追踪,但有代码侵入)
- Skywalking(偏链路追踪)
以SkyWalking为例:

相关概念:
- 服务(Service):系统中的一个个微服务
- 端点(Endpoint):开发的一个个功能接口
- 实例(Instance):服务所在的物理机服务器
搭建完成后,根据仪表盘中的慢接口,去问题定位,拓扑图中显示了服务之间的调用关系

更好的是,sky walking可以设置告警规则,项目上线后,可给负责人发短信或者邮件,以便第一时间修复问题。
7、面试





相关文章:
【Java面试】九、微服务篇-SpringCloud(上)
文章目录 1、SpringCloud五大组件2、服务注册和发现2.1 Eurake2.2 Eurake和Nacos的区别 3、Ribbon负载均衡3.1 策略3.2 自定义负载均衡策略 4、服务雪崩与熔断降级4.1 服务雪崩4.2 服务降级4.3 服务熔断 5、服务限流5.1 Nginx限流5.2 网关限流 6、微服务监控7、面试 1、SpringC…...
Python 树状数组
树状数组(Binary Indexed Tree, BIT),又称为斐波那契堆,是一种数据结构,用于高效地解决以下问题: 单点更新:在数组的某个位置增加或减少一个值。区间查询:查询数组中一段连续区间的…...
【QEMU中文手册】2.2 调用方式(持续更新中)
本文由 AI 翻译(ChatGPT-4)完成,并由作者进行人工校对。如有任何问题或建议,欢迎联系我。联系方式:jelin-shoutlook.com。 原文:Invocation — QEMU documentation qemu-system-x86_64 [选项] [磁盘镜像]磁…...
(函数)判断一句话中最长的单词(C语言)
一、运行结果; 二、源代码; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数; int aiphabetic(char); int longest(char[]);int main() {//初始化变量值;int i;char line[100] { 0 };//获取用户输入字符…...
QT5.5.0中使用lambda表达式时遇到的问题
QT5.5中使用lambda表达式的遇到的error_qt中lamda不起作用-CSDN博客...
【Go语言精进之路】构建高效Go程序:了解切片实现原理并高效使用
🔥 个人主页:空白诗 文章目录 引言一、切片究竟是什么?1.1 基础的创建数组示例1.2 基础的创建切片示例1.3 切片与数组的关系 二、切片的高级特性:动态扩容2.1 使用 append 函数扩容2.2 容量管理与性能考量2.3 切片的截取与缩容 三…...
Python与C语言:深入探索两者的奥秘与差异
Python与C语言:深入探索两者的奥秘与差异 在编程的世界里,Python和C语言如同两位性格迥异的伙伴,各自拥有独特的魅力和应用场景。Python以其简洁易懂的语法和强大的库支持赢得了众多开发者的青睐,而C语言则以其接近硬件的低级特性…...
图像编解码器在AI绘画中的革新作用
随着人工智能技术的飞速发展,AI绘画已经从一个简单的概念演变为一个充满创意与可能性的领域。在这场技术与艺术的融合中,图像编解码器扮演着至关重要的角色。它们不仅提升了AI绘画的质量和效率,还拓宽了艺术创造的边界。本篇博客将深入探讨图…...
SecureCRT[po破] for Mac SSH终端操作工具[解] 安装教程
文章目录 效果一、准备工作二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、 应用程序显示软件图标,表示安装成功 三、输入对应参数1、解决“软件已损坏,无法打开,要移到废纸篓”问题解决步骤…...
【大数据架构】基于流式数据的大数据架构升级
背景 团队在升级大数据架构,摒弃了原来基于hadoop的架构,因此抛弃了hive,hdfs,mapreduce这一套,在讨论和摸索中使用了新的架构。 后端使用kafka流式数据通过rest catalog写入iceberg,存储于minio。在写入iceberg的时候,首先是写data数据文件,然后再写iceberg的metada…...
OpenCV中的圆形标靶检测——斑点检测算法(二)
前面的章节中我们已经大致介绍了算法流程,也对一些算法中用到的相关概念做了简要介绍,同时给出了算法调用的API,现在我们开始算法检测接口实现源码的分析。 1. 斑点的分组与加权 这里我们选择后者,先了解算法的处理流程,再分析各个模块的实现。算法流程图如下图所示,上一…...
网线制作(双绞线+水晶头)——T568B标准
参考视频:https://www.bilibili.com/video/BV1KQ4y1i7zP/ 1、使用剥线器 2、将线捋顺、排序、剪掉牵引线 记忆技巧 1.线序颜色整体是一浅一深 2.颜色顺序是黄、蓝、绿、棕 一个黄种人、从上向下看,分别看到的是蓝天、青草(绿)、泥土(棕色) 3.中间两根浅…...
湖南源点(市场研究咨询)如何产出更加有意义的竞品调研
湖南源点咨询认为:当前,任何项目都不能盲目开始,前期的准备工作必不可少。在基础架构搭建的同时,设计上对于前端功能、用户体验的调研就优先开始了。在这个阶段,大部分设计师都会分配很多调研任务,疯狂对竞…...
Qt/C++音视频开发76-获取本地有哪些摄像头名称/ffmpeg内置函数方式
一、前言 上一篇文章是写的用Qt的内置函数方式获取本地摄像头名称集合,但是有几个缺点,比如要求Qt5,或者至少要求安装了多媒体组件multimedia,如果没有安装呢,或者安装的是个空的呢,比如很多嵌入式板子&am…...
09 platfrom 设备驱动
platform 设备驱动,也叫做平台设备驱动。请各位重点学习! 1、驱动的分离与分层 1)驱动的分隔与分离 Linux 操作系统,代码的重用性非常重要。驱动程序占用了 Linux 内核代码量的大头,如果不对驱动程序加以管理,用不了多久 Linux 内核的文件数量就庞大到无法接受的地步。…...
【C#】C#读写Excel文件
1.工具库选择 使用EPPlus读取Excel文件,在visual studio2022中安装最新NuGet。 2.读文件测试 using OfficeOpenXml; using OfficeOpenXml.Packaging.Ionic.Zip; using OfficeOpenXml.Style; using System; using System.Collections.Generic; using System.IO; u…...
数据流图(DFD)绘制规范
软件数据流图(Data Flow Diagram,DFD)是一种重要的工具,用于表示系统中数据的流动和处理。DFD帮助开发团队和利益相关者理解系统的功能和数据处理过程。绘制DFD时应遵循一定的规范和步骤,以确保图表的清晰性和一致性。…...
有待挖掘的金矿:大模型的幻觉之境
人工智能正在迅速变得无处不在,在科学和学术研究中,自回归的大型语言模型(LLM)走在了前列。自从LLM的概念被整合到自然语言处理(NLP)的讨论中以来,LLM中的幻觉现象一直被广泛视为一个显著的社会…...
常见八大排序(纯C语言版)
目录 基本排序 一.冒泡排序 二.选择排序 三.插入排序 进阶排序(递归实现) 一.快排hoare排序 1.单趟排序 快排步凑 快排的优化 (1)三数取中 (2)小区间优化 二.前后指针法(递归实现) 三.快排的非…...
vue2学习(06)----vuex
目录 一、vuex概述 1.定义 优势: 2.构建环境步骤 3.state状态 4.使用数据 4.1通过store直接访问 4.2通过辅助函数 5.mutations修改数据(同步操作) 5.1定义 5.2步骤 5.2.1定义mutations对象,对象中存放修改state数据的方…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
