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

zuul的各种配置的更多相关文章

  1. Spring Cloud(Dalston.SR5)--Zuul 网关-路由配置

    Spring Cloud 在 Zuul 的 routing 阶段实现了几个过滤器,这些过滤器决定如何进行路由工作. 简单路由(SimpleHostRoutingFilter) 该过滤器运行后,会将 H ...

  2. springcloud Zuul中路由配置细节

    上篇文章我们介绍了API网关的基本构建方式以及请求过滤,小伙伴们对Zuul的作用应该已经有了一个基本的认识,但是对于路由的配置我们只是做了一个简单的介绍,本文我们就来看看路由配置的其他一些细节. 首先 ...

  3. Zuul使用Ribbon配置自动重试

    spring cloud的版本不断演进,导致很多配置的配置方式不断改变,有时某个配置在一个版本里面默认是true,后边一升级默认成了false,这点让人有点不爽. 言归正传 0.所使用版本 sprin ...

  4. Spring Cloud Zuul 2(基于配置中心的动态API网关)

    在大体了解了API Zuul 和 配置中心Config后我们来尝试完成一个基于配置中心的动态API网关 创建项目 命名为api-gateway-dynamic-route并加入config 和 Zuu ...

  5. Zuul【基础配置】

    概述:zuul底层是基于servlet,是由一系列的filter链构成. 1.路由配置 a.单例serverId映射 zuul: routes: client-a: path: /client/** ...

  6. zuul网管配置其他服务时 HTTP Status 500 – Internal Server Error

    1.这个错误是由三个原因导致的 (1).我在给类的接口命名的时候前面少加了一个/ (2)给zuul配置路由的时候多加了个服务名,serviceId名称就是spring的name,而不是eureka注入 ...

  7. springcloud<zuul过滤器简单配置与跨域设置>

    package com.wangbiao.config; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.Req ...

  8. zuul重连配置

    #retry #该参数用来开启重试机制 spring.cloud.loadbalancer.retry.enabled=true #断路器的超时时间,断路器的超时时间需要大于ribbon的超时时间,不 ...

  9. spring cloud 配置zuul实用

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 技术背景 前面我们通过Ribbon或Feign实现了微服务之间的调用和负载均衡 ...

随机推荐

  1. JS007. 深入探讨带浮点数运算丢失精度问题(二进制的浮点数存储方式)

    复现与概述 当JS在进行浮点数运算时可能产生丢失精度的情况: 从肉眼可见的程度上观察,发生精度丢失的浮点数是没有规律的,但该浮点数丢失精度的问题会100%复现.经查阅,这个问题要追溯至浮点数的二进制存 ...

  2. C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】

    多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...

  3. 源码解析Grpc拦截器(C#版本)

    前言 其实Grpc拦截器是我以前研究过,但是我看网上相关C#版本的源码解析相对少一点,所以笔者借这篇文章给大家分享下Grpc拦截器的实现,废话不多说,直接开讲(Grpc的源码看着很方便,包自动都能还原 ...

  4. TP6生成url

    和TP5生成url方式有区别, 在控制器里 需要加上 ->build(), 如 url('index/arc/list')->build(); 如果是多域名还需要指定域名,如不想加域名可以 ...

  5. 浏览器缓存旧的js文件或css文件导致没出现预期效果

    最好在加载的js或css文件后加上 ?v=1.0.0 版本号,更新js后就更改一下版本号即可

  6. Java基础系列(5)- 使用IDEA开发

    IDEA开发 下载安装IDEA https://www.cnblogs.com/gltou/p/14956060.html 使用IDEA编写helloworld 踩坑总结 run的时候提示" ...

  7. WireShark新手使用教程

    Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息.常用于开发测试过程各种问题定位.本文主要内容包括: 1.Wireshark软件下载和安装以及Wiresha ...

  8. django 使用装饰器验证用户登陆

    使用装饰器验证用户登陆,需要使用@method_decorator 首先需引用,method_decorator,并定义一个闭包 from django.utils.decorators import ...

  9. P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\( ...

  10. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...