当前位置: 首页 > news >正文

spring gateway 动态路由

##yml配置

spring:application:name: public-gateway
#  cloud:
#    gateway:
#      routes:
#        - id: mybatis-plus-test # 路由的唯一标识
#          uri: http://192.168.3.188:9898 # 目标服务的地址
#          predicates:
#            - Path=/test/** # 匹配以 /user/ 开头的请求路径
#          filters:
#            - AddRequestHeader=X-Request-Example, Example # 添加一个请求头
#            - AddRequestParameter=param1, value1 # 添加一个请求参数
server:port: 8180
logging:config: classpath:config/logback-spring.xml

##DynamicRoutesService动态路由

ApplicationEventPublisherAware得到publisher发布事件刷新路由缓存

ApplicationRunner设置路由

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;import java.net.URI;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;@Service
public class DynamicRoutesService implements ApplicationEventPublisherAware, ApplicationRunner {@Autowiredprivate RouteLocator routeLocator;@Autowiredprivate RouteDefinitionWriter routeDefinitionWriter;private ApplicationEventPublisher publisher;private void loadDynamicRoutes() {routeDefinitionWriter.save(Mono.just(createRoute())).subscribe();}@Overridepublic void run(ApplicationArguments args) throws Exception {loadDynamicRoutes();publisher.publishEvent(new RefreshRoutesEvent(this));}public RouteDefinition createRoute() {PredicateDefinition predicateDefinition = new PredicateDefinition();List<PredicateDefinition> predicates = new ArrayList<>();predicates.add(predicateDefinition);Map<String, String> argsPredicate = new LinkedHashMap<>();argsPredicate.put("key0", "/test/**");predicateDefinition.setName("Path");predicateDefinition.setArgs(argsPredicate);FilterDefinition filterDefinition = new FilterDefinition();List<FilterDefinition> filters = new ArrayList<>();filters.add(filterDefinition);Map<String, String> argsFilter = new LinkedHashMap<>();argsFilter.put("name", "X-Request-Example");argsFilter.put("value", "Example");filterDefinition.setName("AddRequestHeader");filterDefinition.setArgs(argsFilter);RouteDefinition routeDefinition = new RouteDefinition();routeDefinition.setUri(URI.create("http://192.168.3.104:9898"));routeDefinition.setOrder(1);routeDefinition.setId("mybatis-plus-test");routeDefinition.setPredicates(predicates);routeDefinition.setFilters(filters);return routeDefinition;}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}}

##publisher.publishEvent(new RefreshRoutesEvent(this));发布事件。调用CachingRouteLocator刷新缓存源码

private final Map<String, List> cache = new ConcurrentHashMap<>();

@Overridepublic void onApplicationEvent(RefreshRoutesEvent event) {try {fetch().collect(Collectors.toList()).subscribe(list -> Flux.fromIterable(list).materialize().collect(Collectors.toList()).subscribe(signals -> {applicationEventPublisher.publishEvent(new RefreshRoutesResultEvent(this));cache.put(CACHE_KEY, signals);}, throwable -> handleRefreshError(throwable)));}catch (Throwable e) {handleRefreshError(e);}}

##fetch方法

private Flux<Route> fetch() {return this.delegate.getRoutes().sort(AnnotationAwareOrderComparator.INSTANCE);}

##fetch方法通过CompositeRouteLocator获取路由

@Overridepublic Flux<Route> getRoutes() {return this.delegates.flatMapSequential(RouteLocator::getRoutes);}

##spring gateway 请求阶段查找路由

从CachingRouteLocator缓存中查找

##AsyncPredicate.DefaultAsyncPredicate.apply 判断路径是否匹配

 ##匹配方法

 

相关文章:

spring gateway 动态路由

##yml配置 spring:application:name: public-gateway # cloud: # gateway: # routes: # - id: mybatis-plus-test # 路由的唯一标识 # uri: http://192.168.3.188:9898 # 目标服务的地址 # predicates: # - Path/test/** # 匹配…...

除了 Postman,还有什么好用的 API 管理工具吗?

