最近公司在搞springcloud微服务迁移,从原有一个系统按照业务拆分为6个子系统,客户端的调用会变得很复杂致使难以维护。所以就须要微服务网关来解决,经过Zuul来构建微服务网关,全部外部请求都会通过微服务网关。提早学习下,做为迁移前的知识储备。本文主要记录下Zuul的路由配置相关功能;java
架构演进后的图:
git
首先对Zuul按照网上的概念大概作一个介绍:github
Zuul的github: https://github.com/netflix/zuul
Netflix如何使用Zuul: https://github.com/netflix/zuul/wiki/How-We-Use-Zuul-At-Netflixweb
Zuul
默承认以代理全部注册到Eukeka Server
的微服务. 在咱们现实生产环境中可能只想让Zuul代理部分微服务,又或者对URL进行更加精确的控制。正则表达式
Zuul的路由配置很是灵活、简单,下面我整理了一些场景,结合例子说明一下;spring
自定义指定微服务访问路径。
配置zuul.routes.
指定微服务serviceId = 指定路径便可。例如:后端
zuul: routes: microservice-provider-user: /user/**
这样设置,microservice-provider-user微服务就会被映射到/user/** 路径,也就是/user/开头的请求就会访问到 microservice-provider-user微服务。api
忽略指定微服务。
忽略服务很是简单,可使用zuul.ignored-services
配置须要忽略的服务,多个用逗号分隔。例如:安全
zuul: ignored-services: microservice-provider-user
这样就可以让Zuul忽略microservice-provider-user微服务,只代理其余微服务。架构
忽略全部微服务,只路由指定微服务。
不少场景下,可能只想让Zuul代理指定的微服务,此时能够将zuul.ignored-services
设为 ‘*’。
zuul: ignored-services: '*' # 使用'*' 可忽略掉全部微服务 routes: microservice-provider-user: /user/**
这样就可让Zuul只路由microservice-provider-user映射的微服务。
同时指定微服务的serviceId和对应路径。例如:
zuul: routes: #该配置方式中,user-custom-route只是给路由一个名称,能够任意起名 user-custom-route: service-id: microservice-provider-user path: /user/** # service-id对应的路径
这个例子配置的效果同1。
同时指定path和URL,例如:
zuul: routes: #该配置方式中,user-custom-route只是给路由一个名称,能够任意起名 user-custom-route: url: http://localhost:8011/ # 指定的url path: /user/** # url对应的路径
这样就能够将/user/**映射到http://localhost:8011/
。
须要注意的是,使用这种方式配置的路由不会做为HystrixCommand执行,同时也不能使用Ribbon来负载均衡多个URL。下面的示例将解决该问题。
同时执行path和URL,而且不破坏Zuul的Hystrix、Ribbon特性。
zuul: routes: user-custom-route: path: /user/** service-id: microservice-provider-user ribbon: eureka: enabled: false # 为Ribbon禁用Eureka microservice-provider-user: ribbon: listOfServers: localhost:8011,localhost:8010
这样就能够即指定path与URL,又不破坏Zuul的Hystrix与Ribbon特性了。
使用正则表达式指定Zuul的路由匹配规则
借助PatternServiceRouteMapper,实现从微服务到映射路由的正则配置,例如:
@Bean public PatternServiceRouteMapper serviceRouteMapper() { /** * 调用构造函数 public PatternServiceRouteMapper(String servicePattern, String r outePattern) * 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/user/1
路径,请求将会被转发到microservice-provider-user的/api/1
;
注意:strip-prefix: false 表示不去掉前缀映射到对应微服务,true表示去掉前缀。
示例2:
zuul: routes: microservice-provider-user: path: /user/** strip-prefix: false
这样访问Zuul的/user/1路径,请求将会被转发到microservice-provider-user的/user/1。
可参考Issue辅助理解:https://github.com/spring-cloud/spring-cloud-netflix/issues/1365
忽略某些路径
上面记录中有了解如何忽略微服务,但有时还须要更细粒度的路由控制。例如。想让Zuul代理某个微服务,同时又想保护该微服务某些敏感路径。此时,可以使用ignored-Patterns,指定忽略的正则。例如:
zuul: ignored-patterns: /**/admin/** # 忽略全部包含/admin/的路径 routes: microservice-provider-user: /user/**
这样就能够将microservice-provider-user微服务映射到/user/**路径,但会忽略该微服务中全部包含/admin/的路径。
上面的路由配置,都是我在本地测试过的,建议你们若是一开始没法理解掌握,能够com.netflix包的日志级别设为DEBUG。这样,Zuul就会打印转发的具体细节,有助于理解Zuul的路由配置。个人配置以下:
logging: level: com.netflix: DEBUG
本文只介绍了Zuul路由配置相关的内容,在之后使用过程当中,能够帮助理解与使用Zuul的路由配置。