在微服务架构中,我们会遇到这样的问题:1.在调用微服务时,需要鉴权,微服务不能任意给外部调用。但是,多个微服务如果都需要同一套鉴权规则,明显会产生冗余,如果鉴权方法需要修改,则需要改动多个地方。2.在前端调用服务的时候,前端需要根据不同的服务配置,找到对于服务的IP,端口等信息,才能完成对应调用。如果中间有修改或者有扩展时,这会显得很麻烦,尤其是在微服务越来越多的时候。

  有没有一种方式,提供一个统一的入口,统一鉴权,配置路由,解决上面两个问题?Spring Cloud Gateway为我们提供了很好的解决方案。在Finchley版本之前,Spring Cloud使用netflix的Zuul完成类似的功能。在Finchley之后,我们更推荐使用Spring Cloud自行开发的Gateway,Gateway对比Zuul 1.0具有更好的性能和集成性。

  该项目提供了一个建立在Spring Ecosystem之上的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为他们提供横切关注点,例如:安全性,监控/指标和弹性。

01.配置使用

添加gateway依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

02.工作流程

 
image.png

  客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序运行通过特定于请求的过滤器链发送请求。滤波器被虚线划分的原因是滤波器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤器逻辑,然后进行代理请求。在发出代理请求之后,执行“post”过滤器逻辑。

03.详细配置

1.路由谓词工厂(具体的配置和说明已注释到代码中)
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
#指定时间前的路由地址
- id: before_route
uri: http://www.baidu.com
predicates:
- Before=2017-01-20T17:42:47.789-07:00
#指定时间之间的路由地址
- id: before_route
uri: http://www.sohu.com
predicates:
- Between=2020-01-20T17:42:47.789-07:00,2020-01-21T17:42:47.789-07:00
#指定时间后的路由地址
- id: before_route
uri: http://www.sina.com
predicates:
- After=2019-05-20T17:42:47.789-07:00
#指定Cookie中有指定值的路由地址,这里注意有两个参数,第一个为Cookie的Key,第二个为正则表达式
- id: cookie_route
uri: http://www.qq.com
predicates:
- Cookie=chocolate,[A-Za-z]+
#指定Header中有指定值的路由地址,有两个参数,第一个为Header的Key,第二个为正则表达式
- id: header_route
uri: http://www.163.com
predicates:
- Header=X-Request-Id, \d+
#指定Host的路由
- id: host_route
uri: http://www.360.com
predicates:
- Host=**.somehost.org,**.anotherhost.org
#指定请求方法的路由
- id: method_route
uri: http://www.baidu.com
predicates:
- Method=GET
#segment作为参数,可以在接口后台获取
- id: params_route
uri: lb://test-client-service
predicates:
- Path=/test/{segment}
filters:
#SetPath filter 使用模版参数,修改请求路径
- SetPath=/{segment}
#AddRequestHeader过滤器添加Request头
- AddRequestHeader=X-Request-Foo, Bar
#ip地址控制路由,192.168.1.1
- id: remoteaddr_route
uri: http://localhost:8090
predicates:
- RemoteAddr=192.168.1.1
#url中带有params查询的,如:http://localhost:9005/getUser?params=111,params后还可以加正则表达式,如:params,\d+
- id: query_route
uri: lb://test-client-service
predicates:
- Query=params

  

2.过滤工厂

路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应,路径过滤器的范围限定为特定路径。

 #以下为过滤工厂,过滤工厂与谓词工厂同级

        filters:
