简介

该文档主要介绍以Nacos为配置中心,实现Spring Cloud GateWay 实现动态路由的功能。Spring Cloud Gateway启动时候,就将路由配置和规则加载到内存里,无法做到不重启网关就可以动态的对应路由的配置和规则进行增加,修改和删除。通过nacos的配置下发的功能可以实现在不重启网关的情况下,实现动态路由。

集成

Spring Cloud GateWay集成

spring-cloud-starter-gateway:路由转发、请求过滤(权限校验、限流以及监控等)

spring-boot-starter-webflux:反应式Web框架

spring-boot-starter-actuator:监控系统健康

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

Nacos集成

nacos-client:nacos客户端,现在用比较新的版本0.9.0

        <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>0.9.0</version></dependency>

动态路由

DynamicRouteServiceImpl:提供动态路由的基础方法,可通过获取bean操作该类的方法。该类提供新增路由、更新路由、删除路由,然后实现发布的功能。

@Service
public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware {@Autowiredprivate RouteDefinitionWriter routeDefinitionWriter;private ApplicationEventPublisher publisher;/*** 增加路由* @param definition* @return*/public String add(RouteDefinition definition) {routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return "success";}/*** 更新路由* @param definition* @return*/public String update(RouteDefinition definition) {try {this.routeDefinitionWriter.delete(Mono.just(definition.getId()));} catch (Exception e) {return "update fail,not find route  routeId: "+definition.getId();}try {routeDefinitionWriter.save(Mono.just(definition)).subscribe();this.publisher.publishEvent(new RefreshRoutesEvent(this));return "success";} catch (Exception e) {return "update route  fail";}}/*** 删除路由* @param id* @return*/public String delete(String id) {try {this.routeDefinitionWriter.delete(Mono.just(id));return "delete success";} catch (Exception e) {e.printStackTrace();return "delete fail";}}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}}

RouteDefinition: 提供路由实体类,主要有predicates匹配来自用户的请求,filters服务路由

@Validated
public class RouteDefinition {@NotEmptyprivate String id = UUID.randomUUID().toString();@NotEmpty@Validprivate List<PredicateDefinition> predicates = new ArrayList<>();@Validprivate List<FilterDefinition> filters = new ArrayList<>();@NotNullprivate URI uri;private int order = 0;public RouteDefinition() {}public RouteDefinition(String text) {int eqIdx = text.indexOf("=");if (eqIdx <= 0) {throw new ValidationException("Unable to parse RouteDefinition text '" + text + "'" +", must be of the form name=value");}setId(text.substring(0, eqIdx));String[] args = tokenizeToStringArray(text.substring(eqIdx+1), ",");setUri(URI.create(args[0]));for (int i=1; i < args.length; i++) {this.predicates.add(new PredicateDefinition(args[i]));}}public String getId() {return id;}public void setId(String id) {this.id = id;}public List<PredicateDefinition> getPredicates() {return predicates;}public void setPredicates(List<PredicateDefinition> predicates) {this.predicates = predicates;}public List<FilterDefinition> getFilters() {return filters;}public void setFilters(List<FilterDefinition> filters) {this.filters = filters;}public URI getUri() {return uri;}public void setUri(URI uri) {this.uri = uri;}public int getOrder() {return order;}public void setOrder(int order) {this.order = order;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;RouteDefinition routeDefinition = (RouteDefinition) o;return Objects.equals(id, routeDefinition.id) &&Objects.equals(predicates, routeDefinition.predicates) &&Objects.equals(order, routeDefinition.order) &&Objects.equals(uri, routeDefinition.uri);}@Overridepublic int hashCode() {return Objects.hash(id, predicates, uri);}@Overridepublic String toString() {return "RouteDefinition{" +"id='" + id + '\'' +", predicates=" + predicates +", filters=" + filters +", uri=" + uri +", order=" + order +'}';}
}

NacosGatewayProperties:自定义属性绑定值,可通过配置文件配置属性。

@ConfigurationProperties(prefix="nacos", ignoreUnknownFields = true)
@Configuration
public class NacosGatewayProperties {private String address;private String dataId;private String groupId;private Long timeout;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getDataId() {return dataId;}public void setDataId(String dataId) {this.dataId = dataId;}public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public Long getTimeout() {return timeout;}public void setTimeout(Long timeout) {this.timeout = timeout;}
}

DynamicRouteServiceImplByNacos: 实现runner,通过nacos下发动态路由配置

@Component
public class DynamicRouteServiceImplByNacos implements CommandLineRunner{@Autowiredprivate DynamicRouteServiceImpl dynamicRouteService;@Autowiredprivate NacosGatewayProperties nacosGatewayProperties;/*** 监听Nacos Server下发的动态路由配置* @param dataId* @param group*/public void dynamicRouteByNacosListener (){try {ConfigService configService=NacosFactory.createConfigService(nacosGatewayProperties.getAddress());String content = configService.getConfig(nacosGatewayProperties.getDataId(), nacosGatewayProperties.getGroupId(), nacosGatewayProperties.getTimeout());System.out.println(content);configService.addListener(nacosGatewayProperties.getDataId(), nacosGatewayProperties.getGroupId(), new Listener()  {@Overridepublic void receiveConfigInfo(String configInfo) {List<RouteDefinition> list = JsonUtils.toList(configInfo, RouteDefinition.class);list.forEach(definition->{dynamicRouteService.update(definition);});}@Overridepublic Executor getExecutor() {return null;}});} catch (NacosException e) {e.printStackTrace();}}@Overridepublic void run(String... args) throws Exception {dynamicRouteByNacosListener();}}

