Go微服务实战——服务治理(负载均衡,请求重试,服务熔断,服务降级)

负载均衡

在微服务架构中各个服务都是独立部署、可独立扩展和管理的。在上一节Go微服务实战——服务的注册与获取(nacos做服务注册中心)将所有的服务注册到注册中心,供其他服务使用。

这是对于整个系统的层面,对于单个服务来说,又有不同的实例,例如一个服务存在多个集群,同一服务被部署在不同集群的不同主机上,那么这个服务就是不同的实例,在服务调用阶段,一般获取一个健康的实例地址,发送请求,但是这个健康的请求并不确定其是否繁忙。

也就是同一服务的所有实例都是健康的,各个实例的访问量无法控制,可能A服务下,a,b,c三个实例都是健康的,但是服务中心都将请求转发给了a实例,导致a实例所在的主机CPU使用量暴涨从而卡顿缓慢,但是此时b,c却没有请求。

因此负载均衡就是为了解决资源分配不均的问题。

微服务的负载均衡通常不是直接在注册中心实现的,而是通过注册中心提供的服务发现功能来支持。注册中心主要用于服务发现,负载均衡是在服务消费者端实现的。

服务消费者从注册中心获取可用的服务实例列表,并根据一定的负载均衡策略选择合适的实例来发送请求。因此,负载均衡的实现主要是服务消费者的责任,服务消费者需要根据自身的需求选择合适的负载均衡算法,并在本地实现请求的分发。

CloudWego框架中实现负载均衡的方式衣蛾十分简单cloudwego负载均衡在创建客户端通过传入配置项类启动。

// 使用的是基于权重的轮询策略,也是 Kitex 的默认策略
cli, err := echo.NewClient("echo", client.WithLoadBalancer(loadbalance.NewWeightedRoundRobinBalancer()))

cli, err := echo.NewClient("echo", client.WithLoadBalancer(loadbalance.NewInterleavedWeightedRoundRobinBalancer()))
cli, err := echo.NewClient("echo", client.WithLoadBalancer(loadbalance.NewWeightedRandomBalancer()))

官网服务负载均衡策略

服务的负载均衡策略小编也不懂啊,有大佬麻烦再评论区讲讲。

请求重试

微服务请求重试是指在发起对某个微服务的请求时,如果请求失败或者未收到预期的响应,系统会自动尝试再次发送该请求,以期望在一定的重试次数内获得成功的响应。这个过程是自动化的,由系统自身负责执行。

请求重试的目的是增加系统的健壮性和可靠性。在分布式系统中,由于网络不稳定、服务不可用或者服务响应超时等原因,请求可能会失败。通过重试机制,系统可以容忍一定程度的失败,以减少因为瞬时故障导致的系统不可用或者请求失败的情况。

在重试阶段也会有一定的重试策略,通过配置,系统自动选择重试策略并执行重试任务。

在CloudWeGo中主要有服务异常导致的服务重试和网络波动导致的服务重试。相应的策略都在github.com/cloudwego/kitex/pkg/retry包下。

  • 异常重试retry.NewFailurePolicy()
fp.WithMaxRetryTimes(3) // 配置最多重试3次
xxxCli := xxxservice.NewClient("destServiceName", client.WithFailureRetry(fp))
  • retry.NewBackupPolicy()
bp := retry.NewBackupPolicy(xxx)
xxxCli := xxxservice.NewClient(targetService, client.WithBackupRequest(bp))

cloudwego服务请求重试

服务熔断

微服务的服务熔断是一种用于提高系统稳定性和防止服务雪崩效应的机制。服务熔断是指在发现服务故障或异常情况时,临时停止向故障服务发送请求,并在一段时间内拒绝新的请求,以减轻服务间的压力,同时允许故障服务有时间恢复正常状态。

