转载

修改服务网关路由后,你还在重启服务么?

修改服务网关路由后,你还在重启服务么?

Spring Cloud Alibaba | Nacos动态网关路由

本篇实战所使用Spring有关版本:

SpringBoot:2.1.7.RELEASE

Spring Cloud:Greenwich.SR2

Spring CLoud Alibaba:2.1.0.RELEASE

背景介绍

在Spring Cloud微服务体系下,常用的服务网关有Netflix公司开源的Zuul,还有Spring Cloud团队自己开源的Spring Cloud Gateway,其中NetFlix公司开源的Zuul版本已经迭代至2.x,但是Spring Cloud并未集成,目前Spring Cloud集成的Spring Cloud Zuul还是Zuul1.x,这一版的Zuul是基于 Servlet 构建的,采用的方案是阻塞式的多线程方案,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。Spring Cloud自己开源的Spring Cloud Gateway则是基于 SpringWebflux 来构建的, SpringWebflux 有一个全新的非堵塞的函数式 ReactiveWeb 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API, Websockets得到支持,并且由于它与Spring紧密集成,将会得到更好的开发体验。

本文将基于Gateway服务网关来介绍如何使用Nacos的配置功能来实现服务网关动态路由。

实现方案

在开始之前我们先介绍一下具体实现方式:

  1. 路由信息不再配置在配置文件中,将路由信息配置在Nacos的配置中。

  2. 在服务网关Spring Cloud Gateway中开启监听,监听Nacos配置文件的修改。

  3. Nacos配置文件一旦发生改变,则Spring Cloud Gateway重新刷新自己的路由信息。

环境准备

首先,需要准备一个Nacos服务,我这里的版本是使用的Nacos v1.1.3。

工程实战

创建工程gateway-nacos-config,工程依赖pom.xml如下:

  • 在使用Spring Cloud Alibaba组件的时候,在  <dependencyManagement> 中需配置  spring-cloud-alibaba-dependencies ,它管理了Spring Cloud Alibaba组件的版本依赖。

配置文件application.yml如下:

  • spring.cloud.nacos.discovery.server-addr :配置为Nacos服务地址,格式为ip:port

接下来进入核心部分,配置Spring Cloud Gateway动态路由,这里需要实现一个Spring提供的事件推送接口 ApplicationEventPublisherAware ,代码如下:

这里主要介绍一下 refreshRouting() 这个方法,这个方法主要负责监听Nacos的配置变化,这里先使用参数构建一个 ConfigService ,再使用 ConfigService 开启一个监听,并且在监听的方法中刷新路由信息。

Nacos配置如图:

修改服务网关路由后,你还在重启服务么?

配置格式选择JSON,Data ID和Group与程序中的配置保持一致,注意,我这里的程序配置了namespace,如果使用默认namespace,可以不用配置。

这里配置了一个路由 /meteor1993 ,直接访问这个路由会访问到作者的Github仓库。

剩余部分的代码这里就不一一展示了,已经上传至代码仓库,有需要的同学可以自行取用。

测试

启动工程,这时是没有任何路由信息的,打开浏览器访问:http://localhost:8080/meteor1993 ,页面返回404报错信息,如图:

同时,也可以访问链接:http://localhost:8080/actuator/gateway/routes ,可以看到如下打印:

打开在Nacos Server端的UI界面,选择监听查询,选择namespace为 springclouddev 的栏目,输入DATA_ID为 zuul-refresh-dev.json 和Group为 DEFAULT_GROUP ,点击查询,可以看到我们启动的工程gateway-nacos-config正在监听Nacos Server端,如图:

修改服务网关路由后,你还在重启服务么?

笔者这里的本地ip为:192.168.44.1。监听正常,这时,我们修改刚才创建的配置,将里面的 refreshGatewayRoute 修改为 true ,如下:

点击发布,可以看到工程gateway-nacos-config的控制台打印日志如下:

这时,我们的工程gateway-nacos-config的路由已经更新成功,访问路径:http://localhost:8080/actuator/gateway/routes ,可以看到如下打印:

我们再次在浏览器中访问链接:http://localhost:8080/meteor1993 ,可以看到页面正常路由到Github仓库,如图:

修改服务网关路由后,你还在重启服务么?

总结

至此,Nacos动态网关路由就介绍完了,主要运用了服务网关端监听Nacos配置改变的功能,实现服务网关路由配置动态刷新,同理,我们也可以使用服务网关Zuul来实现基于Nacos的动态路由功能。

基于这个思路,我们可以使用配置中心来实现网关的动态路由,而不是使用服务网关本身自带的配置文件,这样每次路由信息变更,无需修改配置文件而后重启服务。

目前市面上使用比较多的配置中心有携程开源的Apollo,服务网关还有Spring Cloud Zuul,下一篇文章我们介绍如何使用Apollo来实现Spring Cloud Zuul的动态路由。

修改服务网关路由后,你还在重启服务么?

原文  https://mp.weixin.qq.com/s/UXC3NPPa1Wqobn7D2YHZXQ
正文到此结束
Loading...