【SpringCloud】微服务重点解析

微服务重点解析

在这里插入图片描述

1. Spring Cloud 组件有哪些?

在这里插入图片描述

在这里插入图片描述

2. 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册和发现的?

如果写过微服务项目,可以说做过的哪个微服务项目,使用了哪个注册中心,常见的有 eureka、nacos;

对于 eureka:

在这里插入图片描述

  • 服务注册:服务提供者需要把自己的信息注册到 eureka 中,由 eureka 来保存这些信息,比如服务名称、ip、端口等等;
  • 服务发现:消费者向 eureka 拉取指定的服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个进行调用;
  • 服务监控:服务提供者会每隔 30 秒向 eureka 发送心跳,报告健康状态,如果 eureka 服务 90 秒没接受到心跳,从 eureka 中剔除;

对于 nacos(与 eureka 的区别):

在这里插入图片描述

  • 服务注册和服务发现跟 eureka 差不多;
  • 主要是服务监控上有区别:服务分为两大类,临时实例与非临时实例,两种服务收到的待遇还不一样;
    1. nacos 服务端支持主动检测服务提供者的状态:临时实例采用心跳模式(与 eureka 一致),非临时实例采用主动检测心跳模式;
    2. 临时实例心跳不正常会被剔除,非临时实例则不会被剔除;
    3. nacos 支持服务列表变更的消息推送模式,服务列表更新更加及时;
    4. nacos 集群默认采用 AP(高可用),当集群中存在非临时实例的时候,采用 CP(强一致);Eureka 采用 AP;
  • nacos 还支持配置中心,eureka 只支持注册中心,这也是选择使用 nacos 的一个重要原因;

3. 你们项目负载均衡是如何实现的?

(结合实际情况回答)负载均衡用的是 Ribbon,在发起远程调用的时候(RestTemplate 或者 Feign),会使用到 Ribbon 选取服务;

在这里插入图片描述

3.1 Ribbon 负载均衡策略有哪些?

  • RoundRobinRule:简单轮询服务列表来选择服务器;
  • WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小;
  • RandomRule:随机选择一个可用的服务器;
  • BestAvailableRule:忽略那些短路的服务器,并选择并发数较低的服务器;
  • RetryRule:重试机制的选择逻辑;
  • AvailabilityFilteringRule:可用性敏感策略,先过滤非健康的,再选择连接数较小的实例;
  • ZoneAvoidanceRule:以区域可用的服务器为基础进行服务器的选择。使用 Zone 对服务器进行分类,这个 Zone 可以理解为一个机房/机架等。而后再对 Zone 内的多个服务做轮询;

3.2 如果想自定义负载均衡策略如何实现?

  1. 如何配置负载均衡策略:
    1. Bean 注入容器法:全局
    2. 配置文件指定法:局部

在这里插入图片描述

  1. 自己创建类实现 IRule(自定义 IRule 实现 => 自定义负载均衡规则),然后配置一下即可;

4. 什么是服务雪崩?怎么解决这个问题?

在这里插入图片描述

例如图中表示的:

  1. 服务 D 宕机,服务 A 无法建立连接,仍然进行额外的尝试;
  2. 服务 D 宕机,服务 A 建立了连接,消耗了连接池的连接数,阻塞等待服务 D 的响应/心跳检测服务 D 的活性,甚至请求会重传;
  3. 服务 A 很可能撑不住就也故障了,而越往上层的服务调用者,阻塞的时间几何增长,也压根支持不了多少并发量,也会雪崩式的崩溃;

这样服务 D 宕机可能会导致依赖于它的其他服务出现连锁反应式的故障,最终导致整个系统崩溃!

  • 服务故障但是没拒绝或直接响应异常导致的;

服务限流也是不错的处理方法,可以用 nginx,网关,sentinel 限流…

  • 非本章重点,之后会讲;

4.1 服务降级(解决)

服务降级是服务自我保护的一种方式,或者保护下游服务(雪崩下面的服务消费者)的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃;

  • 当访问失败、响应时间过长、资源不足之类的就会触发服务降级;

其做法就是,换另一个服务,也就是一个 Plan B:

  1. 返回“稍后尝试”;
  2. 执行其他的业务…

在这里插入图片描述

一般在实际开发中与 Feign 接口整合,编写降级逻辑:

