ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring Cloud Gateway 实现动态路由

2022-03-01 22:31:26  阅读:200  来源: 互联网

标签:org Spring route springframework 路由 Mono import Gateway Cloud


1、动态路由的需求背景

由于 routes 配置项中的配置内容是固定的,不便于灵活处理多样化的路由信息,所以需要动态路由来实现路由的灵活配置。
在这里插入图片描述

2、配置信息

1、添加依赖

<!-- 添加 actuator 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.79</version>
</dependency>

需要将之前引入的 redis-reactive 注释掉

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
 </dependency>
 

2、添加配置

# 匹配所有端点
management:
  endpoints:
    web:
      exposure:
        include: "*"
spring:
  redis:
    host: 192.168.106.137
    port: 63789

3、添加自定义的RouteDefinitionRepository

通过 Redis 来存储路由信息:

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import org.springframework.data.redis.core.RedisTemplate;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.List;

@Component
public class RedisRouteDefinitionRepository implements RouteDefinitionRepository {

    private static final String GATEWAY_ROUTE = "gateway_dynamic_route";

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        List<RouteDefinition> routeDefinitionList = new ArrayList<>();
        redisTemplate.opsForHash().values(GATEWAY_ROUTE).stream().forEach(route -> {
            routeDefinitionList.add(JSON.parseObject(route.toString(), RouteDefinition.class));
        });

        return Flux.fromIterable(routeDefinitionList);
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {

        return route.flatMap(routeDefinition -> {
            redisTemplate.opsForHash().put(GATEWAY_ROUTE, routeDefinition.getId(), JSON.toJSONString(routeDefinition));
            return Mono.empty();
        });
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {

        return routeId.flatMap(id->{
            if(redisTemplate.opsForHash().hasKey(GATEWAY_ROUTE, id)){
                redisTemplate.opsForHash().delete(GATEWAY_ROUTE, id);
                return Mono.empty();
            }else {
                return Mono.defer(() -> Mono.error(new Exception("routeDefinition not found:" + routeId)));
            }
        });
    }
}

4、添加 route 信息

http://localhost:8900/actuator/gateway/routes/baidu_route

{
        "uri": "https://www.baidu.com",
        "predicate": [{
            "name":"Path",
            "args":{
                "pattern": "/baidu/**"
            }
        }],
        "filters": [{
            "name": "StripPrefix",
            "value": 1
        }],
        "order": 0
    }

在这里插入图片描述
查看 Redis 中的信息
在这里插入图片描述
说明自定义的 route 信息已写入到 Redis 中。

5、刷新路由信息

Post 请求刷新接口 http://localhost:8900/actuator/gateway/refresh
Get 请求接口 http://localhost:8900/actuator/gateway/routes,可以看到刚刚添加的路由信息
在这里插入图片描述

6、通过新加的路由访问

浏览器访问:http://localhost:8900/baidu/s
在这里插入图片描述

标签:org,Spring,route,springframework,路由,Mono,import,Gateway,Cloud
来源: https://blog.csdn.net/maxy_2013/article/details/123194705

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有