Postman在团队协作上的支持相对有限&#xff0c;且免费版本的功能较为基础&#xff0c;高级功能需要付费解锁。 为了寻找更加符合团队需求的解决方案&#xff0c;许多开发者开始探索其他API管理工具&#xff0c;其中Apifox便是备受推崇的选择之一。下面通过一个表格来简单了解…...

JAVA:探索 EasyExcel 的技术指南

1、简述 在 Java 开发中&#xff0c;Excel 文件的读写操作是一项常见的需求。阿里巴巴开源的 EasyExcel 提供了一种高效、简洁的解决方案&#xff0c;特别是在处理大规模数据时表现尤为突出。本文将详细介绍 EasyExcel 的优缺点、应用场景&#xff0c;并通过实例展示其基本用法…...

【数字图像处理+MATLAB】对图片进行伽马校正(Gamma Correction):使用幂律变换公式进行伽马变换

引言 伽马校正&#xff08;Gamma Correction&#xff09;是一种用于图像处理的技术&#xff0c;主要用于调整图像的亮度或对比度。其基本原理是对图像的每一个像素应用一个非线性变换&#xff0c;以更好地适应人眼的视觉感知。在数字图像处理中&#xff0c;伽马校正通常用于调…...

算法——螺旋矩阵II(leetcode59)

给你一个正整数 n &#xff0c;生成一个包含 1 到 n^2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 对于螺旋矩阵来讲难点主要在于行或列放置元素时的边界条件&#xff0c;我们遵循一个循环不变量原则在放置行或列元素时遵循左闭右开来放置元…...

以往运维岗本人面试真题分享

以下是本人面试运维岗的一些面试经历&#xff0c;在此做个记录分享 目录 TCP/IP三次握手 IPtables IPtables四表五链都是什么&#xff1f; nat端口如何做&#xff1f; 开放本机的80端口该如何做&#xff1f; 如何在单用户模式下引导Centos&#xff1f; nginx轮询模式都有…...

macOS解决U盘装完系统容量变小的问题

发现原来256GB容量的U盘在mac电脑上只显示34GB&#xff0c;想起来之前用该U盘装过系统&#xff0c;最终搜到了以下解决方案&#xff0c;在此记录&#xff1a; (1) 查看盘符列表&#xff0c;找到需要格式化的U盘&#xff0c;假设为disk4 diskutil list(2) 卸载分区disk4 disk…...

ORA-00257: archiver error

ORA-00257: archiver error 归档满问题&#xff1a; 报错&#xff1a; SQL> conn admin/admin ERROR: ORA-00257: archiver error. Connect internal only, until freed. Warning: You are no longer connected to ORACLE. 检查空间&#xff1a; SQL> select name, tot…...

IO技术详解

IO监控项在监控中一直是很重要的存在&#xff0c;服务有IO&#xff0c;磁盘有IO&#xff0c;操作系统也有IO&#xff0c;IO到底是什么呢 IO IO&#xff0c;即“输入/输出”&#xff08;Input/Output&#xff09;&#xff0c;是指计算机系统或设备之间交换数据的过程。这个概念…...

pySpark乱码

1.现象 python的变量包含中文&#xff0c;用format放入SQL中时&#xff0c;出现乱码 2.原因 python2默认编码是ascii 3.解决办法 使用python3&#xff0c;并且把所有print&#xff0c;改成带括号的 4.在pyspark中加入参数 spark.pyspark.driver.python/usr/bin/python3 …...

【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)

事务的隔离级别 1. 如何理解事务的隔离性2. 事务隔离级别的分类3. 查看和设置事务隔离级别3.1 全局和会话隔离级别3.2 查看和设置隔离级别 4. 事务隔离级别的演示4.1 读未提交&#xff08;Read Uncommitted&#xff09;4.2 读已提交&#xff08;Read Committed&#xff09;4.3 …...

SpringBoot(十三)SpringBoot配置webSocket

在PHP版本的博客中&#xff0c;我使用PHPswoole实现了webscoket即时聊天的功能。 在java版本的博客中&#xff0c;我也想使用webscoket来实现即时聊天的功能&#xff0c;下边是我实现过程的一个记录。 一&#xff1a;在pom.xml中添加记录 <!-- spring-websocket start --&…...