在这里插入图片描述

4.2 服务熔断(预防)

服务熔断是通过监控对特定服务的调用响应时间和错误率等指标,当达到设定的阈值时,触发的机制,即停止对该服务的调用,并且在一段时间内拒绝对该服务的调用,从而避免故障的扩散。

这里主要说说 Hystrix 熔断机制,用于监控微服务调用情况:

  1. 默认是关闭的,如果需要开启需要在引导类上添加注解:@EnableCircuitBreaker
  2. 启动后,如果检测到 10 秒内请求的失败率超过 50%(这里可以理解为请求走“降级”逻辑的比率),就触发熔断机制;之后每隔5秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求;

在这里插入图片描述

5. 你们微服务是怎么进行监控的?

在这里插入图片描述

为什么需要监控?

  • 服务与服务之间的远程调用链太过于复杂,并且来自各个地方的不同的请求可能会通过网关、服务 A、…、服务 B、使用中间件/使用数据库…
  • 就可能出现以下几个问题:
    1. 问题定位
    2. 性能分析
    3. 服务关系
    4. 服务告警

常见的服务监控工具:

  • 或者说是分布式系统应用程序性能监控工具(APMApplication Performance Management)
  1. SpringBoot-admin
    • 简单,局限性大;
  2. prometheus + Grafana
    • 企业常用,很不错,搭建困难;
  3. zipkin(链路追踪工具)
    • 与业务代码耦合;
  4. skywalking(链路追踪工具)
    • 搭建容易,可以很好地解决刚才提到的问题;

5.1 skywalking

skywalking 是一个分布式系统的 APM 工具,提供了完善的链路追踪能力,是 apache 的顶级项目;

  • 如何搭建可以自己去网上搜,开源的,看看就会;

在这里插入图片描述

监控的对象:

  • 服务(service):业务资源应用系统(微服务);
  • 端点(endpoint):应用系统对外暴露的功能接口;
  • 实例(instance):服务所在的物理机;

5.2 微服务监控

  1. 对服务、端点、物理实例的访问时长与健康程度的监控并排名

在这里插入图片描述

  1. 链路追踪(服务到服务、服务内部的 MySQL 访问等等)

在这里插入图片描述

在这里插入图片描述

可见,也可以用一些APM工具来发现 SQL 慢查询和定位慢查询,例如 skywalking;

  • 还可以用调试工具:Arthas;运维工具:Prometheus;
  1. 服务关系

在这里插入图片描述

  1. 服务告警

在这里插入图片描述

当然,可以设置自己的告警规则,也可以设置发现问题发送短信/邮件给指定负责人的;

5.3 回答

采用的是 skywalking 进行监控:

  • skywalking 主要可以监控接口、服务、物理实例的一些状态。特别是在压测的时候可以看到众多服务中的哪些服务和接口比较慢,例如慢查询之类的,我们可以针对性的分析与优化;
  • 我们还在 skywalking 设置了告警规则,特别是在项目上线后,我们分别给微服务设置了给相关负责人,如果出错,可以给 TA 发送短信/邮件,第一时间知道项目的 bug 情况,并尽可能快的去修复;

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

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

相关文章

vue实现购物车功能

实现功能 CSS部分 <style>.tr {display: flex;}.th {margin: 10px;width: 20%;height: 50%;}.td {display: flex;margin: 10px;width: 20%;height: 100px;align-items: center;}.app-container .banner-box {border-radius: 20px;overflow: hidden;margin-bottom: 10px;}…

docker-swarm集群搭建

目录 一、docker swarm介绍 二、部署docker 三、搭建集群 3.1 工作模式 3.2 将当前主机作为leader 3.3 将第二个节点slave1加入到worker 3.4 将第三个节点slave2也加入到worker 3.5 将第四个节点(slave3)加入到manager 四、总结 一、docker swarm介绍 Docker Swarm…

CSS顶部与JS后写:网页渲染的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

动态规划(算法竞赛、蓝桥杯)--数位DP度的数量

1、B站视频链接&#xff1a;E38 数位DP 度的数量_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N34; int a[N];//把B进制数的每一位抠出存入数组 int f[N][N];//f[i][j]表示在i个位置上&#xff0c;放置j个1的组合数 int K,B;void init(…

