美文网首页
通过Nacos动态刷新Spring Cloud Gateway的

通过Nacos动态刷新Spring Cloud Gateway的

作者: huan1993 | 来源:发表于2021-06-17 17:06 被阅读0次

    一、背景

    最近在学习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上网关的配置

    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

    相关文章

      网友评论

          本文标题:通过Nacos动态刷新Spring Cloud Gateway的

          本文链接:https://www.haomeiwen.com/subject/hpbcyltx.html