Go微服务架构实战 中篇:6. 微服务治理策略

Go微服务实战 - 用户服务开发(gRPC+Protocol Buffer) 用户服务基本是每个互联网产品里必备的一个服务了,因为没有用户基本是什么也干不了。本文主要介绍下如何开发一个用户微服务,以及他的详细开发流程。以上命令都是一步一步执行的,为了方便期间,这里也提供了一件部署脚本,执行如下。到此,开发、测试、部署已经操作完了,后面会继续完善链路追踪和监控相关的部分。这里详细的记录了开发的步骤,方便参看本项目的同学知道其实现过程。后面就可以在这里补充具体的业务逻辑处理了。6、在生成的server中编写业务逻辑。5、注册服务到gRPC Server。1、生成proto模板文件。 阅读详情

Go微服务架构实战-【公粽号:堆栈future】

Go微服务架构实战目录

1. 微服务架构上篇

1. grpc技术介绍

2. grpc+protobuf+网关实战

3. etcd技术介绍

4. 基于etcd的服务发现与注册

5. 基于etcd的分布式锁实战

2. 微服务架构中篇

1. k8s架构介绍

2. 基于k8s的容器化部署

3. 基于k8s的Deployment工作负载

4. 基于k8s的ingress实战

5. 基于ingress和service实现灰度发布

6. 常见的服务治理策略

干货:


服务容错: 故障转移/快速失败/故障恢复等

流量控制:滑动时间窗口/令牌桶/分布式限流等


1. 服务容错

通过一张图一目了然:图片

容错设计模式:

1. 断路器模式

断路器的基本思路是很简单的,就是通过代理(断路器对象)来一对一地(一个远程服务对应一个断路器对象)接管服务调用者的远程请求。断路器会持续监控并统计服务返回的成功、失败、超时、拒绝等各种结果,当出现故障(失败、超时、拒绝)的次数达到断路器的阈值时,它状态就自动变为“OPEN”,后续此断路器代理的远程访问都将直接返回调用失败,而不会发出真正的远程服务请求。通过断路器对远程服务的熔断,避免因持续的失败或拒绝而消耗资源,因持续的超时而堆积请求,最终的目的就是避免雪崩效应的出现。由此可见,断路器本质是一种快速失败策略的实现方式,它的工作过程可以通过下面图来表示:图片

从调用序列来看,断路器就是一种有限状态机,断路器模式就是根据自身状态变化自动调整代理请求策略的过程。一般要设置以下三种断路器的状态:

  • CLOSED:表示断路器关闭,此时的远程请求会真正发送给服务提供者。断路器刚刚建立时默认处于这种状态,此后将持续监视远程请求的数量和执行结果,决定是否要进入 OPEN 状态。

  • OPEN:表示断路器开启,此时不会进行远程请求,直接给服务调用者返回调用失败的信息,以实现快速失败策略。

  • HALF OPEN:这是一种中间状态。断路器必须带有自动的故障恢复能力,当进入 OPEN 状态一段时间以后,将“自动”(一般是由下一次请求而不是计时器触发的,所以这里自动带引号)切换到 HALF OPEN 状态。该状态下,会放行一次远程调用,然后根据这次调用的结果成功与否,转换为 CLOSED 或者 OPEN 状态,以实现断路器的弹性恢复。

这些状态的转换逻辑与条件如下图所示:图片

OPEN 和 CLOSED 状态的含义是十分清晰的,与我们日常生活中电路的断路器并没有什么差别,值得讨论的是这两者的转换条件是什么?最简单直接的方案是只要遇到一次调用失败,那就默认以后所有的调用都会接着失败,断路器直接进入 OPEN 状态,但这样做的效果是很差的,虽然避免了故障扩散和请求堆积,却使得外部看来系统将表现极其不稳定。现实中,比较可行的办法是在以下两个条件同时满足时,断路器状态转变为 OPEN:

  • 一段时间(譬如 10 秒以内)内请求数量达到一定阈值(譬如 20 个请求)。这个条件的意思是如果请求本身就很少,那就用不着断路器介入。

  • 一段时间(譬如 10 秒以内)内请求的故障率(发生失败、超时、拒绝的统计比例)到达一定阈值(譬如 50%)。这个条件的意思是如果请求本身都能正确返回,也用不着断路器介入。

