dubbogo如何实现路由规则功能

news2024/12/26 1:04:36

dubbo-go中如何实现路由规则功能

路由规则( routing rule )是为了改变网络流量所经过的途径而修改路由信息的技术,主要通过改变路由属性(包括可达性)来实现。在发起一次 RPC 调用前起到过滤目标服务器地址的作用,过滤后的地址列表,将作为消费端最终发起 RPC 调用的备选地址。

路由规则设计

在设计之初,首先要考虑的是路由规则应该放在整个服务治理周期的哪个阶段呢?

以下是架构图:

img

可以看到图中的Router就是路由规则插入的位置,目前路由规则主要用于控制Consumer到Provider之间的网络流量的路由路径。

除此之外还有几个问题需要优先考虑:

  1. 需要什么功能?

    • 通过配置信息生成路由规则,包括:读取并解析本地配置文件,读取并解析配置中心的配置。以责任链模式串联起来。
    • 通过路由规则,匹配本地信息与远端服务信息,过滤出可以调用的远端节点,再进行负载均衡。
  2. 如何设计接口?

    通过第一点,我们能设计出来以下接口来实现所需功能。

    • 路由规则接口:同于路由规则过滤出可以调用的远端节点。
    • 路由规则责任链接口:允许执行多个路由规则。
    • 配置信息生成路由规则接口:解析内部配置信息(common.URL)生成对应的路由规则
    • 配置文件生成路由规则接口:解析配置文件生成对应的路由规则
  3. 如何实现本地与远程路由规则配置加载?

    • 本地路由规则配置:在原配置加载阶段,新增读取路由配置文件。使用FileRouterFactory解析后生成对应的路由规则,放置到内存中备用。
    • 远程路由规则配置:在zookeeper注册并监听静态资源目录后。读取静态资源,筛选符合路由规则配置信息,通过RouterFactory生成对应路由规则,放置到内存中备用。

Router

匹配及过滤远程实例的路由规则

// Router
type Router interface {
	// Route determine the target invoker list.
	Route([]protocol.Invoker, *common.URL, protocol.Invocation) []protocol.Invoker
	// Priority return priority in router
	// 0 to ^int(0) is better
	Priority() int64
	// URL return URL in router
	URL() common.URL
}

目前已有实现类包括:

  • listenableRouter
  • AppRouter
  • ConditionRouter
  • HealthCheckRouter
  • FileConditionRouter

RouterChain

执行多个路由规则的责任链

// Chain
type Chain interface {
	// Route determine the target invokers list with chain.
	Route([]protocol.Invoker, *common.URL, protocol.Invocation) []protocol.Invoker
	// AddRouters add routers
	AddRouters([]Router)
}

FileRouterFactory

生成解析配置文件生成路由规则的工厂类

// RouterFactory router creates factory use for parse config file
type FileRouterFactory interface {
	// NewFileRouter create file router with config file
	NewFileRouter([]byte) (Router, error)
}

RouterFactory

通过配置信息生成路由规则的工厂类

// RouterFactory router create factory
type RouterFactory interface {
	// NewRouter creates router instance with URL
	NewRouter(*common.URL) (Router, error)
}

实现

img

规则类型

条件路由

dubbo-go 中第一个支持的路由规则,允许用户通过配置文件及配置中心管理路由规则。

与之相似的一个概念是 dubbo-go 里面的 group 概念,但是条件路由提供了更加细粒度的控制手段和更加丰富的表达语义。比较典型的使用场景是黑白名单设置,灰度以及测试等。

健康检查路由

在 RPC 调用中,我们希望尽可能地将请求命中到那些处理能力快、处于健康状态的实例,该路由的功能就是通过某种策略断定某个实例不健康,并将其排除在候选调用列表,优先调用那些健康的实例。这里的”健康”可以是我们自己定义的状态,默认实现即当错误比例到达某一个阈值时或者请求活跃数大于上限则认为其不健康,允许用户扩展健康检测策略。

在我们服务治理里面,核心的问题其实就在于如何判断一个实例是否可用。无论是负载均衡、

