在前面的博文中,我们介绍了Zuul在Web以及微服务集群中的应用,在本文中,我们将介绍Zuul的相关配置。
1.路由配置
1.1 简单路由
Spring Cloud在Zuul的routing阶段实现了几个过滤器,这些过滤器决定如何进行路由的工作。其中,最基本的就是SimpleHostRoutingFilter,该过滤器运行后,会将HTTP请求全部转发到“源服务”(HTTP服务),我们将其称之为简单路由。例如,一下就是简单路由的配置,它同时使用了path和url:
zuul: routes: routeTest: path: /routeTest/163 url: http://www.163.com
以上的配置访问http://localhost:8080/routeTest/163,见识跳转到163网站。为了配置简便,可以省略path,默认情况下使用routeId作为path,以下的配置省略了path配置:
zuul: routes: route163: url: http://www.163.com
访问http://localhost:8080/route163,同样会路由到163网站。实际上,要触发简单路由,配置url的值需要以http:或者https:字符串开头。
简单路由过滤器SimpleHostRoutingFilter使用HttpClient进行转发,该过滤器会将HttpServletRequest的相关数据(HTTP方法,参数,请求头等)转换为HttpClient的请求实例(HttpRequest),再使用CloseableHttpClient进行转发。在此过程中,为了保证转发的性能,使用了HttpClient的连接池功能。涉及到连接池,就需要对其进行配置,在使用简单配置时,可以使用一下两项,修改HttpClient连接池的属性。
》 zuul.host.maxTotalConnections: 目标主机的最大连接数,默认值为200。配置这一项,相当于调用了PoolingHttpClientConnectionManager的setMaxTotal方法。
》 zuul.host.maxPerRouteConnections: 每个主机的初始连接数,默认值为20。配置该项,相当于调用了PoolingHttpClientConnectionManager的setDefaultMaxPerRoute方法。
1.2 跳转路由
除了简单路由外,也支持跳转路由。当外部访问网关的A地址时,会跳转到B地址,处理跳转路由的过滤器为SendForwardFilter。跳转路由的配置代码如下
zuul: routes: helloRoute: path: /test/** url: forward:/source/hello
当外部访问/test地址时,会自动跳转到/source/hello地址。
1.3 Ribbon路由
当网关作为Eureka客户端注册到Eureka服务器是,可以通过配置serviceId将请求转发到集群的服务中。使用以下配置,可以执行Ribbon路由过滤器:
zuul: routes: sale: path: /sale/** serviceId: saleservice
与简单路由类似,serviceId也可以被省略。当省略时,将会使用routeId作为serviceId,代码如下,效果等同于上面的配置
zuul: routes: saleservice path: /sale/**
需要注意的是,如果提供的url配置项不是简单路由格式(不以http:或https开头),也不是以跳转路由格式(foward:开头),那么将会执行Ribbon路由的过滤器,将url看作一个serviceId。配置片段如下,效果与前面的两个相同
zuul: routes: sale: path: /sale/** url: saleservice
1.4 忽略路由
以上的路由规则,如果想让一个或多个服务不被路由,可以使用zuul.ignoredServices属性。例如,若想排除saleservice和bookservice这两个模块,可以这么配置zuul.ignoredServices:saleservice,bookservice。此外,还可以使用zuul.ignoredPatterns来设置不进行路由的url,配置片段如下
zuul: ignoredPatterns: /sale/noRoute routes: sales: path: /sale/** serviceId: saleservice
2. Zuul的其他配置
请求头配置
在集群的服务间共享请求头并没有什么问题,但是如果请求会被转发到其他系统,那么对于敏感的请求头信息,就需要进行处理。在默认情况下,HTTP请求的Cookie、Set-Cookie、Authorization属性不会传递到“源服务”,可以用sensitiveHeaders属性来配置敏感请求头,下面的配置对全局生效:
zuul: sensitiveHeaders: accept-language,cookie
以下的片段,仅对一个路由生效:
zuul: routes: sale: path: /sale/** serviceId: saleservice sensitiveHerders: cookie
除了使用sensitiveHeader属性外,还可以使用ignoredHeaders属性来配置全局忽略的请求头。使用该配置项后,请求与响应中所配置的头信息均被忽略:
zuul: ignoredHeaders: accept-language