SpringCloud Gateway动态路由配置详解

目录
  • 路由
  • 动态
  • 路由模型实体类
  • 动态路径配置
  • 路由模型JSON数据

路由

gateway最主要的作用是,提供统一的入口,路由,鉴权,限流,熔断;这里的路由就是请求的转发,根据设定好的某些条件,比如断言,进行转发。

动态

动态的目的是让程序更加可以在运行的过程中兼容更多的业务场景。

涉及到两个服务,一个是门户服务(作用是提供给运营人员管理入口--包括:管理路由、绑定路由),一个是网关服务(gateway组件,为门户服务提供:查询路由信息、添加路由、删除路由、编辑路由接口)。

路由模型实体类

/**
 * 路由模型
 *
 * @author 苦瓜不苦
 * @date 2022/11/13 23:23
 **/
@Data
public class RouteDefinitionObject {
    /**
     * 路由的Id
     */
    private String id;
    /**
     * 路由断言集合配置
     */
    private List<PredicateDefinition> predicates;
    /**
     * 路由过滤器集合配置
     */
    private List<FilterDefinition> filters;
    /**
     * 路由规则转发的目标uri
     */
    private String uri;
    /**
     * 路由执行的顺序
     */
    private Integer order = 0;
    @Data
    public static class PredicateDefinition {
        /**
         * 断言对应的Name
         */
        private String name;
        /**
         * 配置的断言规则
         */
        private Map<String, String> args;
    }
    @Data
    public static class FilterDefinition {
        /**
         * 断言对应的Name
         */
        private String name;
        /**
         * 配置的断言规则
         */
        private Map<String, String> args;
    }
}

动态路径配置

/**
 * 动态路由配置
 *
 * @author 苦瓜不苦
 * @date 2022/11/13 23:26
 **/
@Slf4j
@RestController
@RequestMapping("/route")
public class GatewayRouteConfig implements ApplicationEventPublisherAware {
    public final Map<String, RouteDefinitionObject> MAP = new ConcurrentHashMap<>();
    private final RouteDefinitionWriter routeDefinitionWriter;
    private ApplicationEventPublisher applicationEventPublisher;
    public GatewayRouteConfig(RouteDefinitionWriter routeDefinitionWriter) {
        this.routeDefinitionWriter = routeDefinitionWriter;
    }
    @Override
    public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) {
        this.applicationEventPublisher = applicationEventPublisher;
    }
    /**
     * 新增路由
     * {"filters":[{"name":"StripPrefix","args":{"_genkey_0":"2"}}],"id":"item-system","uri":"lb://item-system","order":0,"predicates":[{"name":"Path","args":{"_genkey_0":"/api/system/**"}}]}
     */
    @PostMapping("/save")
    public R<String> save(@RequestBody RouteDefinitionObject routeDefinitionObject) {
        try {
            // 路由模型转换成路由对象
            RouteDefinition definition = BeanUtil.toBean(routeDefinitionObject, RouteDefinition.class);
            URI uri = routeDefinitionObject.getUri().startsWith("http") ? UriComponentsBuilder.fromHttpUrl(routeDefinitionObject.getUri()).build().toUri() : URI.create(routeDefinitionObject.getUri());
            definition.setUri(uri);
            // 新增
            routeDefinitionWriter.save(Mono.just(definition)).subscribe();
            applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
            MAP.put(routeDefinitionObject.getId(), routeDefinitionObject);
            return R.success();
        } catch (Exception e) {
            log.error("\n", e);
        }
        return R.failed();
    }
    /**
     * 删除路由
     */
    @GetMapping("/delete")
    public R<Mono<ResponseEntity<Object>>> delete(@RequestParam("id") String id) {
        try {
            Mono<ResponseEntity<Object>> responseEntityMono = routeDefinitionWriter.delete(Mono.just(id))
                    .then(Mono.defer(() ->
                            Mono.just(ResponseEntity.ok().build())
                    )).onErrorResume((t) ->
                                    t instanceof NotFoundException
                            , (t) ->
                                    Mono.just(ResponseEntity.notFound().build())
                    );
            MAP.remove(id);
            return R.success(responseEntityMono);
        } catch (Exception e) {
            log.error("\n", e);
        }
        return R.failed();
    }
    /**
     * 更新路由
     * {"filters":[{"name":"StripPrefix","args":{"_genkey_0":"2"}}],"id":"item-system","uri":"lb://item-system","order":0,"predicates":[{"name":"Path","args":{"_genkey_0":"/api/system/**"}}]}
     */
    @PostMapping("/update")
    public R<String> update(@RequestBody RouteDefinitionObject routeDefinitionObject) {
        try {
            // 删除
            delete(routeDefinitionObject.getId());
            // 新增
            save(routeDefinitionObject);
            return R.success();
        } catch (Exception e) {
            log.error("\n", e);
        }
        return R.failed();
    }
    /**
     * 查询路由
     */
    @GetMapping("/list")
    public R<Collection<RouteDefinitionObject>> list() {
        return R.success(MAP.values());
    }
}