熔断还是限流,都是对这个问题的解答。所以,这个 feature 是一个很好的尝试。因为我们接下来计划提供的特性,基于规则的限流以及动态限流,都是要解决 “如何断定一个实例是否可用” 这么一个问题。

所以欢迎大家使用这个特性,并向社区反馈各自设定的健康指标。这对我们接下来的工作会有很大的帮助。

标签路由

以 Provider 为维度,通过将某一个或多个服务的提供者划分到同一个分组,约束流量只在指定分组中流转,从而实现流量隔离的目的,可以作为蓝绿发布、灰度发布等场景的能力基础。

  • 静态打标:根据配置文件所配置的标签,固定给 Provider 设置标签。
  • 动态打标:基于健康检查路由,根据服务不同时刻,不同状态,动态在 Provider 设置适合的标签。

分析

接着,以条件路由在 zookeeper 实现为例,对服务提供者与服务消费者进行整体流程分析。

如何配置条件路由规则

配置条件路由规则既可以通过本地配置文件也能通过远程配置中心进行配置,配置生效流程都是:配置文件 => dubbo 内部协议 => 缓存至应用级内存 => 过滤出可调用节点。

dubbo-admin 【服务治理/条件路由】增加路由规则配置,zookeeper 中会自动生成其对应配置节点,内容均为 dubbo-admin 中设置的配置。

实现Router

以下为必须实现的方法,以下方法用于获取过滤服务端节点配置。

  • Route: 根据配置,调用节点与被调用节点,过滤出可调用节点。
  • Priority: 路由规则优先级,需要是个正整数。
  • URL: 通过路由规则转换出来的 dubbo 内部协议。

使用方法

经过上面设计与实现的分析,大概也能猜测到如何使用:

import (
	"github.com/apache/dubbo-go/common"
	"github.com/apache/dubbo-go/protocol"
	
	_ "github.com/apache/dubbo-go/config_center/zookeeper"
	_ "github.com/apache/dubbo-go/cluster/router/condition"
)

如图所示,使用路由规则并不复杂,只需要把对应的依赖引入进来。在包初始化的时候,会创建出来对应的路由规则的实现。比如说加载条件路由、健康检测路由或者标签作为路由规则:

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

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

相关文章

Node第三方包 【node-xlsx】

文章目录 🌟前言🌟node-xlsx🌟安装🌟导出xlsx文件🌟解析xlsx文件🌟另外:其他支持读写Excel的Node.js模块有:🌟直接导出excel文件 🌟写在最后 🌟前…

麒麟信安联合主办 | openEuler Developer Day 2023召开 openEuler全场景走向深入

【中国,上海,2023年4月21日】openEuler Developer Day 2023于4月20-21日在线上和线下同步举办。本次大会由开放原子开源基金会、中国软件行业协会、openEuler社区、边缘计算产业联盟共同主办,以“万涓汇流,奔涌向前”为主题&#…

【FTP工具】- Win10下免费的FTP服务器搭建 - FileZilla 的下载、安装、使用

目录 一、概述二、下载、安装2.1 下载2.2 安装 三、FileZilla服务器的使用3.1 连接服务器3.2 配置用户权限 四、在windows访问该Ftp服务器4.1 查看Ftp服务器IP4.2 访问Ftp服务器 一、概述 FileZilla服务器是一个免费的开源FTP和FTPS服务器,是根据GNU通用公共许可证条…

HTB靶机03-Shocker-WP

Shocker scan 2023-03-30 23:22 ┌──(xavier㉿xavier)-[~/Desktop/Inbox] └─$ sudo nmap -sSV -T4 -F 10.10.10.56 Starting Nmap 7.91 ( https://nmap.org ) at 2023-03-30 23:22 HKT Nmap scan report for 10.10.10.56 Host is up (0.40s latency). Not shown: 99 clos…

QT-day(2)-(常用类、信号与槽.....)

题目:编写一个登录功能的界面,在登录框项目中,将登陆按钮发射的tclicked信号,连接到自定义的槽函数中,在槽函数中,判断u界面输入的用户名是否为"admin ,密码是否为"123456如果验证成功&#xff0…

数据结构_时间复杂度/空间复杂度

目录 1. 数据结构在学什么 2. 数据结构的基本概念 3. 算法和算法评价 3.1 算法的基本概念 3.2 算法的特征 3.3 算法效率的度量 3.3.1 时间复杂度 3.3.2 空间复杂度 1. 数据结构在学什么 常言道:学以致用;学习完基本C语言程序,我们希…

AB数对 码蹄集

题目来源:码蹄集 题目描述: 大致思路: 遍历输入的n个整数,将每个数存入哈希表中,key为数值,value为该数出现的次数。 再次遍历这n个整数,对于每个数x,计算出x-C和xC的值&#xff0…

Go语言基础----Go语言简介

【原文链接】Go语言基础----Go语言简介 一、Go语言简介 Go语言,又称Golang,是Google公司的Robert Griesemer,Rob Pike 及 Ken Thompson开发的一种静态强类型、编译型的语言。Go语言语法和C语言接近,但是功能上内存安全&#xff…

【Python】lambda匿名函数

文章目录 前言lambda匿名函数的定义lambda匿名函数的使用使用lambda匿名函数写一个计算器总结 前言 在Python中,可以使用def 关键字定义函数,使用def定义的关键字是有名称的,在调用时可以重复使用.还有一种是使用lambda关键字进行函数的定义,这个方式定义的函数是匿名函数,只能…

51单片机(四)静态数码管和动态数码管显示

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

内存优化-比glibc更快的tcmalloc

TCMalloc 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配。它具有现代化内存分配器的基本特征:对抗内存碎片、在多核处理器能够 scale。据称,它的内存分配速度是 glibc2.3 中实…

3d网上渲染平台是怎么渲图的_云渲染流程详解!

题主说的看到许多网友对‘’3d网上渲染平台是怎么渲图的‘’进行提问,瑞云渲染小编也提供自己的小小见解。针对3D网上渲染平台是指什么,实际应该是指云渲染农场。几十年来,随着计算机软硬件不断更迭,图形图像渲染的效果更加清晰、…

信号完整性分析基础知识之传输线和反射(二):阻性负载的反射,源端阻抗,弹跳图

传输线的端接需要考虑三种重要的特殊情况,每种情况中,传输线的特性阻抗均为50Ohm。信号将从源端在这条传输线上传播,并以特定的阻抗端接到达远端。 TIP:在时域中,信号对瞬时阻抗十分敏感,第二区域并不一定是一条传输线…

常见的链表的OJ题

在本次的博客当中,为了巩固关于链表技能的运用,我们先来看一些与链表有关的OJ题。 🌵反转链表 题目详情如下: 第一道题目从逻辑上看不难,我们只需要将链表进行拆分,将我们下一个节点进行一个类似于头插的操…

【Java 数据结构】Map和Set

🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…

35岁程序员被裁赔偿27万,公司又涨薪让我回去,前提是退还补偿金,能回吗?

在大多数人眼里,35岁似乎都是一道槛,互联网界一直都有着“程序员是吃青春饭”的说法,。 如果在35岁的时候被裁能获得27万的赔偿,公司又涨薪请你回去上班,你会怎么选? 最近,就有一位朋友在网上…

Linux安装miniconda3

下载Miniconda(Python3版本) 下载地址:https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh 安装Miniconda(需要连网) (1)将Miniconda3-latest-Linux-x86_64.sh上传到/o…

研读Rust圣经解析——Rust learn-14(面向对象)

研读Rust圣经解析——Rust learn-14(面向对象) Rust面向对象对象包含数据和行为封装继承多态 实现面向对象书写最外层逻辑userServiceUser Rust面向对象 在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是 对象…

算法刷题|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

最大递增子序列 题目:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6…

c++文件操作Ofstream、Ifstream,如何获取文件长度

一、文件光标定位streampos 在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。 ifstream 类和 fstream 类有 seekg 成员函数,可以设置文件读指针的位置;ofstr…