OA系统都有哪些功能?OA办公系统功能大测评

随着现代企业对效率和协作的需求不断增加&#xff0c;OA办公系统已成为许多企业日常运营的重要工具。 一个功能完备的OA系统不仅能帮助企业提高办公效率&#xff0c;还能优化各类工作流程&#xff0c;从文档管理到审批流程、任务管理等&#xff0c;它为企业提供了全方位的支持…...

优化布线拥塞

Note&#xff1a;文章内容以 Xilinx 系列 FPGA 进行讲解 随着设计规模的增大和复杂度的提升&#xff0c;布线拥塞成为常见的问题&#xff0c;尤其是在用UltraScale FPGA或UltraScale FPGA时&#xff0c;布线拥塞往往成为时序收敛的瓶颈&#xff0c;也成为编译时间过长的“罪魁…...

盲盒APP开发,电商模式下盲盒的未知乐趣

在互联网电商模式逐渐成熟的当下&#xff0c;盲盒电商为消费者提供了一个全新的娱乐购物体验&#xff0c;让众多粉丝和消费者通过手机系统就可以体验拆盲盒的惊喜感和刺激性。在消费者享受线上拆盲盒的乐趣时&#xff0c;企业也能够获得新的发展机遇&#xff0c;扩大发展空间。…...

RocketMQ-02 集群架构部署

根据上一章《RocketMQ消费模型和部署模型》得知&#xff0c;启动rocketmq非常简单&#xff0c;只需要分别执行mqnamesrv启动NameServer&#xff0c;执行mqbroker启动Broker即可。但生产环境不可能仅使用单节点MQ&#xff0c;为提高可用性和吞吐量&#xff0c;生产常使用集群模式…...

处理报文后 展示在qtdesigner界面 ,有大量数据存储 怎样创建临时文件减少内存占用

处理大量数据并将其展示在 Qt Designer 创建的界面中时&#xff0c;确实可能会遇到内存占用过高的问题。使用临时文件来存储和管理数据是一种有效的解决方案&#xff0c;可以帮助减少内存占用。 import os import shutil import tempfile from PyQt5.QtWidgets import QApplica…...

后端-实现excel的导出功能(超详细讲解)

首先&#xff0c;不管是一大段文字还是一个几行几列的表格实现方式都是一样的。把动态的内容使用英文单词代替。动态的内容加不加下划线都可以&#xff0c;加了下划线最后生成的表格动态内容部分带有下划线&#xff0c;不加下划线最后生成的表格动态内容部分不带下划线。大家各…...

Docker compose部署portainer

整个工具的代码都在Gitee或者Github地址内 gitee&#xff1a;solomon-parent: 这个项目主要是总结了工作上遇到的问题以及学习一些框架用于整合例如:rabbitMq、reids、Mqtt、S3协议的文件服务器、mongodb github&#xff1a;GitHub - ZeroNing/solomon-parent: 这个项目主要是…...

【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看

【游戏引擎之路】登神长阶&#xff08;十四&#xff09;——OpenGL教程&#xff1a;士别三日&#xff0c;当刮目相看 2024年 5月20日-6月4日&#xff1a;攻克2D物理引擎。 2024年 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 2024年 6月13日-6月20日&#xff1a;攻克《3D…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

【Vue】scoped+组件通信+props校验

【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性&#xff0c; 令样式只作用于当前组件的标签 作用&#xff1a;防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...

【见合八方平面波导外腔激光器专题系列】用于干涉光纤传感的低噪声平面波导外腔激光器2

----翻译自Mazin Alalus等人的文章 摘要 1550 nm DWDM 平面波导外腔激光器具有低相位/频率噪声、窄线宽和低 RIN 等特点。该腔体包括一个半导体增益芯片和一个带布拉格光栅的平面光波电路波导&#xff0c;采用 14 引脚蝶形封装。这种平面波导外腔激光器设计用于在振动和恶劣的…...