微服务如何治理

2023-11-08

b0f76c4008b4499eafdf5a7c60c30245.jpg微服务远程调用可能有如下问题:

 

 

注册中心宕机;

 

服务提供者B有节点宕机;

 

服务消费者A和注册中心之间的网络不通;

 

服务提供者B和注册中心之间的网络不通;

 

服务消费者A和服务提供者B之间的网络不通;

 

服务提供者B有些节点性能变慢;

 

服务提供者B短时间内出现问题。

 

常用的服务治理手段:

 

节点管理

服务调用失败一般是由两类原因引起的,一类是服务提供者自身出现问题,如服务器宕机、进程意外退出等;一类是网络问题,如服务提供者、注册中心、服务消费者这三者任意两者之间的网络出现问题。

 

无论是服务提供者自身出现问题还是网络发生问题,都有两种节点管理手段。

 

1. 注册中心主动摘除机制

 

这种机制要求服务提供者定时的主动向注册中心汇报心跳,注册中心根据服务提供者节点最近一次汇报心跳的时间与上一次汇报心跳时间做比较,如果超出一定时间,就认为服务提供者出现问题,继而把节点从服务列表中摘除,并把最近的可用服务节点列表推送给服务消费者。

 

2. 服务消费者摘除机制

 

虽然注册中心主动摘除机制可以解决服务提供者节点异常的问题,但如果是因为注册中心与服务提供者之间的网络出现异常,最坏的情况是注册中心会把服务节点全部摘除,导致服务消费者没有可用的服务节点调用,但其实这时候服务提供者本身是正常的。所以,将存活探测机制用在服务消费者这一端更合理,如果服务消费者调用服务提供者节点失败,就将这个节点从内存中保存的可用服务提供者节点列表中移除。

 

负载均衡 

一般情况下,服务提供者节点不是唯一的,多是以集群的方式存在,尤其是对于大规模的服务调用来说,服务提供者节点数目可能有上百上千个。由于机器采购批次的不同,不同服务节点本身的配置也可能存在很大差异,新采购的机器CPU和内存配置可能要高一些,同等请求量情况下,性能要好于旧的机器。对于服务消费者而言,在从服务列表中选取可用节点时,如果能让配置较高的新机器多承担一些流量的话,就能充分利用新机器的性能。这就需要对负载均衡算法做一些调整。

 

常用的负载均衡算法主要包括以下几种。

 

1. 随机算法

 

顾名思义就是从可用的服务节点中随机选取一个节点。一般情况下,随机算法是均匀的,也就是说后端服务节点无论配置好坏,最终得到的调用量都差不多。

 

2. 轮询算法 

 

就是按照固定的权重,对可用服务节点进行轮询。如果所有服务节点的权重都是相同的,则每个节点的调用量也是差不多的。但可以给某些硬件配置较好的节点的权重调大些,这样的话就会得到更大的调用量,从而充分发挥其性能优势,提高整体调用的平均性能。

 

3. 最少活跃调用算法

 

这种算法是在服务消费者这一端的内存里动态维护着同每一个服务节点之间的连接数,当调用某个服务节点时,就给与这个服务节点之间的连接数加1,调用返回后,就给连接数减1。然后每次在选择服务节点时,根据内存里维护的连接数倒序排列,选择连接数最小的节点发起调用,也就是选择了调用量最小的服务节点,性能理论上也是最优的。

 

 4. 一致性Hash算法

 

指相同参数的请求总是发到同一服务节点。当某一个服务节点出现故障时,原本发往该节点的请求,基于虚拟节点机制,平摊到其他节点上,不会引起剧烈变动。

 

这几种算法的实现难度也是逐步提升的,所以选择哪种节点选取的负载均衡算法要根据实际场景而定。如果后端服务节点的配置没有差异,同等调用量下性能也没有差异的话,选择随机或者轮询算法比较合适;如果后端服务节点存在比较明显的配置和性能差异,选择最少活跃调用算法比较合适。

 

