spring Cloud网关之Spring Cloud Gateway
Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/)

Spring Cloud Gateway是建立在Spring 5, Spring Boot 2 and Project Reactor这几个项目上的API网关,它是由spring团队自己开发的,spring的亲儿子。Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到api,并为它们提供跨领域的关注点,例如:安全性、监控/度量和弹性。
cloud全家桶在1.x版本中推荐用的网关是zuul,但是在2.x版本中,Zuul的升级一直跳票,spring团队最后自己研发了一个网关代替Zuul,就是Spring Cloud Gateway。Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则是使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway有什么用?
- 性能:API高可用,负载均衡,容错机制。
- 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
- 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
- 缓存:数据缓存。
- 监控:记录请求响应数据,api耗时分析,性能监控。
- 限流:流量控制,错峰流控,可以定义多种限流规则。
- 灰度:线上灰度部署,可以减小风险。
- 路由:动态路由规则。

Spring Cloud Gateway的特性:
1、动态路由:能够匹配任何请求属性。
2、可以对路由指定Predicate(断言)和Filter(过滤),断言和过滤易于编写。
3、集成Hystrix断路器功能、Eureka服务发现功能。
4、请求限流功能,支持路径重写。
在Spring Cloud Finchley正式版之前推荐使用的网关是Netflex提供的Zuul,在此之后推荐使用的是Spring Cloud Gateway。
Spring Cloud Gateway和Zuul的区别:
1、Zuul 1.x是一个基于阻塞I/O的API网关。
2、Zuul 1.x是基于Servlet 2.5使用阻塞架构的,它不支持任何长连接(如WebSocket),Zuul的设计模式和Nginx较像,每次I/O操作都是从工作线程中选择一个执行,请求线程阻塞到工作线程完成,但是差别是Nginx是用C++实现的,Zuul是用Java实现的,而JVM本身会有第一次加载比较慢的情况,使得Zuul性能会相对较差。
3、Zuul 2.x理念是基于Netty非阻塞和支持长连接,性能方面比Zuul 1.x有很大的提升,但是因为Netflex跳票,还没有发布 。根据官方提供的基准测试,Spring Cloud Gateway的RPS(每秒请求数)是Zuul的1.6倍。
4、Spring Cloud Gateway是建立在Spring 5, Spring Boot 2 and Project Reactor之上,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则是使用了高性能的Reactor模式通信框架Netty,是一个非阻塞I/O的API网关。
5、Spring Cloud Gateway还支持WebSocket,并且与Spring紧密集成拥有更好的开发体验。
Spring Cloud Gateway三大核心概念:
1、Route(路由):路由是构建网关的基本模块,它是由ID、目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
2、Predicate(断言):参考的是Java8中的java.util.function.Predicate,开发人员匹配HTTP请求中的内容进行断言,如果请求与断言匹配则路由。
3、Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器可以在请求被路由前或者之后对请求进行修改。
Spring Cloud Gateway工作流程如下官网提供的图片:
1、客户端向Spring Cloud Gateway发送请求,然后在Gateway Hangdler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。
2、Handler再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
3、过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或者之后(“post”)执行业务逻辑。
4、Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等。在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等。
5、核心逻辑就是路由转发和执行过滤器链。

