当前位置: 首页 > 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 判断路径是否匹配

 ##匹配方法

 

http://www.lryc.cn/news/483915.html

相关文章:

  • 除了 Postman,还有什么好用的 API 管理工具吗?
  • JAVA:探索 EasyExcel 的技术指南
  • 【数字图像处理+MATLAB】对图片进行伽马校正(Gamma Correction):使用幂律变换公式进行伽马变换
  • 算法——螺旋矩阵II(leetcode59)
  • 以往运维岗本人面试真题分享
  • macOS解决U盘装完系统容量变小的问题
  • ORA-00257: archiver error
  • IO技术详解
  • pySpark乱码
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
  • SpringBoot(十三)SpringBoot配置webSocket
  • OA系统都有哪些功能?OA办公系统功能大测评
  • 优化布线拥塞
  • 盲盒APP开发,电商模式下盲盒的未知乐趣
  • RocketMQ-02 集群架构部署
  • 处理报文后 展示在qtdesigner界面 ,有大量数据存储 怎样创建临时文件减少内存占用
  • 后端-实现excel的导出功能(超详细讲解)
  • Docker compose部署portainer
  • 【游戏引擎之路】登神长阶(十四)——OpenGL教程:士别三日,当刮目相看
  • 相等日期问题(c++方法解决)
  • 深度学习——优化算法、激活函数、归一化、正则化
  • Android 老项目适配 Compose 混合开发
  • PH热榜 | 2024-11-14
  • 删库跑路,启动!
  • Vue 3 在现代前端开发中的应用
  • 【HarmonyOS】Hdc server port XXXX has been used.Configure environment variable
  • 使用 ts-node 运行 ts文件,启动 nodejs项目
  • scala中的case class
  • 探索 HTTP 请求方法:GET、POST、PUT、DELETE 等的用法详解
  • 前端项目中,public文件下的system.js有什么作用