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框架,所以定位很明确 ...
随机推荐
- 28-2 类型转换函数Cast-Convet
------------------------类型转换函数------------------------ --cast(表达式 as 数据类型) --convert(数据类型,表达式) ' as ...
- Meta标签基本使用
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><t ...
- mysql事务控制和锁定语句
MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...
- multipart_formdata
import requests def sendImg(img_path, img_name, img_type='image/jpeg'): """ :param im ...
- pytest跟unittest的优势跟劣势
一.用例编写规则 1.使用unittest编写测试用例必须遵循以下规则: 1.必须首先 导入 import unittest 2.测试类必须要继承 unittest.TestCase 3.测试方法必须 ...
- 03 . Redis集群
Redis集群方案 Redis Cluster 集群模式通常具有 高可用.可扩展性.分布式.容错等特性.Redis分布式方案一般有两种 客户端分区方案 客户端 就已经决定数据会被 存储到哪个 redi ...
- win10系统systeminfo命令的过滤用法
一.背景: 在win10系统使用systeminfo命令可以查看windows系统信息,但是,默认显示的是全部信息,由于显示内容过多,这对查看特定信息带来一定麻烦.考虑使用该命令时能否使用过滤功能,直 ...
- ASP.NET Core 依赖注入最佳实践与技巧
ASP.NET Core 依赖注入最佳实践与技巧 原文地址:https://medium.com/volosoft/asp-net-core-dependency-injection-best-pra ...
- Rocket - diplomacy - LazyModule的实例化(补)
https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg 介绍LazyModule和Node构造方法的执行过程,即实例化过程. 1. NullIn ...
- css背景图定位和浮动
网站图标引入:<link rel="shortcut icon" href="ico图标地址"> 背景图片 background-image: u ...