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去用了。如果各位感兴趣可以用到自己的业务中。

目录
相关文章
|
16天前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
|
24天前
|
负载均衡 Java API
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
32 0
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
Java 开发者 Spring
Spring Cloud Gateway 中,过滤器的分类有哪些?
Spring Cloud Gateway 中,过滤器的分类有哪些?
78 3
|
3月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
161 5
|
2月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
56 0
|
3月前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
273 6
|
5月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
126 3
|
5月前
|
Java 微服务 Spring
SpringCloud gateway自定义请求的 httpClient
SpringCloud gateway自定义请求的 httpClient
228 3
|
5月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
582 15