以上两个条件同时满足时,断路器就会转变为 OPEN 状态。

断路器做的事情是自动进行服务熔断,这是一种快速失败的容错策略的实现方法,也是一种典型的服务降级策略。举个例子:你女朋友被前男友约出去了,你打她手机没人接,你气冲冲地的挂断后(快速失败),然后你有打了另外三个你女朋友闺蜜的手机号(故障转移),都还是没能找到你女朋友(重试超过阈值)。这时候你非常生气地在微信上给她留言“三分钟不回电话就分手”,以此来与你取得联系。原谅我这么举例,虽然不太吉利,但是你给你女朋友留言这个行为便是服务降级逻辑。

其他服务治理的工具,譬如Envoy、istio等也同样会包含有类似的设置。

2. 重试模式

重试模式适合解决系统中的瞬时故障,简单的说就是有可能自己恢复(Resilient,称为自愈,也叫做回弹性)的临时性失灵,网络抖动、服务的临时过载(典型的如返回了 503 Bad Gateway 错误)这些都属于瞬时故障。重试模式实现并不困难,即使完全不考虑框架的支持,靠程序员自己编写十几行代码也能够完成。在实践中,重试模式面临的风险反而大多来源于太过简单而导致的滥用。我们判断是否应该且是否能够对一个服务进行重试时,应同时满足以下几个前提条件:

  • 仅在主路逻辑的关键服务上进行同步的重试,不是关键的服务,一般不把重试作为首选容错方案,尤其不该进行同步重试。

  • 仅对具备幂等性的服务进行重试。

  • 重试必须有明确的终止条件,常用的终止条件有两种:

  1. 超时终止

  2. 次数终止

由于重试模式可以在网络链路的多个环节中去实现,比如客户端发起调用时自动重试,网关中自动重试、负载均衡器中自动重试,等等,而且现在的微服务框架都足够便捷,只需设置一两个开关参数就可以开启对某个服务甚至全部服务的重试机制。

2. 流量控制

与容错模式类似,对于如何进行限流,也有一些常见的设计模式可以参考使用,本节将介绍滑动时间窗、令牌桶以及分布式限流三种限流设计模式。

1. 滑动时间窗口

有一个滑动时间窗口算法,在计算机科学的很多领域中都有成功的应用,比如著名的TCP协议的流量控制等都是使用这个算法实现流控的。具体实现大概可以想象下就是在不断向前流淌的时间轴上,漂浮着一个固定大小的窗口,窗口与时间一起平滑地向前滚动。任何时刻静态地通过窗口内观察到的信息,都等价于一段长度与窗口大小相等、动态流动中时间片段的信息。由于窗口观察的目标都是时间轴,所以它被称为形象地称为“滑动时间窗模式”。

滑动时间窗口模式可以保证任意时间片段内,只需经过简单的调用计数比较,就能控制住请求次数一定不会超过限流的阈值,在单机限流或者分布式服务单点网关中的限流中很常用。不过,这种限流也有其缺点,它通常只适用于否决式限流,超过阈值的流量就必须强制失败或降级,很难进行阻塞等待处理,也就很难在细粒度上对流量曲线进行整形,起不到削峰填谷的作用。

2. 令牌桶

