Spring Cloud / Alibaba 微服务架构 | 2021年11月更文挑战(23)

103 阅读3分钟

这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

上篇文章我们举例说明了Predicate中and、negate、or、isEqual方法并简略解读了PathRoutePredicateFactory.apply方法的源码,本篇文章我们将介绍一下集成Alibaba Nacos实现动态路由配置。

集成Alibaba Nacos 实现动态路由配置

将Gateway的路由配置信息存储在Alibaba Nacos中,使用的是Nacos的配置存储与配置变更的特性。

静态路由配置与动态路由配置

1、静态路由配置

静态路由配置是指将微服务的配置文件写在yml文件或properties文件中,推荐使用yml文件,简单、整洁且方便梳理,端点是spring.cloud.gateway。

# 静态路由
  gateway:
    routes:
      - id: path_route # 路由的ID
        uri: 127.0.0.1:8080/user/{id} # 匹配后路由地址
        predicates: # 断言, 路径相匹配的进行路由
          - Path=/user/{id}
复制代码

稍微介绍一下上方的配置。

首先,静态路由配置的id和uri,它们指定了路由配置的标识与需要转发到的微服务的真实地址。

接下来,predicates,断言,即一个请求到达网关后我们定义了很多路由配置,那么究竟应该转发到哪个微服务的uri上呢?就是由predicates去完成匹配工作。

可以看到代码中我只定义了一个predicates,Path=/user/{id},也就是,客户端发起的请求路径中,如果包含有/user/{id}的时候,都会命中这个路由配置,最终将请求转发到8080/user/{id}上去。

由此可以看出来静态路由配置的缺点非常明显,每次改动都需要将网关模块重新打包部署。这非常不友好,所以我们可以考虑更好的做法。

2、动态路由配置

基于Alibaba Nacos的配置管理功能去实现gateway的动态路由配置。路由信息在Alibaba Nacos中维护,可以实现动态变更。

具体步骤等下次截了图再介绍。

在e-commerce-gateway子模块中创建GatewayConfig类

创建一个conf包,然后创建GatewayConfig配置类,读取Nacos相关配置项,用于配置监听器,由于是配置类,所以要加上@Configuration注解。再定义一个读取配置的超时时间、Nacos的服务器地址、命名空间、Data Id、分组Id等属性。

在set方法上使用@Value("${xxx}")注解,实现从bootstrap.yml配置文件中读取并监听然后注入命名空间和服务器地址、Data Id、分组Id等属性。

将来我们将通过配置的Nacos服务器地址、对应的命名空间、分组Id找到对应的Data Id,里面存储着路由配置信息,拿到路由配置信息然后完成解析再注入到Gateway里就完成了路由配置,对Data Id 实现一个监听,如果它发生更改,就再去刷新一下我们当前的路由配置,这就是Gateway+Nacos实现动态路由配置的大体思想。