当前位置: 首页 > news >正文

【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语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数&#xff1b; int aiphabetic(char); int longest(char[]);int main() {//初始化变量值&#xff1b;int i;char line[100] { 0 };//获取用户输入字符…...

QT5.5.0中使用lambda表达式时遇到的问题

QT5.5中使用lambda表达式的遇到的error_qt中lamda不起作用-CSDN博客...

【Go语言精进之路】构建高效Go程序:了解切片实现原理并高效使用

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、切片究竟是什么&#xff1f;1.1 基础的创建数组示例1.2 基础的创建切片示例1.3 切片与数组的关系 二、切片的高级特性&#xff1a;动态扩容2.1 使用 append 函数扩容2.2 容量管理与性能考量2.3 切片的截取与缩容 三…...

Python与C语言:深入探索两者的奥秘与差异

Python与C语言&#xff1a;深入探索两者的奥秘与差异 在编程的世界里&#xff0c;Python和C语言如同两位性格迥异的伙伴&#xff0c;各自拥有独特的魅力和应用场景。Python以其简洁易懂的语法和强大的库支持赢得了众多开发者的青睐&#xff0c;而C语言则以其接近硬件的低级特性…...

图像编解码器在AI绘画中的革新作用

随着人工智能技术的飞速发展&#xff0c;AI绘画已经从一个简单的概念演变为一个充满创意与可能性的领域。在这场技术与艺术的融合中&#xff0c;图像编解码器扮演着至关重要的角色。它们不仅提升了AI绘画的质量和效率&#xff0c;还拓宽了艺术创造的边界。本篇博客将深入探讨图…...

SecureCRT[po破] for Mac SSH终端操作工具[解] 安装教程

文章目录 效果一、准备工作二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、 应用程序显示软件图标&#xff0c;表示安装成功 三、输入对应参数1、解决“软件已损坏&#xff0c;无法打开&#xff0c;要移到废纸篓”问题解决步骤…...

【大数据架构】基于流式数据的大数据架构升级

背景 团队在升级大数据架构,摒弃了原来基于hadoop的架构,因此抛弃了hive,hdfs,mapreduce这一套,在讨论和摸索中使用了新的架构。 后端使用kafka流式数据通过rest catalog写入iceberg,存储于minio。在写入iceberg的时候,首先是写data数据文件,然后再写iceberg的metada…...

OpenCV中的圆形标靶检测——斑点检测算法(二)

前面的章节中我们已经大致介绍了算法流程,也对一些算法中用到的相关概念做了简要介绍,同时给出了算法调用的API,现在我们开始算法检测接口实现源码的分析。 1. 斑点的分组与加权 这里我们选择后者,先了解算法的处理流程,再分析各个模块的实现。算法流程图如下图所示,上一…...

网线制作(双绞线+水晶头)——T568B标准

参考视频&#xff1a;https://www.bilibili.com/video/BV1KQ4y1i7zP/ 1、使用剥线器 2、将线捋顺、排序、剪掉牵引线 记忆技巧 1.线序颜色整体是一浅一深 2.颜色顺序是黄、蓝、绿、棕 一个黄种人、从上向下看&#xff0c;分别看到的是蓝天、青草(绿)、泥土(棕色) 3.中间两根浅…...

湖南源点(市场研究咨询)如何产出更加有意义的竞品调研

湖南源点咨询认为&#xff1a;当前&#xff0c;任何项目都不能盲目开始&#xff0c;前期的准备工作必不可少。在基础架构搭建的同时&#xff0c;设计上对于前端功能、用户体验的调研就优先开始了。在这个阶段&#xff0c;大部分设计师都会分配很多调研任务&#xff0c;疯狂对竞…...

Qt/C++音视频开发76-获取本地有哪些摄像头名称/ffmpeg内置函数方式