Spring Cloud Gateway实践
1、gateway在pom.xml加以下依赖包:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.4.BUILD-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2、gateway配置文件如下进行配置:
server:
port: 8080
tomcat:
uri-encoding: UTF-8
basedir: /tmp/tomcat
connection-timeout: 60000 spring:
application:
name: demo-gateway
cloud:
gateway:
discovery:
locator:
#开启从注册中心动态创建路由的功能,利用微服务名进行路由
enabled: true
routes:
- id: demo-client
#uri: http://localhost:8101
uri: lb://demo-client
predicates:
- Path=/consumer/consumer/**
#路由的id,没有固定规则,建议配合服务名使用
- id: demo-user
#提供服务的路由地址
#uri: http://localhost:8100
uri: lb://demo-user
#断言,路径相匹配就进行路由
predicates:
- Path=/user/user/** eureka:
instance:
hostname: gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://localhost:8761/eureka/
3、在GatewayApplication加上注解@EnableDiscoveryClient
4、访问http://localhost:8080/user/user/test?msg=1235

Spring Cloud Gateway服务网关github地址:https://github.com/yuanzipeng/spring-cloud-gateway

spring Cloud网关之Spring Cloud Gateway的更多相关文章
- Spring Cloud 网关服务 zuul 二
有一点上篇文章忘了 讲述,nacos的加载优先级别最高.服务启动优先拉去配置信息.所以上一篇服务搭建我没有讲述在nacos 中心创建的配置文件 可以看到服务端口和注册中心都在配置文件中配置化 属性信息 ...
- Spring Cloud 网关服务 zuul 三 动态路由
zuul动态路由 网关服务是流量的唯一入口.不能随便停服务.所以动态路由就显得尤为必要. 数据库动态路由基于事件刷新机制热修改zuul的路由属性. DiscoveryClientRouteLocato ...
- 网关服务Spring Cloud Gateway(一)
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- 微服务网关实战——Spring Cloud Gateway
导读 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用.本文对Spring Clou ...
- .net core下,Ocelot网关与Spring Cloud Gateway网关的对比测试
有感于 myzony 发布的 针对 Ocelot 网关的性能测试 ,并且公司下一步也需要对.net和java的应用做一定的整合,于是对Ocelot网关.Spring Cloud Gateway网关做个 ...
- spring cloud 网关服务
微服务 网关服务 网关服务是微服务体系里面重要的一环. 微服务体系内,各个服务之间都会有通用的功能比如说:鉴权.安全.监控.日志.服务调度转发.这些都是可以单独抽象出来做一个服务来处理.所以微服务网关 ...
- SpringCloud---API网关服务---Spring Cloud Zuul
1.概述 1.1 微服务架构出现的问题 及 解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...
- Spring 5.x 、Spring Boot 2.x 、Spring Cloud 与常用技术栈整合
项目 GitHub 地址:https://github.com/heibaiying/spring-samples-for-all 版本说明: Spring: 5.1.3.RELEASE Spring ...
- Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别
注:此文章转载于其他大神 一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确 ...
随机推荐
- python之module 'unittest' has no attribute 'TestCase' 解决方案
脚本报错如下: 解决方案: 这是脚本名称冲突所导致的报错,修改脚本名中重新执行,运行正常 注:脚本取名最好不要与模块和方法一致,避免不必要的冲突
- springboot的springMVC配置,源码
1,前端控制器自动管理 DispatcherServletAutoConfiguration 中 此方法创建了前端控制器 注册了前端控制器 其中标黄色一行最后的 .getPath()方法点进去 St ...
- lin-cms-dotnetcore.是如何方法级别的权限控制的?
方法级别的权限控制(API级别) Lin的定位在于实现一整套 CMS的解决方案,它是一个设计方案,提供了不同的后端,不同的前端,而且也支持不同的数据库 目前官方团队维护 lin-cms-vue,lin ...
- [COCOS2DX-LUA]0-003.根据COCOS2DX热更新
一.最近有需求就是要基于COCOS2DX-LUA进行游戏的增量更新,找了资料,发现了COCOS2DX有自带一个热更新的类,就是AssetsManager,但是该接口对于我来说有以下的缺陷 1.版本号在 ...
- 非静态代码块(非static初始化块)&静态代码块(static初始化块)
非静态代码块: TestOrder: package com.aff.singleton; /* 类的第四个成员:初始化块(代码块) 代码块: 如果有修饰的话只能使用static 分类:非静态代码块: ...
- C/C++多参数函数参数的计算顺序与压栈顺序
一.前言 今天在看Thinking in C++这本书时,书中的一个例子引起了我的注意,具体是使用了下面这句 单看这条语句的语义会发现仅仅是使用一个简单的string的substr函数将所得子串pus ...
- Web-从Java Request对象到HTTP协议
https://mp.weixin.qq.com/s/PjcA22STEDGwRxVQweObQQ Java Web中的Request对象是哪里来的?Response对象的角色是什么? Java We ...
- Linux (四) 基础命令 下
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.查看文件内容 1.命令 cat 对应单词:concatenate 作用:查看文件内容 常用参数: ...
- Java实现 LeetCode 433 最小基因变化
433. 一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 "A", "C", "G", "T"中的任意一 ...
- Java实现 LeetCode 223 矩形面积
223. 矩形面积 在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积. 每个矩形由其左下顶点和右上顶点坐标表示,如图所示. Rectangle Area 示例: 输入: -3, 0, 3, 4 ...