路由模型JSON数据

{
    "filters":[
        {
            "name":"StripPrefix",
            "args":{
                "_genkey_0":"2"
            }
        }
    ],
    "id":"item-system",
    "uri":"lb://item-system",
    "order":0,
    "predicates":[
        {
            "name":"Path",
            "args":{
                "_genkey_0":"/api/system/**"
            }
        }
    ]
}

以上就是SpringCloud Gateway动态路由配置详解的详细内容,更多关于SpringCloud Gateway动态路由的资料请关注我们其它相关文章!

(0)

相关推荐

  • SpringCloud Gateway动态转发后端服务实现过程讲解

    目录 前言 一.概述 二.项目中加入依赖 三.配置文件 四.动态路由数据存储格式 五.后端服务动态转发 六.单元测试 前言 API网关的核心功能是统一流量入口,实现路由转发,SpringCloudGateway是API网关开发的技术之一,此外比较流行的还有Kong和ApiSix,这2个都是基于OpenResty技术栈. 简单的路由转发可以通过SpringCloudGateway的配置文件实现,在一些业务场景种,会需要动态替换路由配置中的后端服务地址,单纯靠配置文件无法满足这种需求. 本文介绍一种

  • SpringCloud Gateway自动装配实现流程详解

    目录 启动依赖 WebFluxAutoConfiguration HttpHandlerAutoConfiguration 总结一下 启动依赖 找到gateway的依赖,spring-cloud-starter-gateway <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId>

  • SpringCloud中Gateway的使用教程详解

    目录 1.基础教程 2.将配置放在配置文件里 3.放在springcloud里面 4.使用服务名而不是IP 1.基础教程 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent>

  • SpringCloud Gateway路由组件详解

    目录 简介 核心概念 具体示例 GlobalFilter 简介   Gateway是SpringCloud Alibaba中的路由组件(前身是Zuul),作为浏览器端请求的统一入口.当项目采用微服务模式时,若包含了路由模块,浏览器端的请求都不会直接请求含有业务逻辑的各个业务模块,而是请求这个路由模块,然后再由它来转发到各个业务模块去. 核心概念   Gateway中的三个核心概念:路由.断言(Predicate).过滤器.   路由:由唯一id.目的url.断言和过滤组成   断言:即路由规则,

  • SpringCloud服务网关Gateway的使用教程详解

    目录 Gateway 什么是Gateway 什么是api网关 网关的三个核心概念 路由(Route) 断言(Predicate) 过滤(Filter) gateway的工作流程 如何使用Gateway gateway路由转发 使用配置文件 使用代码配置 路由实现负载均衡 gateway九种断言 gateway过滤修改 Gateway 什么是Gateway   由于Netflix的zuul发生问题,spring公司自己研发了一套网关框架Gateway用于取代zuul的使用.什么是gateway呢?

  • SpringCloud超详细讲解微服务网关Gateway

    目录 前言 微服务网关GateWay介绍 GateWay特性介绍 Gateway 中的相关术语 Gateway实战 1.创建项目gateway 2.创建启动类 3.新增配置文件 4.编程方式实现路由 5.启动验证 总结 前言 上一篇:微服务网关Zuul 上文中,我们介绍了微服务网关Zuul,Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 Spring Cloud 前几个版本默认使用的一款提供动态路由微服务网关组件,但是随着 Netflix 公司一系列的停更事件,在最新的 S

  • SpringCloud Gateway网关功能介绍与使用

    目录 一.什么是API网关 二.基本使用 三.谓词 四.过滤器-Filter 五.使用Gateway实现限流 六.使用Gateway实现服务降级 七.自定义全局过滤器 八.自定义路由过滤器 一.什么是API网关 API网关作用就是把各个服务对外提供的API汇聚起来,让外界看起来是一个统一的接口.同时也可在网关中提供额外的功能. 总结:网关就是所有项目的一个统一入口. 二.基本使用 1.准备Eureka注册中心 2.准备一个微服务工程 3.搭建Gateway网关微服务 (1)导入依赖 <depen

  • SpringCloud Gateway的路由,过滤器和限流解读

    目录 Spring Cloud Gateway predicates路由断言工厂 全局过滤器 fGatewayFilter工厂 filters配置 Hystrix GatewayFilter工厂 限流RequestRateLimiter GatewayFilter工厂 参考文档 总结 Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢? Zuul(1.x) 基于 Servlet,使用阻塞 AP

  • SpringCloud Gateway实现限流功能详解

    目录 1 什么是限流 2 本次限流模型 3 Gateway结合redis实现请求量限流 3.1 添加依赖 3.2 修改配置文件 3.3 配置文件说明 3.4 创建配置类RequestRateLimiterConfig 3.5 启动快速访问测试 1 什么是限流 通俗的说,限流就是 限制一段时间内,用户访问资源的次数 ,减轻服务器压力,限流大致分为两种: 1. IP 限流(5s 内同一个 ip 访问超过 3 次,则限制不让访问,过一段时间才可继续访问) 2. 请求量限流(只要在一段时间内(窗口期),

  • SpringCloud Gateway动态路由配置详解

    目录 路由 动态 路由模型实体类 动态路径配置 路由模型JSON数据 路由 gateway最主要的作用是,提供统一的入口,路由,鉴权,限流,熔断:这里的路由就是请求的转发,根据设定好的某些条件,比如断言,进行转发. 动态 动态的目的是让程序更加可以在运行的过程中兼容更多的业务场景. 涉及到两个服务,一个是门户服务(作用是提供给运营人员管理入口--包括:管理路由.绑定路由),一个是网关服务(gateway组件,为门户服务提供:查询路由信息.添加路由.删除路由.编辑路由接口). 路由模型实体类 /*

  • Nacos+Spring Cloud Gateway动态路由配置实现步骤

    目录 前言 一.Nacos环境准备 1.启动Nacos配置中心并创建路由配置 2.连接Nacos配置中心 二.项目构建 1.项目结构 2.编写测试代码 三.测试动态网关配置 1.启动服务,观察注册中心 2.访问网关,观察服务日志 四.总结 前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出,容易上手,本文通过gateway.nacos-consume

  • springcloud gateway自定义断言规则详解,以后缀结尾进行路由

    目录 springcloud gateway自定义断言规则,后缀结尾进行路由 1.新建一个路由断言工厂ExtCheckRoutePredicateFactory 2.修改gateway配置 3.修改gateway源码,将自定义断言类加到系统 predicates里 Gateway自定义路由断言工厂类 application.yml文件 路由断言工厂配置类 springcloud gateway自定义断言规则,后缀结尾进行路由 因工作需要,需要使用springcloud gateway ,以.ht

  • SpringCloud GateWay网关示例代码详解

    目录 一.网关基本概念 1.API网关介绍 2.Spring Cloud Gateway 3.Spring Cloud Gateway核心概念 一.网关基本概念 1.API网关介绍 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:(1)客户端会多次请求不同的微服务,增加了客户端的复杂性.(2)存在跨域请求,在一定场景下处理相对复杂.(3)认证复杂,每个服务都

  • Linux系统多网卡环境下的路由配置详解

    Linux下路由配置命令 1. 添加主机路由 route add -host 192.168.1.11 dev eth0 route add -host 192.168.1.12 gw 192.168.1.1 2. 添加网络路由 route add -net 192.168.1.11 netmask 255.255.255.0 eth0 route add -net 192.168.1.11 netmask 255.255.255.0 gw 192.168.1.1 route add -net

  • springcloud pom.xml完整配置详解

    1.父工程 <packaging>pom</packaging> <name>Maven</name> <!-- FIXME change it to the project's website --> <url>http://maven.apache.org/</url> <inceptionYear>2001</inceptionYear> <distributionManagement&

  • Spring Cloud Gateway动态路由Apollo实现详解

    目录 背景 路由的加载 实现动态路由 背景 在之前我们了解的Spring Cloud Gateway配置路由方式有两种方式 通过配置文件 spring: cloud: gateway: routes: - id: test predicates: - Path=/ms/test/* filters: - StripPrefix=2 uri: http://localhost:9000 通过JavaBean @Bean public RouteLocator routeLocator(RouteL

随机推荐