spring cloud gateway nacos搭建动态路由

一、环境

开发工具:IntelliJ Idea
JDK 1.8
Spring boot 2.3.12.RELEASE
spring cloud Alibaba 2.2.7.RELEASE
Nacos 2.0.4
spring cloud Hoxton.SR12

二、基于Nacos的微服

点击进入【基于Nacos的微服务】
程序源码

三、gateway程序目录

四、配置文件

  • 3.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jwssw</groupId><artifactId>microservice-gateway</artifactId><version>1.0.0-SNAPSHOT</version><!--父继承--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/></parent><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring.cloud.version>Hoxton.SR12</spring.cloud.version><alibaba.cloud.version>2.2.7.RELEASE</alibaba.cloud.version><fastjson.version>2.0.4</fastjson.version><lombok.version>1.18.24</lombok.version><hutool.version>5.8.1</hutool.version></properties><!--管理器--><dependencyManagement><dependencies><!--引入spring cloud依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--引入spring cloud alibaba依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${alibaba.cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- spring-boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- spring cloud gateway 依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos 服务注册/发现 客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!--lombok依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><!-- hutool 依赖 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><!--构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
  • 3.2、application.yml

有关nacos的配置,可根据自己的实际情况进行调整配置。
config标签中的内容,可自行配置

server:port: 8000# spring 配置
spring:application:name: gateway-servercloud:# nacos客户端配置nacos:# nacos服务注册与发现discovery:server-addr: 127.0.0.1:8844,127.0.0.1:8846,127.0.0.1:8848# nacos服务配置config:server-addr: 127.0.0.1:8844,127.0.0.1:8846,127.0.0.1:8848namespace: c6340cf4-c9af-4a4e-b8c3-526e708c56b2group: GATEWAY_GROUPfile-extension: yaml# 网关配置gateway:discovery:locator:# 服务名小写lower-case-service-id: true# 配置
config:# 动态dynamic-route:# nacos 配置dataIddataId: gateway-routes# 分组group: ${spring.cloud.nacos.config.group}# nacos服务地址server-addr: ${spring.cloud.nacos.config.server-addr}# 命名空间namespace: ${spring.cloud.nacos.config.namespace}

五、程序代码

  • 5.1、启动类
package com.jwssw;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 类描述:网关启动类** @version 1.0* @date 2022/5/19 15:35* @slogan 设计就是代码,代码就是设计* @since JDK 8*/
@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
  • 5.2、动态路由加载类
package com.jwssw.gateway.config;import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;/*** 类描述:通过Nacos的配置动态更新网管路由* <pre>*     ApplicationEventPublisherAware 是由 Spring 提供的用于为 Service 注入 ApplicationEventPublisher 事件发布器的接口,使用这个接口,*     我们自己的 Service 就拥有了发布事件的能力。用户注册后,不再是显示地调用其他的业务 Service,而是发布一个用户注册事件。* </pre>** @version 1.0* @date 2022/5/26 11:00* @slogan 设计就是代码,代码就是设计;创建好的软件是一项学习和思考的活动。* @since JDK 8*/
@Slf4j
@RefreshScope
@Component
public class DynamicRouteConfig implements ApplicationEventPublisherAware {/** 常量 */private static final String PROPERTIES_SERVER_ADDR = "serverAddr";private static final String PROPERTIES_NAMESPACE = "namespace";private static final String PROPERTIES_GROUP = "group";/** nacos 配置dataId */@Value("${config.dynamic-route.dataId:gateway-routes}")private String dataId = "gateway-routes";/** nacos 配置group */@Value("${config.dynamic-route.group:GATEWAY_GROUP}")private String group = "GATEWAY_GROUP";/** nacos 配置地址 */@Value("${config.dynamic-route.server-addr}")private String serverAddr;/** nacos 命名空间 */@Value("${config.dynamic-route.namespace}")private String namespace;/** 已加载的路由id集合 */private static final List<String> ROUTE_LIST = new ArrayList<>();private final RouteDefinitionWriter routeDefinitionWriter;/** 事件发布器 */private ApplicationEventPublisher applicationEventPublisher;/*** 方法描述: 构造函数** @param routeDefinitionWriter 路由定义写对象* @date 2022/5/26 15:25* @slogan 设计就是代码,代码就是设计;创建好的软件是一项学习和思考的活动。*/public DynamicRouteConfig(RouteDefinitionWriter routeDefinitionWriter) {this.routeDefinitionWriter = routeDefinitionWriter;}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.applicationEventPublisher = applicationEventPublisher;}/*** 方法描述: 从Nacos的配置中加载动态路由** @date 2022/5/26 15:11* @slogan 设计就是代码,代码就是设计;创建好的软件是一项学习和思考的活动。*/@PostConstructpublic void loadRouteFromNacosAndListener() {try {ConfigService configService = NacosFactory.createConfigService(getProperties());// 程序启动时调用Nacos的配置进行路由加载String initConfigInfo = configService.getConfig(dataId, group, 5000);addRouteAndPublish(initConfigInfo);// 添加监听路由变化addListener(configService);} catch (NacosException e) {log.error("加载路由配置错误,详情:", e);}}/*** 方法描述: 添加监听** @param cs 配置服务对象* @date 2022/5/26 15:24* @slogan 设计就是代码,代码就是设计;创建好的软件是一项学习和思考的活动。*/private void addListener(ConfigService cs) throws NacosException {// 添加监听cs.addListener(dataId, group, new Listener() {@Overridepublic void receiveConfigInfo(String configInfo) {// 将监听到的路由加载到路由定义器中addRouteAndPublish(configInfo);}@Overridepublic Executor getExecutor() {return null;}});}/*** 方法描述: Nacos配置属性** @return {@link Properties}* @date 2022/5/26 15:23* @slogan 设计就是代码,代码就是设计;创建好的软件是一项学习和思考的活动。*/private Properties getProperties() {Assert.notBlank(serverAddr, "Nacos的服务地址为空了!");Properties properties = new Properties();properties.put(PROPERTIES_SERVER_ADDR, serverAddr);if (StrUtil.isNotBlank(namespace)) {properties.put(PROPERTIES_NAMESPACE, namespace);}if (StrUtil.isNotBlank(group)) {properties.put(PROPERTIES_GROUP, group);}return properties;}/*** 添加并发布配置的路由** @param configInfo 路由配置字符串;格式:JSON数组*/private void addRouteAndPublish(String configInfo) {// 加载前需要清空有存在的路由clearRoute();// 解析从Nacos配置中读取的路由配置信息List<RouteDefinition> gatewayRouteDefinitions = JSONObject.parseArray(configInfo, RouteDefinition.class);for (RouteDefinition routeDefinition : gatewayRouteDefinitions) {// 将路由写到定义器中routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();// 将路由id加入内存集合中ROUTE_LIST.add(routeDefinition.getId());}// 刷新路由定义器this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter));}/*** 方法描述: 清空已存在的路由** @date 2022/5/26 15:22* @slogan 设计就是代码,代码就是设计;创建好的软件是一项学习和思考的活动。*/private void clearRoute() {ROUTE_LIST.forEach(id -> this.routeDefinitionWriter.delete(Mono.just(id)).subscribe());ROUTE_LIST.clear();}
}

六、测试

  • 6.1、Nacos配置动态路由
  • 6.1、APi调用

七、总结

  1. 这个最小可运行的Gateway项目,主要结合spring clound官网、Nacos官网的文档进行搭建的。其中Nacos的服务注册、发现和gateway项目必须在一个命名空间中,否则无法通过lb的方式调用到业务微服务。
  2. 在学习新技术的时候,最好先阅读官网并根据示例实操一段代码。
  3. 在Nacos中配置动态路由时,注意配置是的字符串不要写错了,我本人因把order-server写成了order-serve导致通过gateway调用微服务提示“503”。

八、参考

Gateway+Nacos动态路由
Gateway + Nacos 实现动态路由

spring cloud gateway nacos搭建动态路由相关推荐

  1. spring cloud gateway nacos 网关设置

    前期准备:可参考上一篇,spring cloud nacos 服务提供.服务消费(Feign.RestTemplate)及Hystrix熔断设置 1.下载安装 Nacos 服务中心(下载地址 http ...

  2. spring cloud gateway+nacos 服务下线感知延迟,未及时出现503,请求依然转发到下线服务

    spring cloud gateway服务下线感知延迟,未及时出现503 1.场景描述 2.分析 2.1定位问题 3.解决方案 本篇算是配合之前的一篇了.整体问题是gateway对下线服务感知延迟, ...

  3. 前后端分离,解决Spring Cloud GateWay + Nacos使用lb请求报503错误以及403跨域问题

    在使用前后端分离时,前端请求gateway接口,gateway使用lb负载均衡请求目标服务. 如下: spring:cloud:gateway:routes:- id: test-demouri: l ...

  4. Spring cloud Gateway 源码(二) 路由流程

    目录 1.DispatcherHandler 1.1 handle方法 1.1.1 getHandler 获取请求处理器 1.1.2 invokeHandler 执行 2.路由选择 2.1  选择目标 ...

  5. Spring Cloud整合Nacos实现动态配置

    前提 已经安装并启动了nacos-server服务端. 整合 创建一个maven工程并引入以下依赖: <dependency><groupId>org.springframew ...

  6. nacos oaut服务地址_用户认证的例子:Spring Security oAuth2 + Spring Cloud Gateway + Nacos + Dubbo...

    这个例子是商城后台项目的一部分,主要使用了oAuth2的密码模式完成用户名密码认证功能.主要流程是:使用Nacos作为注册中心,操作用户的服务user-mgr-service作为服务提供者,注册到Na ...

  7. 记录 Spring Cloud GateWay 使用 路径与路由名字重复 出现的问题

    大家好,我是小文,这篇文章是我使用 SCG 所出现的问题.在这里记录一下. 1.某个服务中新建了一个控制器Controller,没有遵循网关的路由匹配规则,报错404: 2.路由规则与注册服务名出现重 ...

  8. 搭建一套ASP.NET Core+Nacos+Spring Cloud Gateway项目

    前言 伴随着随着微服务概念的不断盛行,与之对应的各种解决方案也层出不穷.这毕竟是一个信息大爆发的时代,各种编程语言大行其道,各有各的优势.但是有一点未曾改变,那就是他们服务的方式,工作的时候各司其职, ...

  9. 三分钟了解Spring Cloud Gateway路由转发之自动路由

    文章目录 一.前言 二.路由配置 1. 静态路由 2. 动态路由 3. 自动路由 三.Spring Cloud Gateway 是如何实现动态路由 工作原理 源码解析 路由转发原理 路由转发源码解析 ...

最新文章

  1. 5.matlab 中的sort
  2. CentOS下安装ZooKeeper
  3. OpenLayers事件处理Event.js(七)
  4. bmob php支付,基于Bmob在小程序端实现一键支付
  5. VTK:Utilities之ObserveError
  6. C++ decltype类型说明符(尾置返回类型使用)
  7. 标准配置的Windows平台上潜在可用屏幕区域
  8. jsoup教程_2 http-client 讲解
  9. HTTP 状态码大全
  10. 数值计算实验1 Matlab基础实验
  11. Python绘制心形图案
  12. ded汉语意思_DED是什么意思
  13. html文件引用.vue 文件的方式
  14. 按了锁定计算机,鼠标锁定了按什么键解锁
  15. ES5 Array新方法reduce()  数组累加
  16. 解读华为云应用平台ROMA,黑科技实现一站式政企上云
  17. 【uml】-九种图之活动图(Activity Diagram))
  18. 灾难恢复_灾难恢复–以及如何避免需要它!
  19. 小程序picker标题_微信小程序实现自定义picker选择器弹窗内容
  20. 883.三维形体投影面积

热门文章

  1. 2021年中国奶油行业上市企业对比分析:海融科技VS 立高食品[图]
  2. NumPy科学计算库(1)Python数据分析
  3. MTC生态最新的落地应用,连环竞技场即将耀世而来
  4. el-select 默认选中第一个,动态静态获取
  5. 实习生两大杀手之一:Git 引入
  6. 西方经济学的十大原理
  7. Zookeeper 安装配置(大数据工程师工作笔记)
  8. Flowlayout流式布局使用(轻量级)
  9. CodeLite IDE for windows (一)安装及HelloWorld
  10. P8-Windows与网络基础-Windows基本命令-目录文件操作(cd、dir、md、rd、move、copy、xcopy、del)