服务路由

对于服务消费者而言,在内存中的可用服务节点列表中选择哪个节点不仅由负载均衡算法决定,还由路由规则确定。

 

所谓的路由规则,就是通过一定的规则如条件表达式或者正则表达式来限定服务节点的选择范围。 

 

为什么要制定路由规则呢?主要有两个原因。 

 

1. 业务存在灰度发布的需求

 

比如,服务提供者做了功能变更,但希望先只让部分人群使用,然后根据这部分人群的使用反馈,再来决定是否做全量发布。这个时候,就可以通过类似按尾号进行灰度的规则限定只有一定比例的人群才会访问新发布的服务节点。 

 

2. 多机房就近访问的需求

 

据我所知,大部分业务规模中等及以上的互联网公司,为了业务的高可用性,都会将自己的业务部署在不止一个IDC中。这个时候就存在一个问题,不同IDC之间的访问由于要跨IDC,通过专线访问,尤其是IDC相距比较远时延迟就会比较大,比如北京和广州的专线延迟一般在30ms左右,这对于某些延时敏感性的业务是不可接受的,所以就要一次服务调用尽量选择同一个IDC内部的节点,从而减少网络耗时开销,提高性能。这时一般可以通过IP段规则来控制访问,在选择服务节点时,优先选择同一IP段的节点。

 

那么路由规则该如何配置呢?根据我的实际项目经验,一般有两种配置方式。

 

1. 静态配置

 

就是在服务消费者本地存放服务调用的路由规则,在服务调用期间,路由规则不会发生改变,要想改变就需要修改服务消费者本地配置,上线后才能生效。

 

2. 动态配置

 

这种方式下,路由规则是存在注册中心的,服务消费者定期去请求注册中心来保持同步,要想改变服务消费者的路由配置,可以通过修改注册中心的配置,服务消费者在下一个同步周期之后,就会请求注册中心来更新配置,从而实现动态更新。

 

服务容错 

服务调用并不总是一定成功的,可能因为服务提供者节点自身宕机、进程异常退出或者服务消费者与提供者之间的网络出现故障等原因。对于服务调用失败的情况,需要有手段自动恢复,来保证调用成功。

 

常用的手段主要有以下几种。

 

FailOver:失败自动切换。就是服务消费者发现调用失败或者超时后,自动从可用的服务节点列表总选择下一个节点重新发起调用,也可以设置重试的次数。这种策略要求服务调用的操作必须是幂等的,也就是说无论调用多少次,只要是同一个调用,返回的结果都是相同的,一般适合服务调用是读请求的场景。

 

FailBack:失败通知。就是服务消费者调用失败或者超时后,不再重试,而是根据失败的详细信息,来决定后续的执行策略。比如对于非幂等的调用场景,如果调用失败后,不能简单地重试,而是应该查询服务端的状态,看调用到底是否实际生效,如果已经生效了就不能再重试了;如果没有生效可以再发起一次调用。

 

FailCache:失败缓存。就是服务消费者调用失败或者超时后,不立即发起重试,而是隔一段时间后再次尝试发起调用。比如后端服务可能一段时间内都有问题,如果立即发起重试,可能会加剧问题,反而不利于后端服务的恢复。如果隔一段时间待后端节点恢复后,再次发起调用效果会更好。

 

FailFast:快速失败。就是服务消费者调用一次失败后,不再重试。实际在业务执行时,一般非核心业务的调用,会采用快速失败策略,调用失败后一般就记录下失败日志就返回了。

 

