路由策略,gRPC 路由如何实现

目录

一、为啥我们要路由策略:

二、基于gRPC 路由策略


一、为啥我们要路由策略:

我们可以重新回到调用方发起 RPC 调用的流程。在 RPC 发起真实请求的时候,有一个步骤就是从服务提供方节点集合里面选择一个合适的节点(就是我们常说的负载均衡),那我们是不是可以在选择节点前加上“筛选逻辑”,把符合我们要求的节点筛选出来。这就是路由

举个例子:比如我们要求新上线的节点只允许某个IP可以调用,那我们的注册中心会把这条规则下发到服务调用方。在调用方收到规则后,在选择具体节点前,会先通过筛选规则过滤节点集合,按照这个例子的逻辑,最后会过滤出一个节点。整个整个RPC 调用过程如下。

从上图可以看出路由就是从服务发现所有节点,帅选出合适节点的过程。

二、基于gRPC 路由策略

下面代码是加权轮询负载均衡算法,我们加上了Filter 对节点进行筛选,那么这个筛选的规则就是路由策略,加权轮询负载均衡算法详细解释可以参考负载均衡算法

type Filter func(info balancer.PickInfo, Group string) bool
type balanceWeightBuild struct {
   Filter Filter
}
​
func (b balanceWeightBuild) Build(info base.PickerBuildInfo) balancer.Picker {
   result := make([]*SubConnInfo, 0, len(info.ReadySCs))
   for k, v := range info.ReadySCs {
      weight := v.Address.Attributes.Value("weight").(string)
      group := v.Address.Attributes.Value("group").(string)
      w, _ := strconv.Atoi(weight)
      result = append(result, &SubConnInfo{
         Conn:            k,
         Weight:          w,
         CurrentWeight:   w,
         EffectiveWeight: w,
         Group:           group,
      })
   }
   return &balancepick{
      Address: result,
      Filter:  b.Filter,
   }
}
​
type balancepick struct {
   Address []*SubConnInfo
   Filter  Filter
}
​
type SubConnInfo struct {
   Conn            balancer.SubConn
   Weight          int
   Group           string
   CurrentWeight   int
   EffectiveWeight int
   lock            sync.Mutex
}
​
func (b *balancepick) Pick(info balancer.PickInfo) (balancer.PickResult, error) {
   if len(b.Address) == 0 {
      return balancer.PickResult{}, balancer.ErrNoSubConnAvailable
   }
   if b.Filter == nil {
      b.Filter = func(info balancer.PickInfo, Group string) bool {
         return true
      }
   }
   res := make([]*SubConnInfo, 0, 5)
   for _, re := range b.Address {
      if !b.Filter(info, re.Group) {
         continue
      }
      res = append(res, re)
   }
   if len(res) == 0 {
      return balancer.PickResult{}, balancer.ErrNoSubConnAvailable
   }
   totalWeitht := 0
   var current *SubConnInfo
   for _, v := range res {
      v.lock.Lock()
      totalWeitht += v.EffectiveWeight
      v.CurrentWeight += v.EffectiveWeight
      if current == nil || current.CurrentWeight < v.CurrentWeight {
         current = v
      }
      v.lock.Unlock()
   }
   current.lock.Lock()
   current.CurrentWeight -= totalWeitht
   current.lock.Unlock()
   return balancer.PickResult{
      SubConn: current.Conn,
      Done: func(info balancer.DoneInfo) {
         current.lock.Lock()
         if info.Err == nil && current.EffectiveWeight == math.MaxInt {
            current.EffectiveWeight--
            return
         }
         if info.Err != nil && current.EffectiveWeight == 0 {
            current.EffectiveWeight++
            return
         }
         if info.Err != nil {
            current.EffectiveWeight--
         } else {
            current.EffectiveWeight++
         }
         current.lock.Unlock()
​
      },
   }, nil
}

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

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

相关文章

【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

node批量修改文件名称

示例目录 在终端中执行即可 node index.js // 第一步&#xff1a;引入 fs 文件系统模块 let fs require("fs"); // 读取目标文件夹名称 const dirName "./img"; // 文件后缀匹配规则 const reg /(?<[.])[a-z]/; // 统一文件名前缀 const fileNam…

SVG-椭圆弧-参数转换-计算公式-标准解读

文章目录 1.简介2.基本参数2.1.椭圆的表达2.2.参数变换2.3.注意事项 3.参考资料4.总结 1.简介 为了与其他路径段表示法保持一致&#xff0c; SVG 路径中的圆弧是根据曲线上的起点和终点定义的。椭圆弧的这种端点参数化。优点是它允许与其它路径一致的语法&#xff0c;其中所有…

22款奔驰GLE450升级香氛负离子 车载香薰功能

相信大家都知道&#xff0c;奔驰自从研发出香氛负离子系统后&#xff0c;一直都受广大奔驰车主的追捧&#xff0c;香氛负离子不仅可以散发出清香淡雅的香气外&#xff0c;还可以对车内的空气进行过滤&#xff0c;使车内的有害气味通过负离子进行过滤&#xff0c;达到车内保持清…

ASP.NET-BS结构的城市酒店入住信息管理系统的设计

2 理论基础 2.1 数据库技术 数据库技术应用中&#xff0c;经常用到的基本概念有&#xff1a;数据库&#xff08;DB&#xff09;、数据库管理系统&#xff08;DBMS&#xff09;、数据库系统&#xff08;DBS&#xff09;、数据库技术及数据模型。 数据库技术是研究数据库的结构、…

