概述
这里介绍 一下Zuul的路由。Zuul的路由包含两种路由。
1. 传统路由。
2. 面向服务路由。
传统路由
不依赖服务发现机制,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由。这里我们需要根
根据服务实例的数量采用不同方式的配置来实现路由规则 。
1.单实例配置
通过zuul.routes..path与zuul.routes..url参数对的方式进行配置。
zuul.routes.user-service.path=/user-service/**
zuul.routes..user-service.url=http://localhost:8080/
2.多实例配置
通过zuul.routes..path与zuul.routes..serviceId参数对的方式进行配置。
zuul.routes.user-service.path=/user-service/**
zuul.routes..user-service.serviceId=user-service
ribbon.eureka.enabled=false
user-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/
该实例配置了对符合/user-service/**规则的请求路径转发到http://localhost:8080/,http://localhost:8081/两个实例地址的
路由规则 。serviceId是由用户手工命名的服务名称。配合ribbon.listOfServers参数实现服务与实例的维护。由于存在多个实例,AP
I网关在进行路由转发时候需要实现负载均衡。
ribbon.eureka.enabled:由于会使用serviceId指定的是服务名称,该示例没有整合eureka服务治理框架,所以参数是false.
user-service.ribbon.listOfServers:和serviceId的配置对应。
服务器路由配置
只是需要zuul.routes..path和zuul.routes..serviceId参数对的方式进行配置。
zuul.routes.api-a.path=/api-a/**
zuul.routes..api-a.serviceId=eureka-client
zuul.routes.api-b.path=/api-b/**
zuul.routes..api-b.serviceId=feign-consumer
eureka.client.serviceUrl.defaultZone=http://localhost:11111/eureka/
还有一种简化的配置,zuul.routes.=,其中用来指定路由的具体服务名,就是路由的地址。
服务路由的默认规则
zuul.routes.user-service.path=/user-service/**
zuul.routes..user-service.serviceId=user-service
对于这种的serviceId和path是对应的 ,有规则性的配置,zuul中的每个服务都自动创建一个默认路由规则,这些默认规则的path
会使用serviceId配置的服务名作为请求前缀。
这里有一个zuul.ignored-services参数来设置一个服务名匹配表达式来定义不自动创建路由的规则。那么Zuul将跳过该服务,不会为
创建规则。比如zuul.ignored-services=*的时候,Zuul将对所有的服务都不自动创建路由规则。
路由匹配
通配符 |
说明 |
? |
匹配任意单个字符 |
* |
匹配任意数量的字符 |
* |
匹配任意数量的 字符,支持多级目录 |
可能会遇到以下的情况:
zuul.routes.user-service.path=/user-service/**
zuul.routes..user-service.serviceId=user-service
zuul.routes.user-service.path=/user-service/ext/**
zuul.routes..user-service.serviceId=user-service-ext
这种情况如果调用user-service-ext的服务,会同时匹配到user-service和user-service-ext两个client。这个时候回优先调用在前
这里调用的是user-service中的服务。
遇到这个时候怎么解决呢,其实就是调一下顺序了,亲。
路由前缀
zuul.prefix=/api,可以全局为路由规则增加前缀信息,会在网关上的路由规则都增加/api前缀。同时可以设置zuul.strip-prefix=false
来关闭该移除代理前缀的操作。zuul.routes..stripPrefix=false指定路由关闭移除代理前缀。
本地跳转
在Zuul实现的API网关路由功能中,支持forward形式的服务端跳转配置。举个例子
zuul.routes.api-a.path=/api-a/**
zuul.routes..api-a.url=http://localhost:8001/
zuul.routes.api-b.path=/api-b/**
zuul.routes..api-b.url=/local
api-a是请求正常的,api-b的服务会定位到/local,比如是在/api-b/hello,会转发到/local/hello上去。
Cookie和头信息
Zuul在请求路由的时候,会过滤掉HTTP请求头信息中的一些敏感信息,防止被传递到下游的外部服务器。默认的敏感头信息通过
zuul.sensitive-headers设置,包含Cookie,Set-Cookie、Authorization三个数星星。。在Zuul中默认是不会传递的。当使用安全
框架的时候,可能会使用到Cookie或者是Authorization的信息,为了解决问题,可以配置
zuul.sensitive-headers=
通过设置全局参数为空来覆盖默认实现。
通过指定路由的参数配置
1.zuul.routes..customSensitiveHeaders=true
对指定路由开启自定义敏感头
2.zuul.routes..sensitiveHeaders=
将特定路由的敏感痛殴设置为空
Hystrix 和Ribbon支持
在zuul中包含了对Hystrix和Ribbon的支持,但是在path和url实现路由转发的时候,不会使用HystrixCommand包装,所以这类路由没有
线程隔离和熔断器保护,也不会有负载均衡的能力。所以尽量使用path和serviceId,也可以使用Hystrix和Ribbon的参数来调整路由请
求的各种超时时间等配置。