对服务容错不同策略的描述中,可以看出它们的使用场景是不同的,一般情况下对于幂等的调用,可以选择FailOver或者FailCache,非幂等的调用可以选择FailBack或者FailFast。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务如何治理 的相关文章

  • Sentinel 流量控制

    上篇 Nacos 配置中心 目录 Sentinel 介绍 官方介绍 https sentinelguard io zh cn docs introduction html Sentinel 部署 服务改造 Sentinel 关键概念 流控规
  • Spring Cloud微服务项目实战笔记(二)是什么推动了单体应用到微服务架构的演进?

    首先对比的是单体应用 一个有问题 大家都完蛋 重新回滚到上一版本 开发测试沟通成本也大 微服务架构的优势 每个微服务是一个小的完整单位 独立的代码库数据库 自己去快速迭代功能 快速迭代 快速回滚 资源利用大大提高 大幅降低协作成本 高可用
  • 负载均衡原理分析与源码解读

    上一篇文章一起学习了Resolver的原理和源码分析 本篇继续和大家一起学习下和Resolver关系密切的Balancer的相关内容 这里说的负载均衡主要指数据中心内的负载均衡 即RPC间的负载均衡 传送门 服务发现原理分析与源码解读 基于
  • Nacos配置文件 Param ‘serviceName‘ is illegal, serviceName is blank

    今天学习NACOS配置文件时 报错Param serviceName is illegal serviceName is blank 但是我在bootstrap yml文件中配置了服务名 父工程引入的依赖版本为最新的2021 1
  • SpringCloud 微服务架构

    目前微服务架构还是比较火的 但是 为什么会选择springcloud 作为 微服务架构呢 列如 dubbo Motan 等等技术都是比较多的 但是依然springcloud 占据了很大一部分 值得深思 目录 一 选型依据 二 目前微服务架构
  • Admin监控&Sleuth链路追踪 &skywalking链路追踪

    Admin监控 Sleuth链路追踪 skywalking Sleuth Zipkin 一 Sleuth Zipkin介绍 二 搭建环境 三 Sleuth入门操作 四 Zipkin搭建及操作 五 RabbitMQ方式发送信息 六 Elast
  • 微服务契约测试框架-Pact

    契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试 通过契约进行解耦 变成 Consumer 与 Provider 端两个各自独立的 异步的单元测试 契约测试的优点 契约测试与单元测试以及其它测试
  • Redis主从集群

    Redis主从集群 1 集群结构 我们搭建的主从集群结构如图 共包含三个节点 一个主节点 两个从节点 这里我们会在同一台虚拟机中开启3个redis实例 模拟主从集群 信息如下 IP PORT 角色 192 168 150 101 7001
  • 从零开始实现基于go-zero框架的微服务电商项目(二)——User服务的基础搭建

    从零开始实现基于go zero框架的微服务电商项目 二 User服务的基础搭建 项目地址 liuxianloveqiqi XianShop 使用go zero搭建的电商项目 github com API 首先在api包下新建user api
  • jenkins部署微服务项目

    新手上路 对着视频做了一个谷粒的在线教育项目 测试跑通之后 想要自己试着部署到自己的云服务器上 闲着也是闲着不是 言归正传 简介 在微服务架构中 随着服务越来越多 服务的打包部署就会成为一个相当麻烦的事情 比如说我的edu online项目
  • 云原生微服务应用的平台工程实践

    作者 纳海 01 微服务应用云原生化 微服务是一个广泛使用的应用架构 而如何使得微服务应用云原生化却是近些年一直在演进的课题 国内外云厂商对云原生概念的诠释大同小异 基本都会遵循 CNCF 基金会的定义 云原生技术有利于各组织在公有云 私有
  • 程序员整体架构之开发架构

    开发架构 文章目录 开发架构 概述 前言 互联网发展特点 单体架构 面向服务架构 SOA 水平分层架构 微服务架构 水平拆分 垂直拆分 服务网格架构 中台架构 云原生架构 Serverless 架构 小结 公众号 概述 简述了互联网业务发展
  • 基于SpringBoot-Dubbo的微服务快速开发框架

    简介 基于Dubbo的分布式 微服务基础框架 为前端提供脚手架开发服务 结合前一篇 Web AP快速开发基础框架 可快速上手基于Dubbo的分布式服务开发 项目代码 https github com backkoms web service
  • Spring Boot入门必会(基本介绍+依赖管理+自动装配)

    目录 一 基础入门 1 Spring Boot 是什么 2 SpringBoot 快速入门 2 1完成步骤 2 2快速入门小结 3 Spring SpringMVC SpringBoot 的关系 3 1梳理关系 3 2如何理解 约定优于配置
  • 领域驱动设计:DDD分层架构

    文章目录 DDD 分层架构 DDD 分层架构最重要的原则 DDD 分层架构推动架构演进 三层架构如何演进到 DDD 分层架构 微服务架构模型有好多种 例如整洁架构 CQRS 和六边形架构等等 每种架构模式虽然提出的时代和背景不同 但其核心理
  • 为分布式做准备吧——分布式服务架构设计概述

    文章目录 分布式服务框架设计架构原理 通信框架 长连接还是短链接 BIO还是NIO 序列化与反序列化 协议栈 服务路由 基于服务注册中心的订阅发布 集群容错 服务降级 分布式消息跟踪 分布式服务框架设计架构原理 通常 分布式服务框架的架构可
  • SpringCloudGateway路由策略:Nacos同集群优先

    使用版本
  • 【业务功能篇104】 补充【业务功能篇99】微服务-springcloud-springboot-电商订单模块--整合支付

    在前面我们业务功能篇98 99中 我们介绍了电商项目中的订单模块服务 那么最后就是需要进行支付动作 那么我们这里就通过订阅第三方平台支付宝的支付调用接口功能 来进一步完成订单提交后的支付动作 支付宝的接口使用可以登录官网开发指南详情去了解
  • 微服务常见的配置中心简介

    微服务架构中 常见的配置中心包括以下几种 Spring Cloud Config Spring Cloud Config是官方推荐的配置中心解决方案 它支持将配置文件存储在Git SVN等版本控制系统中 通过提供RESTful API 各个
  • Python 微服务架构指南

    概要 微服务架构作为一种设计风格 它将应用程序构建为一套小服务的集合 每个服务实现特定的业务功能 这些服务可以独立部署 扩展并围绕特定业务能力构建 Python 凭借其简洁易读的语法和强大的库生态系统成为实现微服务的受欢迎选择 本文将详细介

