SpringCloud Gateway中路由维护的三种方法

简介: 分别介绍使用配置文件,RouteLocatorBuilder和RouteDefinitionWriter三种方法维护网关路由

SpringCloud Gateway众所周知是微服务全家桶中的网关服务,在微服务前面作为网关接受请求访问的一道门槛,想要通过这道门槛访问到后面的微服务,必须在这道门槛内部配置相应的路由,即可以转到后面具体的微服务地址,下面介绍三种方式的路由配置,其中两种比较常用,第三种是为了配合实际的项目需求,自己摸索出来的方式 ,仅供参考。

第一种,配置文件的方式,就是yml中配置路由

spring:
  cloud:
    gateway:
      routes:
        - id: baidu_route
          uri: https://www.baidu.com
          predicates:
            - Path=/

第二种,RouteLocatorBuilder的方式,通过Bean注入

@BeanpublicRouteLocatorcustomRouteLocator(RouteLocatorBuilderbuilder) {
returnbuilder.routes()
        .route("baidu_route", r->r.path("/")
               .uri("https://www.baidu.com"))
        .build();
}

第三种,通过底层的API即RouteDefinitionWriter的方式,按照底层的元数据定义类RouteDefinition直接组装路由信息,然后手动的保存到路由网关里,最重要的是需要有个事件广播机制,让Gateway感知到路由的变化

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.cloud.gateway.event.RefreshRoutesEvent;
importorg.springframework.cloud.gateway.route.RouteDefinition;
importorg.springframework.cloud.gateway.route.RouteDefinitionWriter;
importorg.springframework.cloud.gateway.support.NotFoundException;
importorg.springframework.context.ApplicationEventPublisher;
importorg.springframework.context.ApplicationEventPublisherAware;
importorg.springframework.http.ResponseEntity;
importorg.springframework.stereotype.Service;
importreactor.core.publisher.Mono;
/*** 动态路由服务*/@ServicepublicclassDynamicRouteServiceImplimplementsApplicationEventPublisherAware{
@AutowiredprivateRouteDefinitionWriterrouteDefinitionWriter;
privateApplicationEventPublisherpublisher;
@OverridepublicvoidsetApplicationEventPublisher(ApplicationEventPublisherapplicationEventPublisher) {
this.publisher=applicationEventPublisher;
    }
//增加路由publicStringadd(RouteDefinitiondefinition) {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
this.publisher.publishEvent(newRefreshRoutesEvent(this));
return"success";
    }
//更新路由publicStringupdate(RouteDefinitiondefinition) {
try {
delete(definition.getId());
        } catch (Exceptione) {
return"update fail,not find route  routeId: "+definition.getId();
        }
try {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
this.publisher.publishEvent(newRefreshRoutesEvent(this));
return"success";
        } catch (Exceptione) {
return"update route  fail";
        }
    }
//删除路由publicMono<ResponseEntity<Object>>delete(Stringid) {
returnthis.routeDefinitionWriter.delete(Mono.just(id)).then(Mono.defer(() -> {
returnMono.just(ResponseEntity.ok().build());
        })).onErrorResume((t) -> {
returntinstanceofNotFoundException;
        }, (t) -> {
returnMono.just(ResponseEntity.notFound().build());
        });
    }
}
importcom.example.demo.service.DynamicRouteServiceImpl;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.ApplicationArguments;
importorg.springframework.boot.ApplicationRunner;
importorg.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
importorg.springframework.cloud.gateway.route.RouteDefinition;
importorg.springframework.stereotype.Component;
importjava.net.URI;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
@ComponentpublicclassInitRouteRunnerimplementsApplicationRunner {
@AutowiredprivateDynamicRouteServiceImpldynamicRouteService;
@Overridepublicvoidrun(ApplicationArgumentsargs) throwsException {
RouteDefinitiondefinition=newRouteDefinition();
definition.setId("baidu_route");
//设置断言List<PredicateDefinition>pdList=newArrayList<>();
PredicateDefinitionpredicate=newPredicateDefinition();
Map<String, String>argsMap=newHashMap<>();
argsMap.put("Path","/");
predicate.setArgs(argsMap);
predicate.setName("Path");
pdList.add(predicate);
definition.setPredicates(pdList);
definition.setUri(newURI("https://www.baidu.com"));
dynamicRouteService.add(definition);
    }
}

给出了例子都是项目启动的时候初始化好的数据,上面三种方式都实现了http://ip:port/baidu跳转到百度首页的效果。

为什么要用第三种方式,其实是一个误解,我们有个项目是api总线项目,需要动态的管理一些api接口,有些是自己的有些是第三方的,本来是通过httpconnection的方式去转发的,后来改用了SpringCloud Gateway,想法是这个比较专业,性能会比较好,我们只做业务上的数据维护即可,活生生的把SpringCloud Gateway当Nginx去用了。如果各位感兴趣可以用到自己的业务中。

目录
相关文章
|
9月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
8月前
|
缓存 JSON NoSQL
别再手写过滤器!SpringCloud Gateway 内置30 个,少写 80% 重复代码
小富分享Spring Cloud Gateway内置30+过滤器,涵盖请求、响应、路径、安全等场景,无需重复造轮子。通过配置实现Header处理、限流、重试、熔断等功能,提升网关开发效率,避免代码冗余。
699 1
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
1611 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
12月前
|
缓存 监控 Java
说一说 SpringCloud Gateway 堆外内存溢出排查
我是小假 期待与你的下一次相遇 ~
1440 5
|
11月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
755 0
|
12月前
|
Java API Nacos
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2472 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
2216 1
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
1012 0
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway

热门文章

最新文章