17.Spring-Cloud-Zuul之服务路由配置
服务路由配置
Spring Cloud Zuul通过与Spring Cloud Eureka的整合,实现了对服务实例的自动化维护.
我们只需要zuul.routes.<route>.path与zuul.routes.<route>.serviceId参数对的方式进行配置
如下:
/order-service/**规则请求路径转发到名为order-service的服务实例上去的路由规则。其中<route>可以指定任意的路由名称
zuul.routes.order-service.path=/order-service /**
zuul.routes.order-service.serviceId=order-service
除了上面的配置,还有一种更加简洁的配置方式为
zuul.routes.<serviceId>=path
zuul.routes.order-service=/order-server/**
关于:/order-server/** 这种为路径匹配
URL路径 | 说明 |
/order-service /? | 匹配/order-server/之后拼接一个任务字符串的路径,如/order-service /a,/order-service /b,/order-service /c, |
/order-service /* | 匹配/order-server/之后拼接任意字符的路径,如/order-service /a,如/order-service /aa,如/order-service /aaa,但是无 法匹配/order-service /aa/bb这样的路径 |
/order-service /** | 匹配/order-service /*包含的内容之外,还是可以匹配形容/order-service /aa/bb这样的路径 |
服务路由的默认规则
Spring Cloud Eureka与Spring Cloud Zuul的整合已经为我们省去了维护服务实例清单的大量配置,剩下只需要在维护请求路径的匹配表达式与服务名的映射关系。但是你会发现我们的配置规则几乎都会采用服务名作为外部请求的前缀,如下:
zuul.routes.order-service.path=/order-service/**
zuul.routes.order-service.serviceId=order-service
path的前缀使用了order-service,二对应的服务名称也是order-service。对于这种配置,zuul默认实现了这样的配置,当用Spring Cloud Zuul构建API网关并且整合Spring Cloud Eureka,它会为Eureka中的每个服务自动创建一个默认的路由规则,这些默认的规则的path会使用serviceId配置的服务名称作为请求前缀。
由于默认的规则会为在Eureka上注册的服务,都会被zuul自动创建映射关系来进行路由,这样会使一些不对外开放的服务也可能被访问到。zuul提供了zuul.ignored-services参数来设置一个服务名匹配表达式来定义不自动创建路由的规则。那么zuul会跳过该服务,不为其创建路由规则。
如:zuul.ignored-services=*,Zuul将对所有的服务都不会自动创建路由规则.这样我们需要手动添加那个服务想创建映射关系。
自定义路由映射规则
在实际开发中,可能会为每一个微服务起一个版本号为了迭代开发,如order-service-v1,userservice-v1,order-service-v2,userservice-v2,默认情况下,Zuul自动为服务创建的路由表达会采用服务名作为前缀,比如上面服务为产生的路由为order-service-v1/**,userservice-v1/**,这种不方便管理,我们可能希望产生这样的路由方式/v1/order-service/**,/v1/userservice/**.
针对上面Zuul提供了自定义路由规则。
/如果想将服务Id [rest-service-v1]映射到/v1/rest-service/**
//那么路由服务id规则为(?<name>.*)-(?<version>v.*$)
//请求路由为${version}/${name}
public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } /** * http://localhost:8777/v1/feign-consumer/feign-consumer * @return */ @Bean public PatternServiceRouteMapper serviceRouteMapper() { //官方源码推荐的方式 return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); } }
测试
启动注册中心,服务提供者,服务消费者,api网关。
输入:http://localhost:8777/v1/feign-consumer/feign-consumer
当开发者在API网关中定义了PatternServiceRouteMapper实现之后,只要符合第一个餐宿定义规则的服务名,都会优先使用该实现构建出路径表达式,如果没有匹配上的服务则还是会使用默认的路由规则,从下面的控制台输出就可以看出来。
控制台打印:
忽略表达式(更加细粒度的路由配置)
Zuul提供了一个忽略表达式参数zuul.ignored-patterns.该参数可以用来设置不希望被API网关进行路由的URL表达式。
如:
zuul.ignored-patterns=/**/getUserInfo/**
zuul.routes.order-service.path=/order-service/**
zuul.routes.order-service.serviceId=order-service
当通过http://localhost:8777/order-service/getUserInfo是不会被路由的,会报404.
路由前缀
为了方便全局地为路由规则增加前缀信息,Zuul提供了zuul.prefix参数来进行设置。
微信公众号