假设我们要限制系统在 X 秒内最大请求次数不超过 Y,那就每间隔 X/Y 时间就往桶中放一个令牌,当有请求进来时,首先要从桶中取得一个准入的令牌,然后才能进入系统处理。任何时候,一旦请求进入桶中却发现没有令牌可取了,就应该马上失败或进入服务降级逻辑。与此同时令牌桶也有最大容量限制,这意味着当系统比较空闲时,桶中令牌累积到一定程度就不再无限增加,预存在桶中的令牌便是请求最大缓冲的余量。上面这段话,可以转化为以下步骤:

  • 让系统以一个由限流目标决定的速率向桶中注入令牌,比如要控制系统的访问不超过 100 次,速率即设定为 1/100=10 毫秒。

  • 桶中最多可以存放 N 个令牌,N 的具体数量是由超时时间和服务处理能力共同决定的。如果桶已满,第 N+1 个进入的令牌会被丢弃掉。

  • 请求到时先从桶中取走 1 个令牌,如果桶已空就进入降级逻辑。

桶:bucket 速率:rate

令牌桶模式的实现看似比较复杂,每间隔固定时间就要放新的令牌到桶中,但其实并不需要真的用一个专用线程或者定时器来做这件事情,只要在令牌中增加一个时间戳记录,每次获取令牌前,比较一下时间戳与当前时间,就可以轻易计算出这段时间需要放多少令牌进去,然后一次性放入即可,所以真正编码并不会显得很复杂。

3. 分布式限流

一种常见的简单分布式限流方法是将所有服务的统计结果都存入集中式缓存(如 Redis)中,以实现在集群内的共享,并通过分布式锁、信号量等机制,解决这些数据的读写访问时并发控制的问题。在可以共享统计数据的前提下,原本用于单机的限流模式理论上也是可以应用于分布式环境中的,可是其代价也显而易见:每次服务调用都必须要额外增加一次网络开销,所以这种方法的效率肯定是不高的,流量压力大时,限流本身反倒会显著降低系统的处理能力。

anyway,出现问题解决它就好了,但是你不能因为它一两个缺点就不用,我觉得这不是一个程序员良好的做事风格,能扛事的人一般都是能成大事的人。

3. 小结

服务治理的话题随便拿出一个来研究就能让你增长不少见识,所以说大家下去有时间可以专门研究下相关的服务或者产品,比如我们提到的envoy以及istio等,看下它们是如何做到全部或者部分治理的,博采众长,才能脱胎换骨,加油。

公粽号:堆栈future

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

微服务架构下的服务治理实现方案详解 服务治理,简而言之,就是对微服务架构中的服务进行有效管理的过程,包括服务的注册与发现、配置管理、负载均衡、健康检查、服务路由、熔断与降级等。其核心目标是提升系统的可维护性、可用性和扩展性。Apache Zookeeper是一个分布式协调服务,最初是Hadoop项目的一个子项目,后独立发展。它提供了一套分布式服务的协调机制,如命名服务、配置管理、分布式锁等,常被用作微服务架构中的服务发现与配置中心。 阅读详情

相关推荐

Go语言微服务开发框架实践--go chassis(上篇)

Go chassis是一个go语言微服务开发框架 通过这篇文章中,我将从设计思路到源码剖析来深度分析Go Chassis。并且介绍自己在实践过程中的go语言性能调优和最佳实践,最后将使用go chassis编写一个http服务,此为上篇,将主要介绍go chassis的运行机制 项目地址:https://github.com/go-chassis/go-chassis/ 为什么我们要用go语...

github_33929692的博客 7692

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

微服务之负载均衡,请求重试,服务熔断,服务降级

个人学习笔记库,一篇一篇记录成长的足迹 1869

jupiter:木星是斗鱼开源的面向服务治理的Golang微服务框架