#AddRequestHeader过滤器添加Request头
- AddRequestHeader=X-Request-Foo, Bar #AddRequestParameter过滤器添加参数头
- AddRequestParameter=bar, barValue #AddResponseHeader过滤器添加返回Response头
- AddResponseHeader=X-Response-Foo, 123 #PrefixPath添加前缀,如请求为/getUser,则会转成/mypath/getUser
#- PrefixPath=/mypath #往exchange添加PRESERVE_HOST_HEADER_ATTRIBUTE
- PreserveHostHeader #结合redis限流
#redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求
#redis-rate-limiter.burstCapacity:令牌桶的容量,允许在一秒钟内完成的最大请求数
- name: RequestRateLimiter
args:
key-resolver: "#{@remoteAddrKeyResolver}"
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 5 #RedirectTo 重定向,第一个参数是状态码,必须是3xx,第二个参数是要重定向的地址
#- RedirectTo=302, http://www.baidu.com #删除NonProxy头信息,默认删除
#Connection
#Keep-Alive
#Proxy-Authenticate
#Proxy-Authorization
#TE
#Trailer
#Transfer-Encoding
#Upgrade
#可以通过spring.cloud.gateway.filter.remove-non-proxy-headers.headers配置要删除得到头信息
- RemoveNonProxyHeaders #RemoveRequestHeader 删除指定头信息filter
- RemoveRequestHeader=X-Request-Foo #RemoveResponseHeader 删除返回头信息filter
- RemoveResponseHeader=X-Response-Foo #RewritePath过滤工厂,下面这个写法的意思是把请求都带上前缀/foo,如请求是/example,则真正到达后台的请求会变成/foo/example
- RewritePath=/(?<segment>.*), /foo/$\{segment} #RewriteResponseHeader 重写ResponseHeader,三个参数,第一个是头的key值,第二个是需要替换的值,第三个是替换后的值,其中第二个参数可以使用正则表达式来匹配
- RewriteResponseHeader=X-Response-Foo, 123, 321 #SaveSession 会话保存过滤器
- SaveSession #SecureHeaders 默认往返回的response添加以下header,可以通过配置spring.cloud.gateway.filter.secure-headers 修改需要添加的header
# X-Xss-Protection:1; mode=block
# Strict-Transport-Security:max-age=631138519
# X-Frame-Options:DENY
# X-Content-Type-Options:nosniff
# Referrer-Policy:no-referrer
# Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
# X-Download-Options:noopen
# X-Permitted-Cross-Domain-Policies:none
- SecureHeaders #SetResponseHeader ,修改responseHeader
- SetResponseHeader=X-Response-Foo1, modifyValue #SetStatus 设置返回的状态,可以是code(如404,401,403),也可以是对应的描述(注意描述中间的空格要用下划线替换)
- SetStatus=BAD_GATEWAY #StripPrefix 除去请求的前X位,如X是2且请求是/1/2/3,则最终请求是/3,如X是2且请求是/1,则最终请求是/
- StripPrefix=0 #Retry 重试机制
#retries,默认为3,用来标识重试次数
#series,用来指定哪些段的状态码需要重试,默认SERVER_ERROR即5xx
#statuses,用于指定哪些状态需要重试,默认为空,它跟series至少得指定一个
#methods,用于指定那些方法的请求需要重试,默认为GET
#exceptions,用于指定哪些异常需要重试,默认为java.io.IOException
- name: Retry
args:
retries: 3
series:
- SERVER_ERROR
methods:
- GET
- POST
exceptions:
- java.lang.RuntimeException # RequestSize 请求最大size
- name: RequestSize
args:
maxSize: 1000

  

3.Hystrix过滤工厂

Hystrix是Netflix的一个库,它实现了断路器模式。Hystrix GatewayFilter允许您将断路器引入网关路由,保护您的服务免受级联故障的影响,并允许您在下游故障时提供回退响应。

#Hystrix gateway过滤器工厂,需要引入hystrix包,当请求服务超时时,请求gateway本地的fallback接口
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback
- id: ingredients-fallback
uri: lb://hystrix-service
predicates:
- Path=/fallback
filters:
- name: FallbackHeaders
args:
executionExceptionTypeHeaderName: Test-Header #此配置可配置gateway请求的超时时间
#hystrix.command.fallbackcmd.execution.isolation.thread.timeoutInMilliseconds: 5000
- Hystrix=testHystrixExtendsCommandService

  

转自:https://www.jianshu.com/p/dabf2d91fd6e

