作者: 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的文章 ,其中一个子域的请求被路由到子路径,并且子域到子路径的路由可以动态注册。
领取专属 10元无门槛券
私享最新 技术干货