基于Zuul、Redis和REST API实现动态路由的持久化及容错能力

作者: Vikas Anand

译者:helloworldtang

学习如何使用REST API在Zuul服务器上注册动态路由,并借助Redis使您的动态路由具备容错能力。

目标

我们将使用Zuul、Spring boot Actuator、Redis创建一个应用程序,它提供REST API来创建动态路由,查看动态路由,删除不需要的路由,从缓存和数据库中恢复以前创建的所有动态路由的功能。虽然这个应用程序展示了更多关于动态路由的信息,但是它也展示了使用spring boot-starer-redis与Redis进行交互的方式。假设Redis服务器在本地的6379端口上运行。此外,它还展示了Spring boot actuator公开的对这个应用程序很有帮助的一些URL。

步骤

我们将创建一个基于maven的Spring Boot项目。

项目结构:

项目中的文件如下所示:

pom.xml

Spring Boot应用程序启动类,添加了Zuul、Redis等特性必需的注解:

应用程序配置类,定义bean

controller类,提供了动态路由注册和删除功能的API:

Rest API请求和响应需要的POJO

DynamicRoute.java:

存储到Redis时用到的动态路由请求类。检查@RedisHash和@Id注解,这是保存、检索和删除动态路由所必需的。它也被用于Rest API请求中,用来将传入的Json转换成动态路由对象。

其它POJO:

与Redis服务器交互的DAO或repository类。使用Spring Data Redis库使得CRUD操作变得非常简单。我们只需要创建一个接口来扩展接口CrudRepository,并添加@Repository注解。请设置DynamicRouteRedisRepository所继承父类CrudRepository的泛型为DynamicRoute和String,第一个是值的类型,第二个是键的类型。

Zuul使用的Filter类。这些类都是默认类。

在Spring Boot的application.yml文件中配置Zuul和actuator:

现在,Service对于不同的功能有不同的方法。创建ZuulDynamicRoutingService类并引入必要依赖,如下所示:

添加创建动态路由的方法。下面是请求JSON示例:

ZuulRoute映射需要一个独一无二的key往map中添加route,因此API客户端应该总是为不同的请求URI和路由信息发送不同的唯一key;否则,新路由将覆盖已经存在的路由。

在每个请求中应该有所不同。它可以是任何字符串。请求URI和目标URI路径应该从“/”开始,以使route正常工作。

在ZuulDynamicRoutingService中添加一条Route的相关操作

在添加一条route时,这几行代码很重要:

此外,我们还需要在Redis缓存中添加路由信息:

按如下步骤操作,可以从Zuul Mapping和Redis缓存中删除route。

在移除一个route时,这几行代码比较重要。

完整的代码:

在服务器启动时,从Redis缓存恢复路由可以这样做:

Demo

下面展示了不同操作及其对服务器数据影响的快照列表。Spring Boot公开了URL /admin/routes来检查Zuul路由。

本地服务器下的完整URL是 。

增加路由:

查看已经添加的路由:

增加另一个路由:

再次显示已经添加的路由。查看已经添加的路由数量:

删除一个路由:

在删除一个路由后,再查看一下路由:

待办事项

通过添加一些API来停止Zuul服务器。重新启动服务器并使用 查看路由,如果它们是从Redis加载的。

总结

本文解释了在JVM运行时中使用REST API在Zuul服务器上注册动态路由。它在Redis缓存中保存路由信息。

我们展示了如何使它具有容错功能,以及如何在重新启动Zuul服务器时从Redis缓存中恢复以前的路由。

本例包含了使用Redis保存和检索数据的功能,还演示了在Spring boot/Spring MVC项目中如何在服务器启动时加载数据。

此外,像Mongo这样的数据库可以代替Redis,以更好的方式确保路由不丢失。

从GitHub下载这个项目https://github.com/vikasanandgit/zuul-route-redis。

这是另一篇关于使用Zuul的文章 ,其中一个子域的请求被路由到子路径,并且子域到子路径的路由可以动态注册。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180823B07D8Q00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券