路由策略,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 []*SubConnInfoFilter  Filter
}
​
type SubConnInfo struct {Conn            balancer.SubConnWeight          intGroup           stringCurrentWeight   intEffectiveWeight intlock            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 := 0var current *SubConnInfofor _, v := range res {v.lock.Lock()totalWeitht += v.EffectiveWeightv.CurrentWeight += v.EffectiveWeightif current == nil || current.CurrentWeight < v.CurrentWeight {current = v}v.lock.Unlock()}current.lock.Lock()current.CurrentWeight -= totalWeithtcurrent.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.mzph.cn/news/195472.shtml

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

相关文章

保育员个人简历精选7篇

想要在保育员职位的求职过程中脱颖而出吗&#xff0c;参考这7篇精选的保育员简历案例&#xff01;无论您的经验如何&#xff0c;都能找到适合自己的简历样式及参考内容。 保育员个人简历模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;来幻主简历&#xff0c;做好…

第二十四章 控制到 XML 模式的映射

文章目录 第二十四章 控制到 XML 模式的映射查看支持xml的类的模式 第二十四章 控制到 XML 模式的映射 对于任何支持XML的类&#xff0c;都有一个用于该类的隐式XML模式&#xff0c;可以查看它。 IRIS 提供了修改该模式的方法。 本主题中的XML示例采用文字格式。 类和属性参…

JavaWeb | 验证码 、 文件的“上传”与“下载”

目录&#xff1a; 验证码 和 文件的“上传”与“下载”1.验证码1.1在JSP上开发验证码 2.“文件上传” 和 “文件下载”2.1“文件上传 ”2.2“文件下载” 验证码 和 文件的“上传”与“下载” 1.验证码 验证码&#xff1a;就是由服务器生成的一串随机数字或符号形成一幅图片&am…

在线地图叠加WMS服务,配合WFS数据服务实现图层叠加,属性查看功能

在线地图叠加WMS服务&#xff0c;配合WFS数据服务实现图层叠加&#xff0c;属性查看功能 实现思路实现方式备注&#xff1a;计算bbox参数值网上还提供了以下方式 实现思路 根据WFS服务参数可以看出&#xff0c;一种是空间查询&#xff08;一定范围内的数据查询&#xff09;、还…

微服务的流量管理-服务网格

对于单体应用来说&#xff0c;一般只有流入和流出两种流量。而微服务架构引入了跨进程的网络通信&#xff0c;流量发生在服务之间。由许多服务组成了复杂的网络拓扑结构&#xff0c;每次请求都会产生流量。 这些流量如果没有妥善的管理&#xff0c;整个应用的行为和状态将会不…

全局变量为什么没有野指针

全局变量为什么没有野指针&#xff1f; 全局变量是指在程序的任何地方都可以访问的变量&#xff0c;它们通常存储在静态内存区域&#xff0c;也称为数据段。野指针是指指向非法或不可用内存地址的指针&#xff0c;它们可能会导致内存泄漏、程序崩溃或数据损坏。 全局变量没有野…

封装Servlet使用自定义注解进行参数接收

文章目录 前言一、前后对比✨二、具体实现&#x1f387;三、效果展示&#x1f38f; 前言 先说项目背景&#xff0c;本项目是本人在校期间老师布置的作业&#xff08;就一个CRUD&#xff09;&#xff0c;课程是后端应用程序设计&#xff0c;其实就是servlet和jsp那一套&#xf…

【c】课程满意度计算

我们不好直接比较二维数组中任意多个元素的值是否相等&#xff0c;我们可以创建一维数组&#xff0c;首先将一维数组的值全部设为0&#xff0c;一维数组的下标代表你喜欢课程的量&#xff0c;一维数组的各个元素的值代表你喜欢的次数 例如 你输入3 5&#xff0c;代表你喜欢第三…

好用的挂耳式蓝牙耳机有哪些?分享几款热门好用的蓝牙耳机

挂耳式蓝牙耳机已经成为我们日常生活中的一部分&#xff0c;无论是在通勤、运动还是日常休闲时&#xff0c;它们都发挥着不可替代的作用&#xff0c;随着技术的不断进步&#xff0c;挂耳式蓝牙耳机的音质、连接稳定性以及续航时间都有了显著的提升&#xff0c;下面&#xff0c;…

纯C读取文件实现解析H264裸流每一帧数据

最近研究硬解解码&#xff0c;需要解码H264流文件。 imx的例程是设置一个大的缓冲区&#xff0c;一次性读入不超过10M字节数据&#xff0c;然后全部送到解码器进行解码&#xff0c;对于小于10M字节的视频数据确实很方便的解码了&#xff0c;但是文件大了这种方式就不行了。 如果…

【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】五、类和对象 &#xff08;日期类的完善、流运算符重载函数、const成员、“&”取地址运算符重载&#xff09;-CSDN博客 目录 ​​​​​​​一 . 初始化列表 构造函数…

三分钟快速了解Python中的判断语句!

三分钟快速了解Python中的判断语句&#xff01; 在Python中&#xff0c;判断语句用于根据条件执行不同的代码块。Python提供了两种类型的判断语句&#xff1a;if语句和if-else语句。本文将详细介绍这两种判断语句的用法&#xff0c;并通过实例代码进行演示。 一、if语句 if语…

06 g2o 学习

文章目录 06 g2o 学习6.1 概念6.2 框架简介6.3 代码示例 06 g2o 学习 6.1 概念 g2o(General Graphic Optimization)是基于图优化的库。图优化是把优化问题表现成图的一种方式。一个图由若干个顶点(Vertex)&#xff0c;以及连接这这些顶点的边(Edge)组成。用顶点表示优化变量&…

【python】——函数

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

P8 删除链表指定节点

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f4…

【灵魂 |数据结构与算法】 数据结构必备经法(开山篇),一起修炼算法经法!

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Go to do list

go 语言中怎么实现分布式系统&#xff1f; 在Go语言中实现分布式系统需要考虑以下几个方面&#xff1a; 通信协议&#xff1a;在分布式系统中&#xff0c;各个节点需要通过网络进行通信。Go语言提供了丰富的网络编程库&#xff0c;如net/http、net/rpc等&#xff0c;可以方便…

Python-错误与异常处理

在 Python 中&#xff0c;错误和异常处理是编写健壮程序的重要组成部分。下面是一些关于错误和异常处理的基本知识&#xff1a; 错误&#xff08;Errors&#xff09;和异常&#xff08;Exceptions&#xff09;&#xff1a; 错误&#xff1a; 错误是程序的语法或逻辑错误&#…

【Qt】QDialog的成员函数exec()的返回值

2023年12月4日&#xff0c;周一上午 目录 返回值有哪些 怎么给QDialog的按钮设置按下后让exec()返回QDialog::Accepted或QDialog::Rejected呢&#xff1f; 返回值有哪些 QDialog::exec()函数在Qt中是用于显示对话框的一种方法&#xff0c;它会阻塞调用线程&#xff0c;直到用…

LeetCode463. Island Perimeter

文章目录 一、题目二、题解 一、题目 You are given row x col grid representing a map where grid[i][j] 1 represents land and grid[i][j] 0 represents water. Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounde…