自定义动态IRule进行路由转发

news2024/11/27 18:59:16

gateway的负载均衡以及feign服务之间的调用或者RestTemplate请求,都可以使用自定义IRule规则进行路由转发。

自定义IRule

  1. 固定IRule:将IRule的一个实现类注入到spring容器中

    @Configuration 
    public class MyIRuleConfig { 
    	@Bean
    	public IRule myIRule() {
    		return new RandomRule();
    	}
    }
    

    注意: 这个自定义配置类不能放在@ComponentScan所扫描的当前包及其子包下

  2. 固定IRule: 使用注解@RibbonClient;

    // configuration 属性可以包含构成客户端的部分的重写@Bean定义,例如ILoadBalancer、ServerListFilter、IRule。
    @RibbonClient(name = "test-client", configuration = RandomRule.class)
    
  3. 可以动态调整的IRule:需要继承ribbonSpringClientFactory类并且创建bean对象,里面要重写getLoadBalancer,给ILoadBalancer设置自定义的IRule路由规则。

    @Slf4j
    public class MySpringClientFactory extends SpringClientFactory {
    
    
        @Override
        public ILoadBalancer getLoadBalancer(String name) {
            ILoadBalancer instance = this.getInstance(name, ILoadBalancer.class);
            if (instance instanceof DynamicServerListLoadBalancer) {
                DynamicServerListLoadBalancer dsbl = (DynamicServerListLoadBalancer) instance;
                try {
                    // 伪代码,这里实际应该使用你自己定义的 IRule,同时,这里可以进行动态调整,因为每一次进行请求时,rabbon都会调用这个 getLoadBalancer()方法。
                    IRule iRule = new RandomRule();
                    dsbl.setRule(iRule);
                    return dsbl;
                } catch (Exception e) {
                    logger.error("ribbon获取负载均衡器实例异常", e);
                }
            }
    
            return instance;
        }
    }
    

动态设置IRule原理:

  1. gateway路由转发:

    本质上,还是使用请求过滤器,gateway用的是LoadBalancerClientFilter,在这里的filter方法,会在获取ServiceInstance时调用RibbonLoadBalancerClient的choose方法选择一个服务,在choose方法中,调用了getServer()getServer()调用getLoadBalancer(),使用SpringClientFactorybean对象获取ILoadBalancer,所以我们要继承ribbon的SpringClientFactory类并且创建bean对象,子类里面要重写getLoadBalancer,给ILoadBalancer设置自定义的IRule路由规则,这样就能自定义路由转发;
    在这里插入图片描述
    在这里插入图片描述

  2. openfeign

    会调用LoadBalancerFeignClient.lbClient()创建FeignLoadBalancer对象,这里调用CachingSpringLoadBalancerFactory.create(),先去类的本地缓存map变量cache中获取,FeignLoadBalancer没有就创建,创建时会加载ILoadBalancer,ILoadBalancer由SpringClientFactory的getLoadBalancer获取(所以重写getLoadBalancer()方法,能设置ILoadBalancer的权重规则IRule),最后还是构造HttpURLConnection来发送http请求。

在这里插入图片描述
在这里插入图片描述

  1. RestTemplate调用:

    增加@LoadBalanced 注解之后,就会在 restTemplate 里面 通过 restTemplate.setInterceptors 放入给RestTemplate 增加LoadBalancerInterceptor 拦截器,在拦截器中使用LoadBalancerClient的实现类RibbonLoadBalancerClient.execute()方法进行负载均衡调用。所以这里也是继承ribbon的SpringClientFactory类并且创建bean对象,里面要重写getLoadBalancer,给ILoadBalancer设置自定义的IRule路由规则。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

力扣sql基础篇(五)

力扣sql基础篇(五) 1 页面推荐 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 输入示例 b 输出示例 1.2 示例sql语句 # Write your MySQL query statement below SELECT distinct page_id recommended_page FROM Likes WHERE (user_id in (SELECT user2_idFROM …

字符串查找、错误信息、字符分类函数

1、寻找子串strstr char* my_strstr(const char* str1, const char* str2) {assert(str1 && str2);const char* cp str1;const char* s1 str1;const char* s2 str2;while (*cp){s2 str2;s1 cp;while (*s1!\0 && *s2!\0 && * s1 *s2){s1;s2;}if (…

一步一步学爬虫(5)Ajax分析方法

一步一步学爬虫(5)Ajax分析方法5.2.1. 分析案例5.2.2. 过滤请求5.2.3. 总结5.2.1. 分析案例 这里还需要借助浏览器的开发者工具,下面以 Chrome 浏览器为例来介绍。 首先,用 Chrome 浏览器打开微博的链接 https://m.weibo.cn/u/283…

排查开机启动项

防止被控机器失联部分木马会添加开机启动项作为复活的手段 /etc/rc.local /etc/rc.local 是 /etc/rc.d/rc.local的软链接 [rootVM-4-11-centos etc]# ll rc.local lrwxrwxrwx 1 root root 13 Apr 6 2022 rc.local -> rc.d/rc.localrc.local的原始内容: #!/…

中文文案排版指北

格式规范千千万,内容创作 No.1 但是当下我们专注与文案排版。优秀的排版、正确使用标点符号能让阅读者赏心悦目,提升阅读体验。这篇文章将 GitHub 上的有关排版的规范摘抄部分供大家查阅,更多详情还请访问原文所在(底部引用中的地…

APSIM练习:小麦苜蓿轮作

在本练习中,您将创建一个小麦苜蓿轮作,其中草料阶段持续数年。 基于“Rotation Sample.apsim”创建一个新的模拟。这是小麦鹰嘴豆轮作。在 Manager 文件夹中,Rotation Management 组件用于表示旋转,使用带有节点(圆圈…

网站需要怎么优化比较好(网站优化有哪些技巧)

怎样让网站优化在短时间内看到效果? 在企业推广营销推广中,网站优化占据了很大一部分,对于企业推广营销有着决定性影响。如果想让您的企业在诸多品牌中脱颖而出,甚至在互联网中有强大的竞争力,你必须要做好网站优化&a…

基于微信小程序云开发的投票小程序源码,图文投票微信小程序源码

功能介绍 投票活动十分火,商家,企业,机构偶尔都会来一场投票活动评选,本小程序支持图文投票,简单方便、随时随地完成投票,可以方便设定投票模式(按天按全程,投票数限定)…

MySQL基础——DQL语句

select 聚合函数(字段列表) from 表名; Mysql的相关知识 好处 : 1.持久化数据到本地 2.可以实现结构化查询,方便管理 数据库主要分为: DB(数据库),保存一系列有组织的数据容器。 DBMS(数据库管理系统),用于对DB获得数…

[蓝桥杯 2017 省 B] k 倍区间(前缀和枚举/数论优化)

题目传送门 思路分析: 第一思路比较容易想到,就是枚举所有的前缀和,然后遍历它们计数满足题意的前缀和数量,最后输出即可,但是这里的数列最多达到了100000,在2层循环下,总的枚举次数就达到了O(…

webpack 的基本使用及配置

webpack 的基本使用配置 npm 镜像源创建列表隔行变色案例新建空白项目目录,初始化 package.json 配置文件通过 npm 安装 jquery新建 src 源代码目录index.htmlindex.js检查网页效果webpack 的安装webpack 的安装dependencies 与 devDependencies参数 -S 及 --save参…

规则引擎easy-rule快速入门及整合SpEL使用

规则引擎介绍 规则引擎解决的实际上就是判断条件分支过多的问题,举个例子,营销策略里,消费不足200,可用10元消费券,消费超过200元,可以享受9折优惠,超过400元和享受8折优惠。这里可以直接用if …

【houdini】带着uv进行模拟(冰激凌案例)

整个sop的路线图 前半部分:赋予材质并分离冰激凌球 一般模型是分部分的,比方说下面这个冰激凌的,分为5个部分。三个不同的冰激凌球和水和杯子。这些部分在houdini中被称为group。 用material节点一口气赋予5个group材质。 具体的材质的指…

【Linux】 gcc 、动态库和静态库,程序是如何链接的

文章目录前言一、gcc 是什么?二、使用步骤1.预编译2.编译3.汇编4.链接三、动静态库1.概念2.区别前言 在Linux环境下,除了学好编辑器 vim 的使用,还需要学会C语言的编译器 gcc 的功能,否则代码无法翻译成可执行程序。本文将介绍 gc…

怎样快速地迁移 MySQL 中的数据?

我们通常会遇到这样的一个场景,就是需要将一个数据库的数据迁移到一个性能更加强悍的数据库服务器上。这个时候需要我们做的就是快速迁移数据库的数据。那么,如何才能快速地迁移数据库中的数据呢?今天我们就来聊一聊这个话题。数据库的数据迁…

Spring Boot 日志详解

Spring Boot 日志一、日志有什么用二、日志怎么用三、自定义日志打印3.1 在程序中得到日志对象3.2 使用日志对象打印日志四、日志级别4.1 日志级别有什么用4.2 日志级别的分类与使用4.3 日志级别设置五、日志持久化5.1 配置文件名5.2 配置保存路径六、更简单的日志输出 -- lomb…

Go第 13 章 :2-客户信息关系系统

Go第 13 章 :2-客户信息关系系统 13.1 项目需求分析 模拟实现基于文本界面的《客户信息管理软件》。该软件能够实现对客户对象的插入、修改和删除(用切片实现),并能够打印客户明细表 13.2 项目的界面设计 主菜单界面 添加客户…

SegFormer笔记(1)安装

一、代码地址github地址:https://github.com/NVlabs/SegFormer二、我的系统配置:1、硬件2、软件win10,vs2022,python3.7三、创建虚拟环境conda create -n MySegFormer python3.7 numpy conda activate MySegFormer python会显示如…

【知识图谱工具汇总】

一,图表示学习与计算框架 1)PyTorch Geometric(PyG) 由德国多特蒙德工业大学研究者推出的基于PyTorch的几何深度学习扩展库。PyG在学术中是比较热门的框架,但是PyG对于异构图以及大规模的图的学习存在着较大的局限性…

【UE4 第一人称射击游戏】39-“M4A1”武器设置

上一篇:【UE4 第一人称射击游戏】38-拾取“M4A1”的提示信息步骤:在“AK47”文件夹中拷贝一份“Weapon_Base”拷贝到“M4A1”文件夹下,重命名为“Weapon_M4A1”打开“Weapon_M4A1”,新添加一个网格体组件骨架网格体选择“M4A1_wea…