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的更多相关文章

  1. Spring Cloud 网关服务 zuul 二

    有一点上篇文章忘了 讲述,nacos的加载优先级别最高.服务启动优先拉去配置信息.所以上一篇服务搭建我没有讲述在nacos 中心创建的配置文件 可以看到服务端口和注册中心都在配置文件中配置化 属性信息 ...

  2. Spring Cloud 网关服务 zuul 三 动态路由

    zuul动态路由 网关服务是流量的唯一入口.不能随便停服务.所以动态路由就显得尤为必要. 数据库动态路由基于事件刷新机制热修改zuul的路由属性. DiscoveryClientRouteLocato ...

  3. 网关服务Spring Cloud Gateway(一)

    Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...

  4. 微服务网关实战——Spring Cloud Gateway

    导读 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用.本文对Spring Clou ...

  5. .net core下,Ocelot网关与Spring Cloud Gateway网关的对比测试

    有感于 myzony 发布的 针对 Ocelot 网关的性能测试 ,并且公司下一步也需要对.net和java的应用做一定的整合,于是对Ocelot网关.Spring Cloud Gateway网关做个 ...

  6. spring cloud 网关服务

    微服务 网关服务 网关服务是微服务体系里面重要的一环. 微服务体系内,各个服务之间都会有通用的功能比如说:鉴权.安全.监控.日志.服务调度转发.这些都是可以单独抽象出来做一个服务来处理.所以微服务网关 ...

  7. SpringCloud---API网关服务---Spring Cloud Zuul

    1.概述 1.1 微服务架构出现的问题   及  解决: 1.1.1 前言 每个微服务应用都提供对外的Restful API服务,它通过F5.Nginx等网络设备或工具软件实现对各个微服务的路由与负载 ...

  8. Spring 5.x 、Spring Boot 2.x 、Spring Cloud 与常用技术栈整合

    项目 GitHub 地址:https://github.com/heibaiying/spring-samples-for-all 版本说明: Spring: 5.1.3.RELEASE Spring ...

  9. Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别

    注:此文章转载于其他大神 一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确 ...

随机推荐

  1. JavaScript编程入门

    写在前面: 不管容易还是简单 总要尝试才知道答案     1.JavaScript初探   JavaScript:轻量级脚本语言,是可插入HTML页面的编程代码. 将JavaScript插入HTML页 ...

  2. python 读取txt文件

    1.打开文件 #1)1 f = open("test.txt","r") #设置文件对象 f.close() #关闭文件 #2) #为了方便,避免忘记close ...

  3. URL特殊字符转义

    在URL中,某些特殊字符会被转义成其它项,为了使这些特殊字符能正确表达,需用%加该字符的ASCII码在URL中显示.

  4. 安装superset遇到的坑

    实验环境:ubuntu16.04 python环境: 3.6.7 安装参考:https://superset.incubator.apache.org/installation.html 特别提醒: ...

  5. 域对象的作用范围 & 请求的转发和重定向

    1. 和属性相关的方法: ①. 方法 void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name): ...

  6. Shell概述1

    Shell概述1 脚本文件内容(vim ex2) #!/bin/bash #If no arguments,then listing the current directory. #Otherwise ...

  7. 7z命令行简单使用

    7z命令行简单使用 网上有很多博客都有记录7z的命令行使用方式,但看起来乱起八糟的,不知所云. 急于使用者可以直接看实例 注:我仅仅记录我认为常用的命令,毕竟没有那么多的精力去学习不常用的东西. 简介 ...

  8. css 禁用浏览器滚动条,初始最外层包含容器 wrapper

    浏览器默认的视窗会随着滚动条滚动,绝对定位的元素会随着滚动条滚动,为了解决这个问题我们需要禁止浏览器的滚动条,然后在代码的最外层初始化一个 div(最外层包含容容器代替默认的视窗),是滚动天出现在最外 ...

  9. 【译】Gartner CWPP市场指南

    https://www.gartner.com/doc/reprints?id=1-1YSHGBQ8&ct=200416&st=sb?utm_source=marketo&ut ...

  10. [Python3]星号*的打开方式

    python中,* 号除了用来做数量乘法,还有其他的用处. 结论 概括的来说,就是对修饰的变量进行拆分, 对修饰的形式参数进行参数聚集. 单*号,将被修饰的变量按元素方式拆分, 对修饰的形式参数进行参 ...