服务熔断的目的是避免由于服务间的故障或不可用状态导致整个系统不可用的情况。当一个微服务的调用失败次数超过一定阈值时,系统会触发服务熔断,将该服务切换为熔断状态。在熔断状态下,系统会拒绝对该服务的请求,并在一段时间内不再发送请求到该服务上。

  • 熔断器状态(Circuit Breaker State): 熔断器可以处于关闭状态、打开状态或者半开状态。初始情况下,熔断器处于关闭状态,允许请求通过;当达到一定的失败阈值后,熔断器会切换到打开状态,拒绝请求;在一段时间后,熔断器可能会尝试进入半开状态,允许部分请求通过,以检测服务是否已经恢复正常。

  • 熔断阈值(Circuit Breaker Threshold): 系统需要定义触发服务熔断的阈值,通常是一定的失败次数或错误率。当请求失败次数达到或超过熔断阈值时,熔断器会切换到打开状态。

  • 熔断时间窗口(Circuit Breaker Time Window): 在熔断状态下,熔断器会保持一段时间,称为熔断时间窗口。在这段时间内,系统会拒绝对故障服务的请求,以减轻服务的负载。熔断时间窗口结束后,系统可能会尝试将熔断器切换到半开状态,以检测服务是否已经恢复。

通过服务熔断机制,系统可以在故障发生时快速响应,避免因为故障服务的连锁效应导致整个系统不可用。服务熔断通常与请求重试、限流、监控和报警等机制配合使用,以实现系统的高可用性和稳定性。

小编从GPT学来的哈

熔断处理也是在服务消费者端哈

在这里插入图片描述

在CloudWeGo中有一整套的视线方式:

  • 熔断策略

在这里插入图片描述

  • 触发策略
    在这里插入图片描述
  • 冷却策略

在这里插入图片描述

  • 半打开时策略

在这里插入图片描述

大多数服务熔断都是基于配置实现,熔断出发,恢复都是有系统完成,一般亲情况下需要配置的有:

  1. 熔断策略
  2. 触发熔断阈值
  3. 熔断保护时间

参考大佬的文章,感谢大佬 😮[ Kitex 源码解读 ] 熔断机制是如何实现的

服务降级

在这里插入图片描述
一般情况下服务降级策略不是关闭系统或者主机的某些功能而是直接返回缓存数据或者MOCK数据。

如果服务在请求重试和熔断后均没有恢复,那么就服务降级,返回一些缓存或静态数据。

服务降级也是服务一般也是消费者端完成的哈

var opts []client.Option
opts = append(opts, client.WithFallback(yourFallbackPolicy))

xxxCli := xxxservice.NewClient("target_service", opts...)

服务熔断

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

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

相关文章

Linux:运营商在网络中扮演的角色

文章目录 ip目前的问题ip目前的几种解决方案私有ipVS公有ip运营商再谈ip划分运营商的角度看ip 本篇总结的是运营商在网络中扮演的角色 ip目前的问题 在目前看来,ip最大的问题是ip号不够用了,那这个问题如何解决呢? 在之前的内容中有子网掩…

什么是智慧公厕?智慧旅游下的智慧公厕功能和特点

智慧旅游下的智慧公厕功能和特点?智慧旅游是景区、公园、游乐场、文化场馆等领域的一种信息化解决方案,智慧公厕是智慧旅游极为重要的一部分,能大大提升游客满意度。智慧公厕采用物联网、互联网、大数据、云计算等技术,实现旅游景…

RPM与YUM

目录 rpm包的管理 介绍 rpm包的简单查询指令 rpm包名基本格式 rpm包的其他查询指令: 卸载rpm包 yum 介绍 rpm包的管理 介绍 rpm用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中.它生成具有.RPM扩展名的文件.RPM是RedHat Package Manager(RedHat)软件包管…

SDWebImage源码解析---疑难问题解答

SDWebImage的简单流程图: 上图大致流程是对的,有几个没写到的地方: 加载沙盒中对应的图片后,不仅要显示,而且要把图片缓存到内存中下载完毕后,有一个异步解码的过程,没体现出来 网上有大佬做了…

修改nuxtjs项目中的浏览器图标步骤

处理步骤: 打开配置页面 使用el-upload 上传图片到后台 后台把图片转为ico,返回图标路径 配置页面修改本页面预览图,点击保存,修改的数据库。 通知nuxt布局页面,修改head节点中的图标属性,…

智慧酒店(二):AI智能分析网关V4视频分析技术在酒店管理中的应用

