【转发】zuul的各种配置详解

原文地址:https://www.iteye.com/blog/huan1993-2424676

我们知道我们前台要展示数据给用户看,这中间可能涉及到从后端的多个微服务进行获取数据。比如获取用户信息需要用到用户微服务、获取商品信息需要获取商品微服务、创建订单需要调用订单微服务,而各个微服务可能分布在各个机器上,前端要获取到数据就必须要知道各个微服务的地址,这给前端增加开发的复杂性。一段后端的某个微服务地址改变了,前端可能还要修改。而且后端各个微服务权限认证也不好认证,那么有没有一种好的解决办法呢?服务网关就正好可以解决这个问题,在 spring cloud 中使用的就是zuul来实现服务网关。我们来看一下有了服务网关后,前端程序调用后端服务。

由上可知,当存在服务网关,前端程序通过服务网关调用后台服务,同时我们也可以在网关层进行各种操作,比如限流、权限校验等。

实现功能

1、查看 zuul 中配置好的路由和过滤器信息
2、忽略所有微服务或某些微服务
3、忽略所有为服务,只路由指定的微服务
4、通过path和url访问到具体的某台机器上
5、脱离eureka进行访问,并使之具有负载均衡和隔离的机制等
6、转发前是否去掉路由前缀
7、为所有路由都增加一个通过的前缀
8、忽略某些路径不进行路由
9、敏感头的传递(比如Cookie等)全局设置和某个微服务设置
10、忽略头
11、spring security 在classpath 下会忽略的头
12、本地调换和路由的优先级
13、配置网关超时
14、重写 Location 头
15、文件上传处理

代码结构

eureka-server  
    |- 服务注册中心  
    zuul  
        product-provider-8202  
        product-provider-8203  
            |- 服务提供者  
        product-consumer-8201  
            |- 服务消费者  
        product-gateway-8204  
            |- 网关程序,演示网关路由的各种配置  

代码编写

一、服务提供者、服务消费者、注册中心,没有什么需要特别注意的,略。

二、服务网关的编写

   1、创建网关工程
   2、引入 zuul 的依赖
   3、启动类上增加 @EnableZuulProxy 注解
   4、yml 文件上注册到 eureka 上

三、eureka服务启动界面

功能实现

1、查看 zuul 中配置好的路由和过滤器信息

当我们启动了zuul 的网关之后,想知道当前zuul代理了那些路由,访问的路径又是那些或者我们自己写了一个zuul的filter,想知道它当前位于zuul的filter的那个位置时,该如何查询。

   **访问路径:** http://网关地址:端口/routes  访问路由的简单信息
                 http://网关地址:端口/routes?format=details  访问路由的详细信息
                 http://网关地址:端口/filters 访问zuul中使用了那些过滤器。


   **yml文件配置:**

Yml代码::

management:  
  security:  
    enabled: false  # 默认值是 true, 为true的话那么页面上可能会报没有权限访问  

不进行配置,访问上面的2个端点会报没有权限访问。

2、忽略所有微服务或某些微服务

默认情况下,只要引入了zuul后,就会自动一个默认的路由配置,但有些时候我们可能不想要默认的路由配置规则,想自己进行定义

    **忽略所有微服务:(后面写 * )**
zuul:  
  ignored-services: product-provider,product-consumer-8201 

忽略某些微服务:(直接写微服务的名字=>可以理解为spring.application.name的值,多个以都好分隔)

zuul:  
  ignored-services: product-provider,product-consumer-8201 

3、忽略所有为服务,只路由指定的微服务

访问: http://gatewayhost:port/product/selectOne ===> 转发到 product-provider上的selectOne

四、通过path和url访问到具体的某台机器上

有时候我们测试的时候需要访问到具体的某台机器上,而不希望负载均衡到别的机器上或者需要访问到第三方的某台机器上。