JUPITER:面向治理的微服务框架 介绍 JUPITER是一个面向治理的微服务框架,在已有多年使用。 文献资料 有关,请参见。 快速开始 func main () { var app jupiter. Application app . Startup () app . Serve ( startHTTPServer ()) app . Serve ( startGRPCServer ()) app . Schedule ( startWorker ()) app . Run () } func startHTTPServer () server. Server { serve

golang微服务开发与治理

张晓明 :深知科技曾就职于中科院计算所,阿里巴巴,闪电购等企业,目前就职于深知科技,担任技术架构师职务。从事过c/c++.java,golang开发,目前专心golan前...

Go中国 1万+

Go-qsf是基于GRPC生态圈打造的一个简单易用功能强大的服务治理框架

qsf是基于GRPC生态圈打造的一个简单、易用、功能强大的服务治理框架

golang下微服务框架示例

go-micro结合iris使用提供微服务框架,编译出来会有两个进程(gateway_app和appmeta),分别部署运行

复制下来就能跑: go语言微服务快速入门-基于grpc和nacos

Agenda: 本文主要介绍了如下内容: 1)微服务的必要性解释 2)举例子说明大概怎么做服务的切分 3)服务注册和服务发现的详细流程 4)基于gRpc与Nacos的详细可执行代码

xingxuechao的专栏 2208

内存|内存的概念、内存的作用、内存的物理结构及内存使用

内存是硬件,是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。内存是与CPU沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大。本文简单介绍了内存的概念、作用、物理结构以及使用,内存远不止如此,后续文章会逐步深入讲解。

qq_59938293的博客 2万+

Go 微服务治理:先把超时、重试和限流写明白

Go 微服务治理从超时、取消、重试、幂等、限流和降级开始。工具可以后上,边界必须先写。能把失败控制住,服务才算真正可治理。不管用不用服务网格,每个服务的代码里都应该回答那三个问题:等多久、怎么重试、打不过来怎么办。

好代码自己会说话,烂代码才需要注释来圆谎 3566

现场总线课程设计-基于modbus协议使用QT实现主从站控制通信

