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

    ​Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置 ...

  2. java的split方法中的regex参数

    我们需要以|进行分割,为了匹配|本身,正则中采用\|进行转义,而Java中\也表示转义,从java到正则需要必须使用\\|进行转义,即split中的\\表示正则的转义.

  3. 利用 Nginx 搭建小型的文件服务器

    利用 Nginx 搭建小型的文件服务器 1.查看 Nginx 配置 android@localhost:/etc/nginx/conf.d$ nginx -hnginx version: nginx/ ...

  4. COS控制台进阶 - 文件预览和在线编辑

    导语 | COS控制台新上线了文件预览功能,用户可在控制台内直接预览.编辑文件内容. 前不久,微软发布了 vscode for web 的公告,是基于web的在线代码编辑器,无需下载安装可以直接在we ...

  5. html 随笔-水平控件不对齐的解决办法

    分别在左右两个控件的css代码中加上 vertical-align:top. 便可对齐:(推荐使用,因为这样可以避免脱标流). 来源: https://www.jianshu.com/p/f00d51 ...

  6. DEDEcms手机网站添加详情内页上一页/下一页的翻页功能

    修改文件include/arc.archives.class.php文件. 1.搜索 function GetPreNext($gtype='') 2.将这个函数的所有内容替换为 function G ...

  7. Win7 ASP连接数据库“未找到提供程序.该程序可能未正确安装”问题

    是自己装的64位Windows 7系统的原因,默认64位环境下,IIS应用程序池未启用32位应用程序,我们只需要启用一下就可以了.打开IIS 7,定位到"应用程序池",然后选择使用 ...

  8. Linux系列(35) - 光盘yum源搭建(2)

    光盘搭建yum源 背景 当前Linux服务器没有网络,yum源下载好了,在光盘中 step-01 挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/ ...

  9. 测试验收标准checklist

    需求实现功能清单 功能实现目的 需求改造功能清单 关联功能清单 关联系统 端到端全流程场景 业务联系性场景 业务全流程场景 上下需求关联规则 业务角度在流程中关注项 财报.评级 授信方案 反洗钱 面向 ...

  10. django forms的常用命令及方法(二)

    根据别人网上发布,个人爱好收集 1.创建Form类 from django.forms import Form from django.forms import widgets from django ...