zuul:  
  routes:  
    product-provider:  
      path: /product/**  
      url: http://localhost:8202/  

注意:
1、product-provider 这个值可以随便写,即使是一个不存在的值
2、这种方式访问不会作为 HystrixCommand 来进行访问。
3、url 里面也不可以写多个url

五、脱离eureka进行访问,并使之具有负载均衡和隔离的机制等

运行结果:

六、转发前是否去掉路由前缀

七、为所有路由都增加一个通过的前缀

有些时候我们系统所有的路由都有一个统一的前缀进行访问,此时就可以使用 zuul.prefix 进行统一添加。

八、忽略某些路径不进行路由

有些时候,我们某些微服务的某些地址不希望被第三方客户调用到,需要被隐藏起来,此时就可以使用网关路由这些url不进行路由。

zuul:  
  ignored-patterns: /**/selectOne/**  
  routes:  
    product-provider: /product/**  

注意: 这个忽略是全局忽略,即对所有的微服务都进行忽略

九、敏感头的传递(比如Cookie等)全局设置和某个微服务设置

有些时候我们微服务上游可能想传递一些请求头到下游的服务,比如Token、Cookie等值,默认情况下,zuul 不会将 Cookie,Set-Cookie,Authorization这三个头传递到下游服务,如果需要传递,就需要忽略这些敏感头。

全局和局部设置敏感头:

运行结果:


注意:

1、可以看到访问 product 路由时,是可以获取到 敏感头中 cookie 的信息的,访问 consumer 路由无法获取到。
2、如果下游服务启用了hystrix,那么 RequestInterceptor 要想从 ThreadLocal 中获取request的值,需要将隔离策略修改成信号量。

十、忽略头 (链接

有些时候,我们不想将某个头传递到其它所有的微服务中,就可以使用忽略头,忽略头是全局配置的,如果想在某个服务中忽略某个头,可以使用敏感头忽略。

zuul:  
  routes:  
    product-provider:  
      path: /product/**  
      serviceId : product-provider  
  ignored-headers: token  # 全局忽略头,忽略 token 这个请求头,不向下游服务传递这个token请求头  

zuul.ignored-headers: token** 表示被zuul路由的服务都不会传递 token 这个请求头。

十一、spring security 在classpath 下会忽略的头

当我们的 spring security 在classpath中,zuul 会为我们增加一个默认的 spring security 相关的忽略头,如果我们不想要忽略,将 zuul. ignore-security-headers: false 就可以了。

# spring security 在classpath 下会忽略的头  
zuul:  
  routes:  
    product-provider:  
      path: /product/**  
      serviceId : product-provider  
  ignore-security-headers: false  # 为true会忽略spring security安全头,如果下游需要用到需要设置成false  

十二、本地调换和路由的优先级

有些时候,我们页面上访问到的某些路径,想让网关直接进行处理,而不是直接转发到后端的服务上,此时就可以使用到路由的跳转。 有些时候 ** /product/ext/**** 想路由product-provider-ext 服务上,

/product/**** 想路由product-provider 服务上,此时在 yml 文件中顺序配置**即可。

十三、配置网关超时

如果是通过 url 进行配置的,那么需要设置下面这个超时时间

十四、重写 Location 头

如果Zuul面向Web应用程序,那么当Web应用程序通过http状态代码3XX重定向时,可能需要重写Location头,否则浏览器将最终重定向到Web应用程序的url而不是Zuul url。


十五、文件上传处理

在微服务中,有时候我们经常需要用到文件的上传,当使用了服务网关 zuul 后,对于小的文件是可以上传成功的,那么对于大的文件就会报错,此处应该如何处理呢?

对于大文件的上传,我们需要绕过 Spring 的 DispatcherServlet。在 spring cloud zuul 中我们只需要在路由的前面加上 /zuul( zuul.servletPath) 前缀即可。

从上图中可以看到,对于大文件的上传,是加上了 /zuul 的前缀的。

完整代码

服务网关配置代码: https://gitee.com/huan1993/spring-cloud-parent/tree/master/zuul

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容