【Java面试】九、微服务篇SpringCloud(上)

devtools/2024/11/15 1:49:22/

文章目录

  • 1、SpringCloud五大组件
  • 2、服务注册和发现
    • 2.1 Eurake
    • 2.2 Eurake和Nacos的区别
  • 3、Ribbon负载均衡
    • 3.1 策略
    • 3.2 自定义负载均衡策略
  • 4、服务雪崩与熔断降级
    • 4.1 服务雪崩
    • 4.2 服务降级
    • 4.3 服务熔断
  • 5、微服务监控
  • 6、面试

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、微服务监控

常见技术选型:

  • SpringBoot-Admin
  • Prometheus + Grafana(偏监控,搭建复杂)
  • Zipkin(偏链路追踪,但有代码侵入)
  • Skywalking(偏链路追踪)

以SkyWalking为例:

在这里插入图片描述

相关概念:

  • 服务(Service):系统中的一个个微服务
  • 端点(Endpoint):开发的一个个功能接口
  • 实例(Instance):服务所在的物理机服务器

搭建完成后,根据仪表盘中的慢接口,去问题定位,拓扑图中显示了服务之间的调用关系

在这里插入图片描述
更好的是,sky walking可以设置告警规则,项目上线后,可给负责人发短信或者邮件,以便第一时间修复问题。

6、面试

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

在这里插入图片描述


http://www.ppmy.cn/devtools/45932.html

相关文章

Windows API 速查

Windows API 函数大全 (推荐):https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在线参考手册:http://www.office-cn.net/t/api/index.html?web.htmWindows 开发文档 (官方):https://learn.microsoft.com/zh-cn/wi…

内网渗透-隧道搭建ssp隧道代理工具frp内网穿透

内网渗透-隧道搭建&ssp隧道代理工具&frp内网穿透 目录 内网渗透-隧道搭建&ssp隧道代理工具&frp内网穿透spp隧道代理工具spp工作原理图cs上线主机spp代理通信服务端配置客户端配置CS配置设置CS生成木马的监听器配置CS监听上线的监听器生成木马 spp隧道搭建服务端…

【C++】6-6 你好,输出的格式控制(对齐)

6-6 你好,输出的格式控制(对齐) 分数 10 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序:按示例格式输出所有分数,分数保留2位小数,分数左对齐输出在两根竖线之间 裁判测试程序样例&#xff1…

#php的pecl工具#

pecl(php拓展社区库,pear拓展版本)是一个官方的php扩展仓库,提供了众多优秀的php扩展供开发人员使用,作用主要是给php安装php扩展 1:安装PECL 首先,需要确保已安装PHP和PECL。PECL通常随着PHP一起安装,但…

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点:窗口坐标体系的原点位于窗口的左上角,即坐标(0, 0)位置。 轴方向: X轴:向右为正方向,随着X坐标值的增加,元素在窗口中从…

14.Redis之JAVASpring客户端

1.引入依赖 此时就会引入操作 redis 的依赖了~~ 2.yml配置 spring:redis:host: 127.0.0.1port: 8888 3.准备 前面使用 jedis,是通过 Jedis 对象里的各种方法来操作 redis 的.此处Spring 中则是通过 StringRedisTemplate 来操作 redis .最原始提供的类是 RedisTemplateStrin…

springboot 后端文件上传,多文件上传,预览接口开发实现

在Spring Boot中实现文件上传和多文件上传的功能可以通过使用Spring MVC的MultipartFile类来实现。以下是一个简单的示例代码,展示了如何实现文件上传和多文件上传的功能。 首先,创建一个用于处理文件上传请求的Controller类。在该类中,我们需要使用@PostMapping注解来接收…

如何高效测试防火墙的NAT64与ALG应用协议转换能力

在本文开始介绍如何去验证防火墙(DUT)支持NAT64 ALG应用协议转换能力之前,我们先要简单了解2个比较重要的知识点,即,NAT64和ALG这两个家伙到底是什么? 网络世界中的“翻译官” - NAT64技术 简而言之&…