一、前言 上一篇文章是写的用Qt的内置函数方式获取本地摄像头名称集合&#xff0c;但是有几个缺点&#xff0c;比如要求Qt5&#xff0c;或者至少要求安装了多媒体组件multimedia&#xff0c;如果没有安装呢&#xff0c;或者安装的是个空的呢&#xff0c;比如很多嵌入式板子&am…...

09 platfrom 设备驱动

platform 设备驱动,也叫做平台设备驱动。请各位重点学习! 1、驱动的分离与分层 1)驱动的分隔与分离 Linux 操作系统,代码的重用性非常重要。驱动程序占用了 Linux 内核代码量的大头,如果不对驱动程序加以管理,用不了多久 Linux 内核的文件数量就庞大到无法接受的地步。…...

【C#】C#读写Excel文件

1.工具库选择 使用EPPlus读取Excel文件&#xff0c;在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)绘制规范

软件数据流图&#xff08;Data Flow Diagram&#xff0c;DFD&#xff09;是一种重要的工具&#xff0c;用于表示系统中数据的流动和处理。DFD帮助开发团队和利益相关者理解系统的功能和数据处理过程。绘制DFD时应遵循一定的规范和步骤&#xff0c;以确保图表的清晰性和一致性。…...

有待挖掘的金矿:大模型的幻觉之境

人工智能正在迅速变得无处不在&#xff0c;在科学和学术研究中&#xff0c;自回归的大型语言模型&#xff08;LLM&#xff09;走在了前列。自从LLM的概念被整合到自然语言处理&#xff08;NLP&#xff09;的讨论中以来&#xff0c;LLM中的幻觉现象一直被广泛视为一个显著的社会…...

常见八大排序(纯C语言版)

目录 基本排序 一.冒泡排序 二.选择排序 三.插入排序 进阶排序&#xff08;递归实现&#xff09; 一.快排hoare排序 1.单趟排序 快排步凑 快排的优化 &#xff08;1&#xff09;三数取中 &#xff08;2&#xff09;小区间优化 二.前后指针法(递归实现) 三.快排的非…...

vue2学习(06)----vuex

目录 一、vuex概述 1.定义 优势&#xff1a; 2.构建环境步骤 3.state状态 4.使用数据 4.1通过store直接访问 4.2通过辅助函数 5.mutations修改数据&#xff08;同步操作&#xff09; 5.1定义 5.2步骤 5.2.1定义mutations对象&#xff0c;对象中存放修改state数据的方…...

webflux 拦截器验证token

在WebFlux中&#xff0c;我们可以使用拦截器&#xff08;Interceptor&#xff09;来验证Token。以下是一个简单的示例&#xff1a; 1. 首先&#xff0c;创建一个名为TokenInterceptor的类&#xff0c;实现HandlerInterceptor接口&#xff1a; java import org.springframewor…...

C++中的继承方式

目录 摘要 1. 公有继承&#xff08;Public Inheritance&#xff09; 2. 保护继承&#xff08;Protected Inheritance&#xff09; 3. 私有继承&#xff08;Private Inheritance&#xff09; 4. 多重继承&#xff08;Multiple Inheritance&#xff09; 继承列表的项数 摘要…...

Vue进阶之Vue无代码可视化项目(四)

Vue无代码可视化项目 左侧栏第一步LeftPanel.vueLayoutView.vuebase.css第二步LayoutView.vueLeftPanel.vue编排引擎smooth-dnd安装创建文件SmoothDndContainer.tsutils.tsSmoothDndDraggable.tsLeftPanel.vue左侧栏 第一步 创建LeftPanel LeftPanel.vue <script setup…...

day40--Redis(二)实战篇

实战篇Redis 开篇导读 亲爱的小伙伴们大家好&#xff0c;马上咱们就开始实战篇的内容了&#xff0c;相信通过本章的学习&#xff0c;小伙伴们就能理解各种redis的使用啦&#xff0c;接下来咱们来一起看看实战篇我们要学习一些什么样的内容 短信登录 这一块我们会使用redis共…...

使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月4日10点50分 &#x1f004;️文章质量&#xff1…...

react的自定义组件