SpringCloud-Gateway的更多相关文章

  1. SpringCloud Gateway 测试问题解决

    本文针对于测试环境SpringCloud Gateway问题解决. 1.背景介绍 本文遇到的问题都是在测试环境真正遇到的问题,不一定试用于所有人,仅做一次记录,便于遇到同样问题的干掉这些问题. 使用版 ...

  2. SpringCloud Gateway入门

    本文是介绍一下SpringCloud Gateway简单路由转发使用. SpringCloud Gateway简介 SpringCloud是基于Spring Framework 5,Project R ...

  3. 使用springcloud gateway搭建网关(分流,限流,熔断)

    Spring Cloud Gateway Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 ...

  4. SpringCloud Gateway(八)

    搭建SpringCloud Gateway 创建microservicecloud-springcloud-gateway-9528工程 pom文件 依赖: <dependencies> ...

  5. 体验SpringCloud Gateway

    Spring Cloud Gateway是Spring Cloud技术栈中的网关服务,本文实战构建一个SpringCloud环境,并开发一个SpringCloud Gateway应用,快速体验网关服务 ...

  6. spring-cloud-kubernetes与SpringCloud Gateway

    本文是<spring-cloud-kubernetes实战系列>的第五篇,主要内容是在kubernetes上部署一个SpringCloud Gateway应用,该应用使用了spring-c ...

  7. SpringCloud gateway (史上最全)

    疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 ### 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家 ...

  8. springcloud gateway nullpointerexception (NettyRoutingFilter)

    最近在做一个下载功能时,发现直接调用服务是可以下载的,但是通过gateway路由下载会报NPE异常,具体如下 java.lang.NullPointerException: null at java. ...

  9. springcloud gateway 项目打包部署运行

    新建一个springboot项目然后做了一个小demo跳转到baidu pom <?xml version="1.0" encoding="UTF-8"? ...

  10. 基于springcloud gateway + nacos实现灰度发布(reactive版)

    什么是灰度发布? 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式.在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B ...

随机推荐

  1. 操作系统:diskpart常用指令(使用diskpart实现分区管理)

    配合磁盘管理一起食用,效果最佳.(我的电脑右键 -> 管理 -> 磁盘管理) status:列出主要命令 list:列出list下的命令 select disk 0:选择第一块磁盘 lis ...

  2. nginx之location配置详解及案例

    语法规则: location [=|~|~*|^~] /uri/ { … } =  开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码, ...

  3. 使用maven生成可执行jar包(包含依赖)

    零零散散找了一些文章,有些感觉好乱,自己整理一下 以下是pom.xml里的配置,本来有很多依赖包,为了不让配置看着很长,我删了一些dependencies中我自己项目中引入的jar包 <proj ...

  4. 暖春许愿季丨i春秋给你送福利

    没有一点点防备 也没有一丝顾虑 就这样出现——暖春许愿季 纳尼?这不是我的歌声里 是i春秋在搞活动 这次准备搞个大的 多大呢 看这里 你许下心愿 我帮你实现 这是一棵神奇的心愿树 是一个畅所欲言之地 ...

  5. 1 小时 SQL 极速入门(三)——分析函数

    1 小时 SQL 极速入门 前面两篇我们从 SQL 的最基础语法讲起,到表联结多表查询. 大家可以点击链接查看 1 小时 SQL 极速入门(一) 1 小时 SQL 极速入门(二) 今天我们讲一些在做报 ...

  6. VS Code实用技能1 - 代码折叠、面包屑

    VS Code实用技能 VS Code实用技能1 - 代码折叠.面包屑 一.代码折叠 ubuntu ctrl + shift + { ctrl + shift + } ctrl + k , ctrl ...

  7. Docker 查看镜像信息

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 文章首发个人网站: https://ww ...

  8. 宁撞金钟一下,不打破鼓三千,IT人要有志气,要进就进大的好的公司

    最近我也在帮一些朋友面试,再结合自身的经验,发现了一个意料之外情理之中的事情:个别挣钱能力一般或规模比较小的公司,对候选人的要求普遍比一些大公司反而高,而且工作时间普遍会比一些好公司要长. 比如一个税 ...

  9. 【Android Studio安装部署系列】五、新建你的第一个项目:HelloWorld

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 新建项目的步骤. 开始创建项目 如果是刚安装Android studio的话,点击Start a new Android Studi ...

  10. IntelliJ IDEA~gradle环境配置

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. Int ...