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

    角色删除方法 [HttpPost] [ValidateAntiForgeryToken] public async Task<ActionResult> Delete(string id) ...

  2. mysql多次连接后会产生最大失败值

    解决办法 可以更改max_connection_errors的值,即提高允许的max_connection_errors的数量 1.进入mysql 1)首先查看该属性设置为多大:命令:show glo ...

  3. vue el-transfer新增拖拽排序功能---sortablejs插件

    <template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 -  --> ...

  4. python库--flask--创建嵌套蓝图

    这里没有对内容进行py文件分割, 可以自己根据框架自己放入对应位置 以下代码生成一个 /v1/myapp/test 的路由 from flask import Flask app = Flask(__ ...

  5. gitlab安装CI问题汇总

    0.设置gitlab获取代码的存放位置 vim /etc/gitlab-runner/config.toml 1.unable to access http://gitlab-ci-token:xxx ...

  6. Mac下Sublime Text3配置Python开发环境

    设置Sublime Text的语法为python View -> syntax ->python 设置编译环境(默认python版本2.7) Tools -> Build Syste ...

  7. 消息队列之 kafka 集群搭建

    我们先弄清楚kafka集群环境首先需要些什么 JDK 10+ Zookeeper Kafka 2.x 首先准备三台虚拟机 centos7 ,更改IP地址为静态地址分别为,29.30.31 cd /et ...

  8. DEDECMS首页循环调用一级栏目和二级栏目的实现方法

    调用方法: {dede:channelartlist typeid='2'} <li class="First"><a href="{dede:fiel ...

  9. linux下部署Elasticsearch6.8.1版本的集群

    一.准备工作 安装包的下载:elasticsearch-6.8.1.tar.gz 集群服务器:A     B 一.单节点elasticsearch的安装部署 a.进入es的下载目录home:解压tar ...

  10. sqlalchemy 查询结果转json个人解决方案

    参考了网上很多资料,自己搞了一个适合的 在model 内增加一个函数: class User(db.Model): __tablename__ = 'user' userid = db.Column( ...