zuul的各种配置

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

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

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

 

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

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

        忽略所有微服务:(后面写 * )

 

zuul:
  ignored-services: "*"

 

        忽略某些微服务:(直接写微服务的名字=>可以理解为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

posted @ 2018-06-12 15:53  huan1993  阅读(126)  评论(0编辑  收藏  举报