【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、面试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python报错】已解决ModuleNotFoundError: No module named ‘xxx‘ in Jupyter Notebook

解决Python报错:ModuleNotFoundError: No module named ‘xxx’ in Jupyter Notebook 在使用Jupyter Notebook进行数据分析或科学计算时,我们经常需要导入各种Python模块。如果你遇到了ModuleNotFoundError: No module named xxx的错误,这通常…

[word] word如何清除超链接 #媒体#笔记#知识分享

word如何清除超链接 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享下word如何清除超链接的操作办法,一起来学习下吧! 1、清除所有超链接 按下组合键CtrlshiftF9,就可以将网上复制带有超链…

Rust 标记一个属性或函数为废弃

如题,演示Rust 标记一个属性或函数为废弃的基本使用方法: 示例: use serde::{Deserialize, Serialize};#[derive(Clone, Debug, Serialize, Deserialize, Default)] pub struct GrpcOptions {pub addr: String,pub max_recv_message_size: u…

【JavaScript函数详解】Day04

JavaScript函数详解 JavaScript 基础 - 第4天笔记函数声明和调用声明(定义)调用 参数形参和实参参数默认值 返回值函数补充细节作用域全局作用域局部作用域变量的访问原则 匿名函数函数表达式立即执行函数 逻辑中断小知识(转换为Boolean型&am…

企业应如何选择安全合规的内外网文件摆渡系统?

网络隔离是一种安全措施,旨在将网络划分为不同的部分,以减少安全风险并保护敏感信息。常见的隔离方式像物理隔离、逻辑隔离、防火墙隔离、虚拟隔离、DMZ区隔离等,将网络隔离成内网和外网。内外网文件摆渡通常指在内部网络(内网&am…

【吊打面试官系列】CHAR 和 VARCHAR 的区别?

大家好,我是锋哥。今天分享关于 【CHAR 和 VARCHAR 的区别?】面试题,希望对大家有帮助; CHAR 和 VARCHAR 的区别? 1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同 1000道 互联网大厂Java工程师 精选面试题-Java资源…

【吊打面试官系列】MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

大家好,我是锋哥。今天分享关于 【MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?】面试题,希望对大家有帮助; MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别&#xf…

【机器学习】深度卷积生成对抗网络(DCGAN)用于图像生成

1. 引言 1.1 DGGAN是什么? DGGAN(Directed Graph embedding framework based on Generative Adversarial Network)是一种基于生成对抗网络(GAN)的有向图嵌入方法: 基本定义:DGGAN是一种结合了…

【中篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。上回我解释了Yolo v1, 今天从Yolov2开始。 YOLOv2:更好、更快、更强 2017 年 7 月一个闷热的星期二下午,雷德蒙(Joseph Redmon, Yolo创始人)再次走上舞台。 …

【微信小程序开发】小程序中的上滑加载更多,下拉刷新是如何实现的?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Socket编程权威指南(二)完美掌握TCP流式协议及Socket编程的recv()和send()

在上一篇文章中,我们学习了Socket编程的基础知识,包括创建Socket、绑定地址、监听连接、接收连接等操作。然而,真正的套接字编程远不止于此。本文将重点介绍TCP 流式协议,什么是粘包问题?如何解决粘包问题 &#xff1f…

俄罗斯服务器租用攻略:选择优质服务器,开启海外市场新征程

随着国际贸易的不断发展,俄罗斯作为一个重要的贸易伙伴备受关注。许多企业和公司为了开拓海外市场,选择将业务拓展到俄罗斯,而在这个过程中,租用一台优质的服务器成为了必须面对的问题。俄罗斯作为一个经济发展迅速的国家&#xf…

Chrome DevTools解密:成为前端调试大师的终极攻略

Chrome DevTools是一套内置于Google Chrome浏览器中的开发者工具,它允许开发者对网页进行调试、分析和优化。本文将全面介绍DevTools的功能、使用方法以及注意事项,帮助开发者更好地利用这些工具来提升开发效率和网页性能。 一、简介 1. DevTools是什么…

macbookrpro使用体验

前言 之前用的电脑是拯救者y7000 2020,用了四五年,年前就有换电脑的打算。计划就是买一个苹果电脑,在查看了挺多电脑,多方面对比后,最终还是买了Macbook pro。 我买的笔记本的配置如下: 购买14英寸的原因…

什么是Docker ?

在软件开发的星辰大海中,有一个神奇的技术,它能够将应用程序及其依赖环境封装在一个轻量级的、可移植的容器中。这项技术就是Docker。它不仅简化了应用的部署流程,还让开发和运维之间的界限变得模糊,使得跨平台部署变得前所未有的…

Ghost Mirror

Ghost Mirror 操作系统镜像 windows servers linux Windows XP 老古董,唉 安装完重启一下 设置下BIOS 1小时内弄完3台。。。

【数据分析基础】实验一 Python运算符、内置函数、序列基本用法

一、实验目的 熟练运用Python运算符。熟练运用Python内置函数。掌握Python的基本输入输出方法。了解lambda表达式作为函数参数的用法。掌握列表、元组、字典、集合的概念和基本用法。了解Python函数式编程模式。 二、实验内容: 1. 在命令模式测试如下命令&#x…

[office] 快速删除excel中的空行和列的方法 #其他#学习方法#经验分享

快速删除excel中的空行和列的方法 用户在网上下载好的Excel表格打开之后发现有很多空白行,怎么样将这些空白行或单元格一次性删除掉呢?下面教大家在Excel中用定位一次性可以把空白行删除 用户在网上下载好的Excel表格打开之后发现有很多空白行,怎么样将…

高考志愿选专业,如何分析自己的兴趣爱好?

之所以在选择专业的时候比较迷茫,就是对自己不够了解,没有分析过自己的兴趣爱好,所以也不知道如何选择适合自己的专业,但是他们又不得不做出更深入的了解,因为专业的选择将关系到未来的职业道路和生活方向。 对于绝大…

【JSP】如何在IDEA上部署JSP WEB开发项目

以我的课设为例,教大家拿到他人的项目后,如何在IDEA上部署。 需要准备: JDK17(或者JDK13)IntelliJ IDEA 2023.2.6MySQL 8.0Tomcat 9.0 一,新建项目添加文件 1.1复制“位置”的路径 1.2找到该文件夹 1.3…