一、背景

最近在学习Spring Cloud Gateway,而我们的路由配置默认情况下是写在配置文件中的,这样当我们有一个新的服务接入时,需要修改配置文件,然后重启网关应用程序,那么我们是否可以在不停止网关的情况下,动态的刷新路由信息呢?

二、解决方案

我们知道,nacos是可以实现 配置的动态刷新 和 服务发现的。那么我们将 Spring Cloud Gateway的配置放到 nacos上是否就可以实现动态的刷新路由呢?

通过测试发现是可以实现的。此处我们通过 Spring Cloud Alibaba技术来实现。

1、服务的注册和发现使用 Spring Cloud Alibaba Nacos来实现。
2、网关使用 Spring Cloud Gateway来实现。

结论: 其实只需要在 Spring Cloud Gateway中整合 Spring Cloud Alibaba Nacos Config,网关的路由配置就可以自动刷新了,不需要额外的编码。

三、实现功能

1、提供一个商品服务,对外提供一个 findAllProduct 的接口返回商品信息。
2、实现一个网关服务,外部服务的访问,都先通过网关程序,然后调用到具体的服务。
3、网关服务 的路由配置信息需要可以动态的配置。

四、实现步骤

1、网关服务的实现

1、pom文件


<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>

2、bootstrap.yml配置文件

spring:
application:
name: gateway-9201
cloud:
nacos:
discovery:
# 配置 nacos 的服务地址
server-addr: localhost:8847
config:
# nacos 配置服务的地址,后面的端口不能省,即使是80端口
server-addr: localhost:8847
# 加载 dataid 配置文件的后缀,默认是 properties
file-extension: yml
# 配置组,默认就是 DEFAULT_GROUP
group: DEFAULT_GROUP
# 配置命名空间,此处写的是 命名空间的id 的值,默认是 public 命名空间
# namespace:
# data-id 的前缀,默认就是 spring.application.name 的值
prefix: ${spring.application.name} server:
port: 9201

注意: 因为配置是放置在 nacos上,所以和Spring Cloud Alibaba Nacos Config相关的配置需要放置到 bootstrap.yml配置文件中。

此处主要配置 nacos 的配置信息,不需要配置 网关的路由信息。

3、启动类

@SpringBootApplication
public class GatewayApplication { public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class);
}
}

启动类上不需要额外别的注解。

4、nacos上网关的配置

spring:
cloud:
gateway:
routes:
- id: user-9202
uri: lb://product-9202
predicates:
- Path=/user/**
filters:
- RewritePath=/user(?<segment>/?.*), $\{segment}
- id: product-9203
uri: lb://product-9203
predicates:
- Path=/product123/**
filters:
- RewritePath=/product123(?<segment>/?.*), $\{segment}

5、网关配置完成

至此网关程序就配置完成了,那么这样配置之后路由就可以动态的刷新了吗?是的。Spring Cloud GatewaySpring Cloud Alibaba nacos config整合后就自动实现了配置的自动刷新功能。

2、商品服务的实现

商品服务就是简单的提供了一个 rest api,然后注册到 nacos上,比较简单,略。

五、实现效果

六、完成代码

https://gitee.com/huan1993/spring-cloud-alibaba-parent/tree/master/gateway-dynamic-refresh-route

七、参考文档

1、https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md

最新文章

  1. asp.net ajax控件tab扩展,极品啊,秒杀其它插件
  2. Android之ListView&amp;Json加载网络数据
  3. Android版的菜谱客户端应用源码完整版
  4. search支持多种标签
  5. box2dweb之关节joint(连接器)
  6. Saltstack系列2:Saltstack远程执行命令
  7. NOIP2003 加分二叉树
  8. 我的window平台下的软件
  9. mv命令
  10. 《Effective C++》内存管理
  11. http://msh.baidu.com/UTWpR6wY4722
  12. Struts2中的ActionContext
  13. jquery 实现导航栏滑动效果
  14. 过河(bfs)
  15. chrome ipc 网摘
  16. MySQL数据库“十宗罪”(十大经典错误案例)
  17. UIScrollView的无限左滑轮播一点也不难
  18. 关于ORACLE数据库名以及数据实例名等几个重要概念
  19. 当Flutter遇到节流与防抖
  20. mssql sqlserver获取指定月份当月天数总和

热门文章

  1. SQL-DELETE触发器练习
  2. 最全Windows版本jemalloc库(5.2.1)及其使用:包含动态库和静态库、x86版本和x64版本、debug版本和release版本
  3. 【第四篇】- Maven 构建生命周期之Spring Cloud直播商城 b2b2c电子商务技术总结
  4. k8s核心资源之namespace与pod污点容忍度生命周期进阶篇(四)
  5. VS Code + WSL 搭建 RaspberryPi Pico 开发环境
  6. Jupyter Notebook 修改字体和大小
  7. Java Web实现登录验证码(Servlet+jsp)
  8. 支付宝openssl_sign(): supplied key param cannot be coerced into a private key in
  9. 【PHP】随机生成名字
  10. Apache AB(1) - 快速使用