11.Node.js入门

一.什么是 Node.js Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端的应用程序 Node.js 作用除了编写后端应用程序&#xff0c;也可以对前端代码进行压缩&#xff0c;转译&#xff0c;…

Java 数据结构之链表

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA null || headB null) return null;ListNode pA headA, pB headB;while (pA ! pB) {pA pA null ? headB : pA.next;pB pB null ? headA : pB.next;}return pA;} public ListNode rev…

2024.3.6每日一题

LeetCode 找出数组中的 K -or 值 题目链接&#xff1a;2917. 找出数组中的 K-or 值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&…

【开源】SpringBoot框架开发教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

遗传算法GA求解机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

一、原理介绍 遗传算法是一种基于生物进化原理的优化算法&#xff0c;常用于求解复杂问题。在机器人栅格地图最短路径规划中&#xff0c;遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤&#xff1a; 1. 初始化种群&#xff1a;随机生成一组初始解&…

先进电机技术 —— 高速电机与低速电机

一、背景 高速电机是指转速远高于一般电机的电动机&#xff0c;通常其转速在每分钟几千转至上万转甚至几十万转以上。这类电机具有功率密度高、响应速度快、输出扭矩大等特点&#xff0c;在航空航天、精密仪器、机器人、电动汽车、高端装备制造等领域有着广泛的应用。 高速电…

【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载

【Pytorch】新手入门&#xff1a;基于sklearn实现鸢尾花数据集的加载 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

学习和认知的四个阶段,以及学习方法分享

本文分享学习的四个不同的阶段&#xff0c;以及分享个人的一些学习方法。 一、学习认知的四个阶段 我们在学习的过程中&#xff0c;总会经历这几个阶段&#xff1a; 第一阶段&#xff1a;不知道自己不知道&#xff1b; 第二阶段&#xff1a;知道自己不知道&#xff1b; 第三…

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置FILE: /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php  LINE: 110 TRACE#0 /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php(…

【REST2SQL】11 基于jwt-go生成token与验证

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

论文阅读:Iterative Denoiser and Noise Estimator for Self-Supervised Image Denoising

这篇论文是发表在 2023 ICCV 上的一篇工作&#xff0c;主要介绍利用自监督学习进行降噪的。 Abstract 随着深度学习工具的兴起&#xff0c;越来越多的图像降噪模型对降噪的效果变得更好。然而&#xff0c;这种效果的巨大进步都严重依赖大量的高质量的数据对&#xff0c;这种对…

在 Python 中 JSON 数据格式的使用

在 Python 中 JSON 数据格式的使用 JSON 简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它易于阅读和编写&#xff0c;并且与许多编程语言兼容。 Python 中的 JSON 模块 Python 标准库中包含一个 json 模块&#xff0c;用于处理…

【嵌入式——QT】MDI应用程序设计

MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口&#xff0c;这些MDI子窗口在主窗口里显示&#xff0c;并享受主窗口上的工具栏和菜单等操作功能&#xff0c;主窗口上的操作都针对当前活动的MDI子窗口进行。 图示 代码示例 QWMainWindow.h #ifndef QWMAINWINDOW_H …

静态路由--添加路由表,实现非直连网段的通信

建立拓扑&#xff1a; 路由器**只有直连网段的路由表,而对非直连并不拥有,因此要在路由器的路由表中手动添加非直连网段的路由. ** 也就是说对于AR2来说&#xff0c;**网段192.168.10.0**和**网段192.168.40.0**是他的直连网段。进一步说这两个网端的设备可以相互通信而网段19…

flink 总结

flink 流式api checkpoint state 状态分类 Managed State 和 Raw State Managed State Flink 自己管理&#xff0c;支持多种数据结构 Raw State 用户自己管理&#xff0c; 只支持byte Managed Staste 分为 Keyed State 和 operator State Managed State 只能在Keyed Str…

浅谈Redis和分布式系统

浅谈Redis Redis用于存储数据&#xff0c;且在内存当中进行存储。 但是在日常编写代码中&#xff0c;定义一个变量也就属于在内存当中存储一个数据。 Redis主要会在分布式系统当中发挥重要作用&#xff0c;如果只是单机程序&#xff0c;直接通过变量存储数据的方式会比使用Re…