【平台:QT】 【协议:modbus(注:由于要求,需要自己来实现modbus库,而非直接调用已有的库)】 【由于复制粘贴,时间原因可能格式有误,如需要具体工程文件以及报告文件请私信博主】 1、 大作业任务: (1)使用附件中工具软件体验MODBUS主从站数据传输过程(可在主从站模拟工具里面观察各功能码对应数据帧内容并对其进行分析) (2)使用串口调试助手,手工发出MODBUS主、从站该发出的数据,并观察对方发出的数据 (3)实现MODBUS主、从站功能,描述实现过程(语言不限于使用VC

weixin_44469597的博客 4065

别再乱用标签了!深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响

本文深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响,包括标签组合查询、Pack Together by Label打包策略及运行时性能优化。通过实战代码示例和性能数据对比,帮助开发者实现精细化资源加载控制与包体优化,提升项目效率。

weixin_30500105的博客 508

Go语言与微服务架构:服务通信与治理实践

通过分析gRPC、HTTP RESTful、消息队列等主流通信协议在Go语言中的实现方式,结合服务发现、断路器、负载均衡等服务治理模式,阐述如何利用Go语言构建高效、可靠、可扩展的微服务系统。Go语言凭借其高效的并发性能、简洁的语法以及丰富的生态支持,成为构建微服务架构的理想语言。Go语言凭借其强大的性能和丰富的生态,为微服务架构的构建提供了高效的解决方案。通过合理选择服务通信协议,应用服务治理模式,并针对性能、安全和运维等方面进行优化,开发者能够利用Go语言构建出高效、可靠、可扩展的微服务系统。

2501_91651758的博客 812

静态随机存储器(SRAM)

静态随机存储器(SRAM)是一种广泛用于计算机系统和嵌入式设备中的高速随机访问存储器。与动态随机存储器(DRAM)不同,SRAM 不需要定期刷新,因此可以实现更快的访问时间和更低的功耗。SRAM通常用于缓存、高速缓冲器和存储器应用程序中,其中性能和可靠性至关重要。

JAZJD的博客 8148

Go微服务架构实战[完整]

Go微服务架构实战本系列文章主要是针对云原生领域微服务架构的实战,包括网关,k8s,etcd以及grpc等相关技术的应用,同时也会把服务发现与注册,熔断,降级,限流以及分布式锁等加入到系列当中作为补充,课程的最后也会安排分布式链路追踪框架的学习,监控平台的搭建以及灰度发布等技术服务,所以总体来讲,课程范围涉及技术领域较广,知识面比较宽,大家下来各取所需尽量做到熟悉和应用,之后有时间了在研究下源码,乐哉!1. 微服务架构上篇1. grpc技术介绍2. grpc+protobuf+网关实战3. etcd技术介绍

stackfuture的博客 2227

基于RK3588与FPGA的SDI视频处理系统:从MIPI CSI-2输入到DSI输出的全链路解析

本文深入解析了基于RK3588与FPGA的SDI视频处理系统全链路。系统利用FPGA作为高速接口转换与流管理核心,将SDI信号转换为MIPI CSI-2数据流送入RK3588进行智能图像处理与AI分析,处理结果再通过MIPI DSI回传,最终由FPGA控制编码为SDI输出,实现了专业视频接口与强大算力的高效协同。

s1t2u3的博客 666

uniapp 使用摄像头 live-pusher (APP)

uniapp 中开发 app 时使用live-pusher踩过的坑

随身笔记 1万+

微服务架构的技术债治理:识别、评估与渐进式偿还实战指南

摘要: 微服务架构在提升业务敏捷性的同时,也因技术债积累引发系统性风险。本文提出四维扫描法(代码、架构、流程、组织)识别技术债,并通过量化评估模型(价值vs成本)确定优先级。偿还策略强调日常化实践(如固定偿还窗口、童子军规则)与专项攻坚结合,辅以组织保障(可视化看板、晋升激励、架构委员会)。案例显示,某电商通过持续治理将测试覆盖率从25%提升至82%。核心结论:技术债治理是架构可持续性的关键,需通过系统化方法将偿还融入开发全流程,避免债务恶化。(149字)

qq_43414012的博客 2063

2025_NIPS_Truthful Aggregation of LLMs with an Application to Online Advertising

大型语言模型(LLMs)生成内容的 revenue 变现是在线广告的下一个前沿领域。我们考虑这样一种场景:广告商旨在影响LLM的回复,而平台则寻求最大化广告商价值并确保用户满意度。核心挑战在于,广告商的偏好通常与用户偏好存在冲突,且广告商可能误报其偏好。为解决这一问题,我们提出MOSAIC——一种拍卖机制,它确保真实申报是广告商的占优策略,并使每个广告商的效用与其对社会福利的贡献保持一致。重要的是,该机制无需LLM微调或访问模型权重,且随着计算资源的增加,可证明收敛到最优微调LLM的输出。

c_cpp_csharp的专栏 80

Go 服务治理实战:从超时、重试到熔断的闭环设计

participant Client as 上游服务participant Guard as 治理层participant Down as 下游服务participant Metrics as 指标系统Client->>Guard: 发起请求Guard->>Guard: 检查超时预算Guard->>Down: 第一次调用Down-->>Guard: 超时或 5xxGuard->>Metrics: 记录失败Guard->>Guard: 判断是否允许重试。

好代码自己会说话,烂代码才需要注释来圆谎 5697

从零开始学习PX4源码9(部署px4源码到gitee)

由于PX4-Autopilot托管在github,在没有翻墙的情况下,下载固件无法下载。为了提高下载速度,这里将PX4在github上的仓库以及其子仓库(依赖仓库)都搬移到gitee上了。本教程讲解如何快速部署px4固件到gitee上,实现不需要翻墙快速本地就可以下载PX4固件。暂时没有找到如何批量直接通过修改.gitmodules后,使用什么命令可以直接把所有的一级二级子模块的指向直接正常映射。!!

陌城烟雨 810

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Go微服务治理实战经验:从单体到分布式的架构演进

Go微服务治理是从单体架构向分布式架构转型的系统工程。Go语言凭借高并发、高性能、部署简单的特性,成为微服务转型的优选技术栈。服务拆分是核心。合理的服务边界(基于DDD的限界上下文)是微服务成功的基石。避免"分布式单体"(服务间高度耦合)。服务治理是保障。服务发现、负载均衡、熔断降级、限流重试,是保障微服务系统高可用的关键能力。Go生态(如Consul、gRPC、gobreaker)提供了丰富工具。可观测性是刚需。链路追踪、日志聚合、指标监控,是微服务排障、性能优化的基础。

好代码自己会说话,烂代码才需要注释来圆谎 2119

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Go语言微服务架构中如何实现服务治理和熔断降级?

而熔断降级则是在服务调用链路中,当某个服务出现故障或响应超时时,为了保证整个系统的稳定性和可用性,主动中断对该服务的调用,并降级处理请求。在Go语言实现的微服务架构中,通过合理的服务治理策略和熔断降级机制,可以确保系统的稳定性和可用性。在Go语言实现的微服务架构中,通过合理的策略和技术手段,我们可以实现高效、稳定、可靠的服务治理和熔断降级功能,为企业的业务发展提供有力的技术支撑。当服务的错误率达到一定阈值时,可以认为该服务存在严重问题,此时可以启动熔断机制,中断对该服务的调用。来自:yxdzy.cn。

ElvaRaleign的博客 829

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Go语言的微服务治理与Istio

1.背景介绍 Go语言的微服务治理与Istio 微服务架构已经成为现代软件开发的主流方式之一,它将单个应用程序拆分为多个小型服务,每个服务都独立部署和扩展。微服务架构的优势在于它可以提高系统的可扩展性、可维护性和可靠性。然而,随着微服务数量的增加,管理和治理这些微服务变得越来越复杂。这就是Istio的诞生所在。 Istio是一个开源的服务网格,它可以帮助管理和治理微服务架构。Istio使用G...

AI天才研究院 1314

Go 微服务治理趋势:服务网格、eBPF 与零信任架构的技术方向判断

服务网格(Sidecar → Ambient):减少应用代码中的治理负担,但保持着节点级的代理开销eBPF:在内核态获取观测数据,适合性能敏感和深度排障场景。目前是服务网格的补充,尚未完全替代零信任:治理逻辑从"基于网络位置"转为"基于身份和权限",这是安全架构的根本性转变服务网格处理 L4-L7 流量管理eBPF 提供内核级可观测性和安全策略零信任定义认证和授权框架。

qq_34803115的博客 4634

Go语言微服务架构中如何实现服务治理

在微服务架构中,服务治理是一个至关重要的环节,它涵盖了服务的注册与发现、负载均衡、熔断降级、流量控制等多个方面。然后,服务消费者通过Consul获取服务提供者的地址列表,并根据一定的策略选择合适的服务实例进行调用。常见的监控系统有Prometheus、Grafana等,它们可以收集服务的性能指标、调用链数据等,并提供可视化的监控界面。在微服务架构中,各个服务实例动态地注册到注册中心,并在需要时从注册中心获取其他服务实例的地址信息。通过限制服务的请求流量,可以防止服务因过载而崩溃,保证服务的稳定性和可用性。

ElvaRaleign的博客 671

Golang实战技巧:彻底解决Protobuf文件重复注册的6种策略

本文深入剖析了Golang项目中因Protobuf文件重复注册导致panic的根本原因,并提供了六种从根治到应急的解决策略。重点推荐通过集中管理统一生成或利用唯一的go_package进行隔离,从项目结构上杜绝冲突,同时介绍了设置环境变量等临时救急方法,帮助开发者彻底解决这一常见难题。

nginx7reverse的博客 955
上一篇: Go微服务架构实战 中篇:5. k8s基于ingress和service实现金丝雀发布和蓝绿发布
下一篇: Go微服务架构实战 下篇:1. gRPC + Opentracing + Zipkin实现分布式链路追踪系统
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值