// 自定义组件(首字母必须大写) function Button() {return <button>click me</button>; } const Button1()>{return <button>click me1</button>; }// 使用组件 function App() {return (<div className"App">{/* // 自闭和引用自…...

海宁代理记账公司-专业的会计服务

随着中国经济的飞速发展&#xff0c;企业的规模和数量日益扩大&#xff0c;在这个过程中&#xff0c;如何保证企业的财务活动合规、准确无误地进行&#xff0c;成为了每个企业面临的重要问题&#xff0c;专业、可靠的代理记账公司应运而生。 海宁代理记账公司的主要职责就是为各…...

matlab 计算三维空间点到直线的距离

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 直线的点向式方程为: x − x 0 m = y...

YOLOv5车流量监测系统研究

一. YOLOv5算法详解 YOLOv5网络架构 上图展示了YOLOv5目标检测算法的整体框图。对于一个目标检测算法而言&#xff0c;我们通常可以将其划分为4个通用的模块&#xff0c;具体包括&#xff1a;输入端、基准网络、Neck网络与Head输出端&#xff0c;对应于上图中的4个红色模块。Y…...

单元测试覆盖率

什么是单元测试覆盖率 关于其定义&#xff0c;先来看一下维基百科上的一段描述&#xff1a; 代码覆盖&#xff08;Code coverage&#xff09;是软件测试中的一种度量&#xff0c;描述程序中源代码被测试的比例和程度&#xff0c;所得比例称为代码覆盖率。 简单来理解&#xff…...

厦门做网站xm37/网站排名软件有哪些

CentOS下mysql数据库常用命令总结1.更改root密码 mysqladmin -uroot password yourpassword 2.远程登陆mysql服务器 mysql -uroot -p -h192.168.137.10 -P3306 3.查询数据库 show databases; 4.进入某个数据库 use databasename; 5.列出数据库中的表 show tables; 6.查看某个表…...

龙华做棋牌网站建设找哪家效益快/山西seo排名

MySQL5.7 并行复制 1、缘由&#xff1a; 某天看到主从复制延时的告警有点频繁&#xff0c;就想着是不是彻底可以解决一下。 一般主从复制&#xff0c;有三个线程参与&#xff0c;都是单线程&#xff1a;Binlog Dump&#xff08;主&#xff09; ----->IO Thread &#xff08;…...

巴中城市建设投资有限公司网站/房地产销售技巧和话术

发现问题我使用的Oracle11g&#xff0c;当我敲下如下一段命令后&#xff0c;就让我傻眼了。。alter system set sga_max_size960M scopespfile;shutdown immediatestartup此时的startup报错了&#xff0c;错误为&#xff1a;SQL> startupORA-00844: Parameter not taking ME…...

烟台优化网站排名/网页制作与设计教程

学习操作系统时&#xff0c;我们知道CUP处理事务的时候有个中断机制&#xff0c;以便进行事务的切换&#xff0c;中断处理的过程&#xff1a; 1)唤醒被阻塞的驱动(程序)进程&#xff1b;2)保护被中断的CPU环境&#xff1b;3)转入响应的设备处理程序&#xff1b;4)中断处理&…...

桂林二手房/英文seo实战派

14.7.4 InnoDB File-Per-Table Tablespaces从历史上看,所有的InnoDB 表和indexes 是存储在system 表空间。这个整体的方法是针对机器是整个用于数据库处理,精心策划的数据增长,任何磁盘存储分配给MySQL 不会被其他目的需要.InnoDB的file-per-table tablespace功能提供一个更加灵…...

网站 加域名/四川百度推广排名查询

http://www.ctshk.com/passport/talent_bookrep.htm 換領往來港澳通行證和申請簽注延期須知為方便持《往來港澳通行證》以內地逗留簽注在香港工作、就學、接受培訓的內地居民及其隨行家屬&#xff0c;以及勞務人員在香港逗留標籤的有效期間內&#xff0c;可以在香港換領 &#…...