第二证券:科创板股票代码?

跟着中国经济的持续展开&#xff0c;出资商场也更加兴盛。科技立异是推动经济展开的基石&#xff0c;因此科技股在近年来的A股商场上备受瞩目。尤其是2019年7月22日&#xff0c;中国科创板正式开板&#xff0c;在A股商场上增添了一份新的亮点。本文将从多个视点深度解析科创板股…

终端安全管理软件是监控软件吗

有些人在后台问&#xff0c;终端安全管理软件是监控软件吗&#xff1f; 先回答&#xff0c;是监控软件。 因为它具有监控的功能&#xff0c;在很大程度上&#xff0c;是可以用来当做监控软件来用的。 终端安全管理软件是一种集中管理终端设备的软件工具&#xff0c;可以在企业…

线程中出现异常的处理

目录 前言 正文 1.线程出现异常的默认行为 2.使用 setUncaughtExceptionHandler() 方法进行异常处理 3.使用 setDefaultUncaughtExceptionHandler() 方法进行异常处理 4.线程组内处理异常 5.线程异常处理的优先性 总结 前言 在紧密交织的多线程环境中&#xff0c;异…

BearPi Std 板从入门到放弃 - 引气入体篇(2)(按键触发外部中断控制LED亮灭)

简介 基于 第一篇文章 的介绍&#xff0c; 我们新增按键的中断控制&#xff1b; 开发板 &#xff1a; Bearpi Std(小熊派标准板) 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 KEY1 : PB2 \ 上拉 \ 按下下降沿触发(一次)/上下沿触发(两次&#xff0c;实现…

git常用命令小记

&#xff08;文章正在持续更新中&#xff09; git init - 在当前目录下初始化一个新的 Git 仓库。 git clone [url] - 克隆远程仓库到本地。 git add [file] - 将文件添加到暂存区。 git commit -m "commit message" - 将添加到暂存区的文件提交到本地仓库。 git pus…

python毕业设计论文选题管理系统b615y

毕业论文管理方式效率低下&#xff0c;为了提高效率&#xff0c;特开发了本毕业论文管理系统。本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分&#xff0c;具体功能分析如下&#xff1a; &#xff08;1&#xff09;导师功能模块&#xff1a;…

Rust UI开发(五):iced中如何进行页面布局(pick_list的使用)?(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第五篇&#xff0c;前四篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…

小红书营销4步骤,品牌需要经历哪些流程?

小红书平台是很多品牌首选的营销“主战场”。想要充分利用平台的优势&#xff0c;做好小红书营销&#xff0c;提升品牌市场认知度&#xff0c;打开产品销路&#xff0c;今天我们为大家分享下小红书营销4步骤&#xff0c;品牌需要经历哪些流程&#xff1f; 一、小红书营销四步法…

uniapp微信小程序解决绘制polygon结束时的问题

目录 一、前言 二、实现思路 三、结束标绘具体代码 1、在地图展示工具栏处判断工具按钮是否展示v-if"item.isshow" 2、data声明的工具按钮中新增结束标绘按钮 3、在按钮的点击事件中新增结束标绘的判断 4、判断绘制的线段个数是否大于等于三条&#xff0c;当满…

qiankun: 关于ElementUI字体图标加载不出来的问题

问题描述&#xff1a; 子应用使用的是vueelementUI&#xff0c;在项目main.js中需要引入elementUI的样式文件。elementUI的样式文件中有字体文件的引用&#xff0c;是以相对路径的形式写在css文件中的&#xff0c; 本来独立部署项目访问是没问题的&#xff0c;问题出现在以qi…

(03)vite 处理 css

文章目录 系列全集vite 处理css流程vite如何解决协同开发&#xff0c;样式重复覆盖的问题&#xff1f;使用less通过配置&#xff0c;更改vite的css默认行为 系列全集 &#xff08;01&#xff09;vite 从启动服务器开始 &#xff08;02&#xff09;vite环境变量配置 &#xff…

DevEco Studio设置背景图片

我们打开编辑器 左上角菜单 选择 File 下的 Settings 我们选择首选项 Appearance 8 Behavior 下的 Appearance 右侧界面 点击下面的 Background lmage… 新弹出的这个窗口 我们可以鼠标 拖拽它的边 把他拉大一点 当前 我们代码中是没有背景图片的 我们点击入下图指向的三个…

凌恩生物福利第二弹:转发送书!全方位多组学研究解决方案!

研究微生物的组学有很多种&#xff0c;都能在研究中提供研究所需的信息&#xff0c;然而随着科学研究的发展过程&#xff0c;单一的微生物组学研究已很难系统地阐释其生物过程的发生机制与发展变化&#xff0c;微生物与宿主&#xff0c;环境之间的整体性和复杂性&#xff0c;需…

centos安装Python3之后yum不能使用异常

场景&#xff1a; 需要在centos上安装Python3&#xff0c;但是安装Python3之后出现yum不能使用的问题。 问题描述 在centos上安装python3之后出现yum使用不了问题&#xff0c;使用yum会报如下信息&#xff1a; [roothadoop101~]# yum install wgetFile "/usr/bin/yum&q…

Python Rich模块:打造绚丽多彩的命令行界面

概要 在Python编程领域&#xff0c;命令行界面是开发者经常接触的环境之一。然而&#xff0c;传统的命令行界面通常只能呈现简单的文本信息&#xff0c;难以展现丰富的数据和交互效果。幸运的是&#xff0c;有一款名为Rich的Python模块&#xff0c;它能够让我们在命令行界面中创…