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

目录
相关文章
|
8天前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
19天前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
72 6
|
2月前
|
负载均衡 Java Spring
Spring cloud gateway 如何在路由时进行负载均衡
Spring cloud gateway 如何在路由时进行负载均衡
290 15
|
2月前
|
Java Spring
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
spring cloud gateway在使用 zookeeper 注册中心时,配置https 进行服务转发
61 3
|
2月前
|
Java 微服务 Spring
SpringCloud gateway自定义请求的 httpClient
SpringCloud gateway自定义请求的 httpClient
112 3
|
2月前
|
JSON 前端开发 Java
SpringCloud怎么搭建GateWay网关&统一登录模块
本文来分享一下,最近我在自己的项目中实现的认证服务,目前比较简单,就是可以提供一个公共的服务,专门来处理登录请求,然后我还在API网关处实现了登录拦截的效果,因为在一个博客系统中,有一些地址是可以不登录的,比方说首页;也有一些是必须登录的,比如发布文章、评论等。所以,在网关处可以支持自定义一些不需要登录的地址,一些需要登录的地址,也可以在网关处进行校验,如果未登录,可以返回JSON格式的出参,前端可以进行相关处理,比如跳转到登录页面等。
|
2月前
|
网络协议 小程序 物联网
Gateway-Worker启动失败或者启动无法正常使用的几种方法
Workerman是一款开源高性能异步PHP socket即时通讯框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议
67 3
|
2月前
|
缓存 监控 Java
通用快照方案问题之Spring Boot Admin的定义如何解决
通用快照方案问题之Spring Boot Admin的定义如何解决
45 0
|
2月前
|
Java API 网络架构
Spring Boot与Spring Cloud Gateway的集成
Spring Boot与Spring Cloud Gateway的集成
|
30天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)