自定义路由映射规则
在实际进行微服务系统开发时,系统在迭代过程中,我们需要为一组相互配合的微服务定义一个版本标识来管理版本之间的关系,再根据这个标识我们可以很容易地知道哪些微服务是需要一起启动并配合使用的。例如,我们可以采用前缀一致的命名法:userprovider-v1、userprovider-v2、orderprovider-v1、orderprovider-v2。
默认情况下,Zuul自动为服务创建的路由表达式采用服务名作为前缀,比如针对userprovider-v1和userprovider-v2,它会产生/userprovider-v1和/userprovider-v2两个路由表达式来映射,但是这样生成出来的表达式规则较为单一,不利于通过路由规则来进行管理。通常的做法是为这些不同版本的微服务应用生成以版本号为路由前缀定义的路由规则,比如/vl/userprovider。这时候,通过这样具有版本号前缀的URL路径,我们就可以很容易地通过路由表达式来归类和管理这些具有版本信息的微服务了。
针对上面所述的需求,如果我们的各个微服务应用都遵循了类似userprovider-v1这样的命名规则,通过“-”分隔的规范来定义服务名和服务版本标识的话,那么,我们可以使用Zuul中自定义服务与路由映射关系的功能,实现符合上述规则的微服务自动化地创建类似/v1/userprovider/**的路由匹配规则。实现步骤非常简单,引用官方文档,只需在网关项目中,增加如下Bean实例即可:
@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
return new PatternServiceRouteMapper (
"(?<name>^.+)-(?<version>v.+$)",
"${version}/${name}");
}
开发者可以借助PatternServiceRouteMapper实例中的正则表达式自定义服务与路由映射的生成关系。其中,构造函数中的第一个参数“(?<name>^.+)-(?<version>v.+$)”是用来匹配服务名称是否符合该自定义规则的正则表达式,如若服务名称符合该自定义规则,就会按照第二个参数“${version}/${name}”的格式转换成对应的路由表达式规则。例如,userprovider-v1会转换成/vl/userprovider格式。
当开发者在网关服务中定义了PatternServiceRouteMapper实例之后,只要符合PatternServiceRouteMapper实例第一个参数“(?<name>^.+)-(?<version>v.+$)”定义规则的服务名,都会优先使用PatternServiceRouteMapper实例构建出的路由表达式,如果没有匹配上的服务则还是会使用默认的路由映射规则,即采用完整服务名作为前缀的路由表达式。