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

news2025/1/11 0:51:45

目录

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

二、基于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
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程应用实例,早点快餐店点餐软件支持零售价和会员价,软件定制开发

编程应用实例&#xff0c;早点快餐店点餐软件支持零售价和会员价&#xff0c;软件定制开发 一、编程应用实例&#xff1a; 软件适用范围&#xff1a; 1、早点 2、快餐店 3、面馆 4、汉堡店 5、奶茶店 6、饭店等 程序说明&#xff1a; 二、程序说明&#xff1a; 1、软件…

国家图书馆论文检索证明申请步骤

国家图书馆论文检索证明申请步骤 登录国家图书馆 咨询提交平台 点击论文收引查证 添加附件这一块&#xff0c;需要自己制作一个有格式的EXCEL 卷&#xff0c;期&#xff0c;页码如何查询&#xff1f; 输入自己的联系方式等待工作人员联系即可

Leetcode 108 将有序数组转换为二叉搜索树

题意理解&#xff1a; 我们需要根据一个数组来构建一个二叉搜索树&#xff0c;且该二叉搜索树也是高度平衡二叉树。 什么是高度平衡二叉树呢? 即对于每个节点来说&#xff0c;左右子树高度差不超过1 思路&#xff1a;我们总是从数组的中间位置作为根节点构建该树&#xff0c;这…

Centos系列:Centos7配置与安装DNS服务器

Centos7配置与安装DNS服务器 引言准备工作安装DNS要配置的文件配置主配置文件配置区域配置文件配置正向解析文件配置反向解析文件查看正向/反向配置文件的权限启动DNS服务测试是否配置成功 总结安装和配置会出现的问题 引言 centos7上安装DNS服务器可以实现域名与IP的双向解析…

福德植保无人机案例:无人机种地的那些事儿

大家好&#xff0c;今天我要给大家介绍一个非常有趣的案例&#xff0c;那就是我们的福德植保无人机工厂。这个工厂可不简单&#xff0c;它可是无人机植保领域的佼佼者&#xff0c;让我们一起来看看他们的故事吧&#xff01;首先&#xff0c;让我们来了解一下无人机植保这个概念…

难以置信,一个小小的需求让我捣鼓出一个提效的网站来

难以置信&#xff0c;一个小小的需求让我捣鼓出一个提效的网站来 需求介绍 事情是这样的&#xff0c;有个群友在业务当中碰到一个小小的需求&#xff0c;需求是这样的: 页面当中存在多个输入框&#xff0c;输入框的 value 值是一个数值组成的字符串&#xff08;盲猜应该是身份…

如何将Java条码Dynamsoft Barcode Reader集成到命令行、GUI和Web应用程序中

Dynamsoft Barcode Reader SDK一款多功能的条码读取控件&#xff0c;只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK&#xff0c;…

C++: 多态基本概念及原理

多态的基本概念&#xff1a; 多态是 C 面向对象三大特性之一 多态分为两类&#xff1a; 静态多态 : 函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名 动态多态 : 派生类和虚函数实现运行时多态 静态多态和动态多态区别&#xff1a; 静态多态的函数地址早绑定 …

手机充电器市场分析:预计2028年将达到82亿美元

在5G时代飞速发展的今天&#xff0c;随着科技的进步、应用的发展以及人们对以智能手机、平板电脑、智能穿戴设备为代表的智能终端设备追求越来越高的品质和功能&#xff0c;智能终端设备产品的更新换代的速度越来越快&#xff0c;这也将给全球智能终端充储电产品市场带来更大的…

linux resin的安装

1. 下载安装包 1.1 下载地址&#xff1a;https://caucho.com/products/resin/download 这里我下载的是普通版本的resin&#xff0c;没有选resin pro 版本。 科普一下&#xff0c;从性能上来说 resin和resin pro 版本的性能没区别。 resin pro 版本的 和resin 普通版本的文件是…

Prometheus+Grafana搭建日志采集

介绍 一、什么是日志数据采集 日志数据采集是指通过各种手段获取应用程序运行时产生的各类日志信息&#xff0c;并将这些信息存储到特定的地方&#xff0c;以便后续分析和使用。通常情况下&#xff0c;这些日志信息包括系统运行状态、错误信息、用户操作记录等等。通过对这些…

外贸建站是WP还是CMS?海洋建站教程指南?

外贸建站选WP还是CMS系统&#xff1f;外贸企业网站建站怎么做&#xff1f; 随着全球化的不断发展&#xff0c;越来越多的企业开始拓展海外市场&#xff0c;外贸建站成为了这些企业的必备项目。然而&#xff0c;选择使用哪种建站系统却是一个让人头疼的问题。那么&#xff0c;海…

Pytorch深度强化学习1-5:详解蒙特卡洛强化学习原理

目录 0 专栏介绍1 蒙特卡洛强化学习2 策略评估原理3 策略改进原理3.1 同轨蒙特卡洛强化学习3.2 离轨蒙特卡洛强化学习 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手…

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

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

Synchronized关键字的底层原理

Synchronized实现 Synchronized创建的时候一个互斥的对象锁&#xff0c;每次只有一个线程可以获取该锁。 其底层主要是基于Monitor实现的&#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构 对象在内存中存储主要分为三个部分&#xff1a…

【IEEE独立出版|EI会议征稿】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 进入21世纪以来&#xff0c;计算机技术的高速发展带来了消费电子产品的快速更迭。在技术迅速发展历…

docker配置redis主从、哨兵集群

docker配置redis主从、哨兵集群 搭建redis主从 准备工作 在/usr/local/software/redis/文件夹下建立如下的文件夹、文件 rootlocalhost redis]# mkdir -p 6379/conf 6379/data 6379/log [rootlocalhost redis]# mkdir -p 6380/conf 6380/data 6380/log [rootlocalhost re…

基于ssm的疫苗预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于ssm的疫苗预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【Python动漫系列】喜羊羊(完整代码)

文章目录 喜羊羊环境需求完整代码程序分析系列文章喜羊羊 喜羊羊是中国大陆一部儿童动画片《喜羊羊与灰太狼》中的主角之一。这部动画片自2005年开始播出,成为许多中国儿童最喜欢的动画之一。 喜羊羊是一只体型较小、毛色洁白的绵羊,性格机灵活泼,聪明机智。他是一只勇敢而…

python获取阿里云云解析dns的域名解析记录

最近由于工作原因接触到阿里云的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 &#xff08;阿里云有官方的demo&#xff0c;有兴趣的可以自己看一下&#xff0c;后面也会放链接&#xf…