上一节( 跟我学Spring Cloud(Finchley版)-16-Zuul )中,已经实现用Zuul转发到Eureka上的微服务。默认的路由规则是:访问$ZUUL_URL/指定为服务/**
会被转发到指定微服务
的/**
。git
但在实际项目中,每每须要本身定义路由规则,Zuul的路由配置很是灵活、简单,本节详细讲解Zuul的路由配置。github
配置zuul.routes.指定微服务的serviceId = 指定路径
便可。例如:正则表达式
zuul: routes: microservice-provider-user: /user/**
这样设置,microservice-provider-user微服务就会被映射到/user/**路径。spring
忽略服务很是简单,能够使用zuul.ignored-services
配置须要忽略的服务,多个用逗号分隔。例如:api
zuul: ignored-services: microservice-provider-user,microservice-consumer-movie
这样就可以让Zuul忽略microservice-provider-user和microservice-consumer-movie微服务,只代理其余微服务。app
不少场景下,咱们可能只想要让Zuul代理指定的微服务,此时能够将zuul.ignored-services
设为’*’负载均衡
zuul: ignored-services: '*' # 使用'*'可忽略全部微服务 routes: microservice-provider-user: /user/**
这样就可让Zuul只路由microservice-provider-user微服务。ide
例如:函数
zuul: routes: user-route: # 该配置方式中,user-route只是给路由一个名称,能够任意起名。 service-id: microservice-provider-user path: /user/** # service-id对应的路径
本例配置的效果同示例(1)。微服务
zuul: routes: user-route: # 该配置方式中,user-route只是给路由一个名称,能够任意起名。 url: http://localhost:8000/ # 指定的url path: /user/** # url对应的路径。
这样就能够将/user/**
映射到http://localhost:8000/**
。
须要注意的是,使用这种方式配置的路由不会做为HystrixCommand执行,同时也不能使用Ribbon来负载均衡多个URL。例(6)可解决该问题。
zuul: routes: user-route: path: /user/** service-id: microservice-provider-user ribbon: eureka: enabled: false microservice-provider-user: ribbon: listOfServers: localhost:8000,localhost:8001
这样就能够既指定path与URL,又不破坏Zuul的Hystrix与Ribbon特性了。
借助PatternServiceRouteMapper,实现从微服务到映射路由的正则配置。例如:
@Bean public PatternServiceRouteMapper serviceRouteMapper() { // 调用构造函数PatternServiceRouteMapper(String servicePattern, String routePattern) // servicePattern指定微服务的正则 // routePattern指定路由正则 return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); }
经过这段代码便可实现将诸如microservice-provider-user-v1这个微服务,映射到/v1/microservice-provider-user/**这个路径。
示例1:
zuul: prefix: /api strip-prefix: false routes: microservice-provider-user: /user/**
这样,访问Zuul的/api/microservice-provider-user/1路径,请求将会被转发到microservice-provider-user的/api/1
示例2:
zuul: routes: microservice-provider-user: path: /user/** strip-prefix: false
这样访问Zuul的/user/1路径,请求将会被转发到microservice-provider-user的/user/1
TIPS:
① 可参考该Issue辅助理解: https://github.com/spring-cloud/spring-cloud-netflix/issues/1365
上文咱们讲解了如何忽略微服务,但有时咱们还须要更细粒度的路由控制。例如,咱们想让Zuul代理某个微服务,同时又想保护该微服务的某些敏感路径。此时,可以使用ignoredPatterns,指定忽略的正则。例如:
zuul: ignoredPatterns: /**/admin/** # 忽略全部包含/admin/的路径 routes: microservice-provider-user: /user/**
这样就可将microservice-provider-user微服务映射到/user/**路径,但会忽略该微服务中全部包含/admin/的路径。
读者如没法掌握Zuul路由的规律,可将com.netflix包的日志级别设为DEBUG。这样,Zuul就会打印转发的具体细节,从而帮助咱们更好地理解Zuul的路由配置,例如:
logging: level: com.netflix: DEBUG
http://www.itmuch.com/spring-cloud/finchley-17/