nacos配置下发

nacos配置

nacos:address: 127.0.0.1:8848data-id: dhap-gateway #group-id: AAAtimeout: 5000

nacos属性文件定义

新建dataID为
groupID为AAA

[{"filters": [],"id": "blog1","order": 0,"predicates": [{"args": {"pattern": "/z"},"name": "Path"}],"uri": "https://blog.csdn.net/zhangchangbin123"
},{"filters": [],"id": "blog1","order": 0,"predicates": [{"args": {"pattern": "/c"},"name": "Path"}],"uri": "https://blog.csdn.net/zhangchangbin123"
}
]

查看路由信息




基于Nacos实现Spring Cloud Gateway实现动态路由相关推荐

  1. 基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理

    前面我们了解过了Sentinel 网关流量控制之Spring Cloud Gateway实战,今天带给大家是基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理. 1.为什 ...

  2. 使用Nacos实现Spring Cloud Zuul的动态路由

    一.前言 Nacos是阿里巴巴开源的致力于服务发现与管理.动态配置管理,以及动态DNS服务的中间件,目前已发布至0.5.0版本,除了与Spring Cloud更加紧密结合以外,还丧心病狂地支持JDK1 ...

  3. 有什么办法动态更改yml的值吗_基于Redis实现Spring Cloud Gateway的动态管理

    转载本文需注明出处:微信公众号EAWorld,违者必究. 引言: Spring Cloud Gateway是当前使用非常广泛的一种API网关.它本身能力并不能完全满足企业对网关的期望,人们希望它可以提 ...

  4. spring cloud gateway 之 动态路由改造

    目录 gateway本地文件常规路由配置 本地文件配置对业务造成的痛点 动态路由改造 1 gateway本地文件常规路由配置 我们先大致看下gateway中的常规概念 Route(路由):路由是网关的 ...

  5. spring cloud gateway 之动态路由

    前面分别对 Spring Cloud Zuul 与 Spring Cloud Gateway 进行了简单的说明,它门是API网关,API网关负责服务请求路由.组合及协议转换,客户端的所有请求都首先经过 ...

  6. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...

  7. Spring Cloud Gateway –配置简单路由

    可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品,并有助于在微服务环境中实现Gateway模式 . 它建立在 Spring Boot ...

  8. Spring Cloud GateWay系列(三):路由规则动态刷新

    Spring Cloud Gateway旨在提供一种简单而有效的方式来路由API,并为它们提供横切关注点,例如:安全性.监控/指标和弹性.Route(路由)是网关的基本单元,由唯一标识符ID.目标地址 ...

  9. 微服务 API 网关架构演进 Spring Cloud Gateway ShenYu APISIX

    目录 后台服务网关 Spring Cloud Gateway 遇到问题 Apache ShenYu Higress fizz-gateway-community 企业案例 前台流量网关 APISIX ...

最新文章

  1. 生产者/消费者问题的多种Java实现方式--转
  2. linux怎么删除端口转发,linux使用rinetd快速实现端口转发
  3. 【读书笔记】程序是怎么跑起来的 矢泽久雄
  4. 我用 PyTorch 复现了 LeNet-5 神经网络(自定义数据集篇)!
  5. SVM中引入拉格朗日对偶理解
  6. hdu 4723 How Long Do You Have to Draw(贪心)
  7. 前端 docker + gitlab CI 的持续集成(三)
  8. java的睡眠方式有几种_java的几种定时任务
  9. springboot的异常处理
  10. 带分页存储管理系统中计算机应用自考,自考计算机应用基础试题及答案
  11. unity 报错 Some objects were not cleaned up when closing the scene. 原因与方案
  12. python列表功能默写_python 1 默写用递归实现无限极分类 2 默写用树实现无限极分类...
  13. “我 33岁,阿里程序员,税后年薪170万,不配征婚?”
  14. Trinity进行转录组组装(2))
  15. 前端项目如何向一个后端项目传递数组?(批量删除如何传参)
  16. OGG(ORACLE GOLDENGATE 12.3)安装与学习文档教程
  17. 【cocos creater】6.仿《弓箭传说》- 控制主角移动(附源码)
  18. 应用预测建模第六章线性回归习题6.3【缺失值插补,分层抽样,预测变量重要性,重要预测变量如何影响响应变量,多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网】
  19. 腾讯应用宝认领应用步骤(详细)
  20. APP - 京东退货上门取件自动变成自己邮寄?

热门文章

  1. 安卓手机连接蓝牙打印机实现打印功能
  2. 数据挖掘软件 clementine软件的基本操作
  3. 学期总结(随时更新)
  4. CListCtrl使用
  5. 简约而不简单的CountDownLatch
  6. 方形矩形中心渐开线算法结合鼠标特征码刷怪
  7. 计算机技术与科学系列笔记
  8. Android 无 EditText 情况下接受扫码枪扫描数据
  9. SAP HANA efashion案例(eFashion on HANA)
  10. CF467D Fedor and Essay