Zuul构建微服务网关: 路由配置详解

最近公司在搞springcloud微服务迁移,从原有一个系统按照业务拆分为6个子系统,客户端的调用会变得很复杂致使难以维护。所以就须要微服务网关来解决,经过Zuul来构建微服务网关,全部外部请求都会通过微服务网关。提早学习下,做为迁移前的知识储备。本文主要记录下Zuul的路由配置相关功能;java

架构演进后的图:
使用微服务网关git

Zuul简介

首先对Zuul按照网上的概念大概作一个介绍:github

  1. Zuul是Netflix开源的微服务网关,它能够和Eureka、Ribbon、Hystrix等组件配合使用。
  2. Zuul的核心是一系列的过滤器,大体能够完成如下功能:
  • 身份认证与安全:识别每一个资源的验证要求,并拒绝那些与要求不符的请求。
  • 审查与监控: 在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 动态路由: 动态地将请求路由到不一样的后端集群。
  • 压力测试:逐渐地增长指向集群的流量,以了解性能。
  • 负载分配:为每一种负载类型分配对应容量,并弃用超过限定值的请求。
  • 静态响应处理:在边缘位置直接创建部分响应,从而避免其转发到内部集群。

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

  1. 自定义指定微服务访问路径。
    配置zuul.routes.指定微服务serviceId = 指定路径便可。例如:后端

    zuul:
    	routes:
    		microservice-provider-user: /user/** 

    这样设置,microservice-provider-user微服务就会被映射到/user/** 路径,也就是/user/开头的请求就会访问到 microservice-provider-user微服务。api

  2. 忽略指定微服务。
    忽略服务很是简单,可使用zuul.ignored-services配置须要忽略的服务,多个用逗号分隔。例如:安全

    zuul:
    	ignored-services:  microservice-provider-user

    这样就可以让Zuul忽略microservice-provider-user微服务,只代理其余微服务。架构

  3. 忽略全部微服务,只路由指定微服务。
    不少场景下,可能只想让Zuul代理指定的微服务,此时能够将zuul.ignored-services 设为 ‘*’。

    zuul:
     ignored-services:  '*' # 使用'*' 可忽略掉全部微服务
     routes:
     	microservice-provider-user: /user/** 

    这样就可让Zuul只路由microservice-provider-user映射的微服务。

  4. 同时指定微服务的serviceId和对应路径。例如:

    zuul:
    	routes:
     	#该配置方式中,user-custom-route只是给路由一个名称,能够任意起名
    	user-custom-route:
      		service-id: microservice-provider-user
      		path: /user/** # service-id对应的路径 

    这个例子配置的效果同1。

  5. 同时指定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。下面的示例将解决该问题。

  6. 同时执行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特性了。

  7. 使用正则表达式指定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/**这个路径。

  8. 路由前缀
    示例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

  9. 忽略某些路径
    上面记录中有了解如何忽略微服务,但有时还须要更细粒度的路由控制。例如。想让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的路由配置。