随机推荐

  • Dynamics 365新特性介绍:在视图中显示图片和提示

    关注本人微信和易信公众号 微软动态CRM专家罗勇 回复242或者20161230可方便获取本文 同时可以在第一间得到我发布的最新的博文信息 follow me 我的网站是 www luoyong me Dynamics CRM 2011及以
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】矩阵最大值

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 矩阵最大值 知识点矩阵数组 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 给定一个仅包含0和1的N N二维矩阵 请计算二维矩阵的最大值 计算规则如下 1 每行元素按下标
  • pycharm安装教程

    pycharm是一款功能强大的python编辑器 具有跨平台性 鉴于目前最新版pycharm使用教程较少 为了节约大家摸索此IDE的时间 来介绍一下pycharm在windows下是如何安装的 这是PyCharm的下载地址 http www
  • Java验证码图片生成源代码

    Java验证码图片生成源代码 import javax imageio ImageIO import java awt import java awt image BufferedImage import java io import ja
  • 查询统计Ceph上的pg 总数

    本文中的命令的第一版来源于国外的一个博客 后面的版本为我自己修改的版本 查询的命令如下 ceph pg dump awk pg stat col 1 while col up col col 0 9a f 0 9a f match 0 0
  • 图片码生成

    1 项目结构 2 类的内容 2 1 Digest package com rtsm zhjs background common imgcode author loki date 2018 04 27 上午10 16 import org
  • 一篇文章带你了解国际化,以及springboot当中如何实现国际化

    国际化一般在中大型公司领域会用得到 有时候会面对一些外国客户等 这时候就需要做一些多语言功能 来提升项目的可读性 本文带你了解什么是国际化以及他的用法 目录 理解国际化概念 简单了解国际化原理 国际化demo练习 1 引入依赖 2 创建多语
  • C#6.0新语法

    一 自动属性初始化 在以前的C 版本中 属性是这样写的 1 public int Id get set 2 public string Name get set 在C 6 0中 属性可以自动赋初始值 例如 1 public string N
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • gc垃圾回收四种方法

    标记清除算法 标记清除 Mark Sweep 算法 包含 标记 和 清除 两个阶段 首先标记出所有需要回收的对象 在标记完成后统一回收掉所有被标记的对象 标记清除算法是最基础的收集算法 后续的收集算法都是基于该思路并对其缺点进行改进而得到的
  • 使用Docker-镜像命令

    镜像名称 首先来看下镜像的名称组成 镜名称一般分两部分组成 repository tag 在没有指定tag时 默认是latest 代表最新版本的镜像 如图 这里的mysql就是repository 5 7就是tag 合一起就是镜像名称 代表
  • C#--使用Process类kill进程

    1 背景 static变量 static变量也称作静态变量 静态变量和非静态变量的区别是 静态变量被所有的对象所共享 在内存中只有一个副本 它当且仅当在类初次加载时会被初始化 而非静态变量是对象所拥有的 在创建对象的时候被初始化 存在多个副
  • 使用 Qt designer

    使用 Qt designer 1 配置Qt designer外部工具 2 Qt designer Qt 设计师 使用 2 1 创建保存文件ui 2 2 pyuic5 exe 工具 转化成为py文件 2 3 直接导入UI文件 2 qrc资源管
  • C# 正则表达式进阶

    文章目录 限定开头和结尾 匹配汉字 1 9反向引用 分组构造 具名的分组构造 断言 零宽度正预测先行断言 断言某位置后面是xxx 零宽度负预测先行断言 断言某位置后面不是xxx 零宽度正预测后发断言 断言某位置前面是xxx 零宽度负预测后发
  • 第二十七篇 SeNet——论文翻译

    文章目录 摘要 1 简介 2 相关工作 3 压缩和激励块 3 1 压缩 全局信息嵌入 3 2激励 自适应再校正 3 3 实例化 4 模型和计算复杂性 5 实验 5 1 图像分类 5 2 场景分类 5 3 COCO上的目标检测 5 4 ILS
  • 保研之路——复旦计算机学院预推免

    复旦计算机学院预推免 个人情况 高校复试参与情况 复旦计算机学院直硕 9 19 9 20 结语 嗯 抱着不白花这么多路费住宿费的初衷准备写一个保研经验贴 希望学弟学妹少花点钱吧orz 我的战术大概是只要学校给我发了邀请我就去 除了时间冲突的
  • windows配置selenium

    文章目录 1 确定chrome版本 2 下载并配置chrome驱动 3 测试 1 确定chrome版本 在chrome中访问 chrome settings help 可以看到当前版本 111 0 5563 111 64位 2 下载并配置c
  • matlab读取sheet1_matlab读取excel数据的方法步骤详解

    在Excel中录入好数据以后经常需要被matlab读取 具体该如何读取呢 下面是由学习啦小编分享的matlab读取excel数据的方法 以供大家阅读和学习 matlab读取excel数据的方法 matlab读取Excel数据步骤1 如果数据
  • Vue/JS自定义指令:实现元素滑动、移动端适配以及边界处理

    核心属性 Element clientWidth 元素可视宽度 Element clientHeight 元素可视高度 MouseEvent clientX 鼠标相对于浏览器左上顶点的水平坐标 MouseEvent clientY 鼠标相对
  • 微服务如何治理

    微服务远程调用可能有如下问题 注册中心宕机 服务提供者B有节点宕机 服务消费者A和注册中心之间的网络不通 服务提供者B和注册中心之间的网络不通 服务消费者A和服务提供者B之间的网络不通 服务提供者B有些节点性能变慢 服务提供者B短时间内出现