一、人工智能技术如何应用在酒店管理中? 随着科技的飞速发展,人工智能技术已经逐渐渗透到我们生活的方方面面,其中,酒店管理行业便是其应用的重要领域之一。人工智能技术以其高效、精准的特点,为酒店管理带来了革命性…

基于java的智能停车场管理系统

开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…

文件管理原理

文章目录 1)一个文件,它是文件内容和文件属性的集合 文件文件属性文件内容 文件属性 文件内容 2)文件分为打开的文件和未打开的文件 3)打开的文件是谁打开的? 由进程打开!而研究一个被打开的进程本质就是研究进程和文件的关系。 而被打开的…

vue快速入门(二)安装vue调试插件

教程很详细,直接上过程 上一篇 新增内容 在国内网站下载谷歌插件安装插件 点击跳转极简插件 此处我们以Chrome浏览器为例 到这里我们就成功安装了插件 使用上一篇博客的代码在浏览器F12调试一下 这样就可以使用了!!!

依赖倒转原则

1.1 MM请求电脑 MM电脑坏了,需要修电脑,是因为每次打开QQ,一玩游戏,机器就死了。出来蓝底白字的一堆莫名奇妙的英文。蓝屏死机了,估计内存有问题。 1.2 电话遥控修电脑 遥控修理电脑,打开内存条,两根内存…

Python学习从0到1 day20 第二阶段 面向对象 ② 封装

缘分 朝生暮死犹如露水 —— 24.4.1 学习目标: 1.理解封装的概念 2.掌握私有成员的使用 一、面向对象三大特性: 面向对象编程,是许多编程语言都支持的一种编程思想 简单理解是:基于模板(类)去创建实体&…

免费分享一套SpringBoot+Vue健身房管理系统,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue健身房管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue健身房管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue健身房管理系统 Java毕业设计项目来自互联…

【SQL Server】2. 将数据导入导出到Excel表格当中

最开始,博主介绍一下自己的环境:SQL Sever 2008 R2 SQL Sever 大致都差不多 1. 通过自带软件的方式 首先找到下载SQL Sever中提供的导入导出工具 如果开始界面没有找到自己下载的路径 C:\Program Files\Microsoft SQL Server\100\DTS\Binn下的DTSWiz…

题目:小明的背包5(蓝桥OJ 1178)

问题描述&#xff1a; 解题思路&#xff1a; 分组背包模板题&#xff0c;与优化01背包的不同之处在于第一维不可省略&#xff0c;要写s循环。注意要初始化 #include <bits/stdc.h> using namespace std; const int N 1e3 9; int dp[N][N]; // 分组背包模板&#xff0c;…

正则表达式浅析

正则表达式&#xff0c;又称正规表示法、常规表示法&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很…

【详细教程制作】用户列表

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

什么是工业协议转换软件?

在现代工业自动化领域&#xff0c;随着技术的不断革新和智能化水平的提升&#xff0c;各种工业设备和系统之间的通信变得日益重要。然而&#xff0c;由于历史、技术差异和标准多样化等原因&#xff0c;不同的工业设备和系统往往采用各自独特的通信协议&#xff0c;导致它们之间…

短视频素材哪里找?6个短视频素材下载推荐

哈喽&#xff01;短视频制作的小艺术家们&#xff0c;是不是时常在探寻短视频素材哪里找的秘密&#xff1f;放下你的疑惑吧&#xff0c;我来带你揭开6个藏宝图&#xff0c;领你进入短视频素材的奇妙世界&#xff0c;让你的作品在抖音、快手等平台上大放异彩&#xff01; 蛙学网…

经典文献阅读之--als_ros(移动机器人的可靠蒙特卡罗定位)

0. 简介 在本文中&#xff0c;我们关注移动机器人定位的可靠性问题。蒙特卡罗定位&#xff08;MCL&#xff09;广泛用于移动机器人的定位。然而&#xff0c;由于缺乏判定MCL估计可靠性的方法&#xff0c;其安全性仍难以保证。本文提出了一种新型定位框架&#xff0c;能够同时实…

springcloud基本使用二(远程调用)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…