Spring Cloud Alibaba(12)---Gatway概述、简单示例
Gatway概述、项目搭建
前言
有关网关的概念之前这里不在概述,因为之前在写zuul网关的时候有详细陈述过,地址如下:
SpringCloud(7)---网关概念、Zuul项目搭建
SpringCloud(8)---zuul权限校验、接口限流
一、Gatway概念
1.Gatway是什么?
Gatway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot2和Project Reactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,
以及提供一些强大的过滤器功能,例如:反向代理、熔断、限流、重试等。
微服务架构中网关所处位置(盗图):

2、Gatway有哪些特性?
1)、为了提升网关的性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
2)、基于SpringFramework5,ProjectReactor和SpringBoot2.0进行构建
3)、能够匹配任何任何请求属性
4)、可以对路由指定Predicates和Filters,易于编写的Predicates和Filters
5)、集成断路器
6)、集成Spring Cloud服务发现
7)、支持请求限流
8)、支持路径重写
3、Gatway三大重要概念
Gatway有着很重要的3个概念 路由、断言、过滤。
路由:路由是构建网关的基本模块,它由ID,目标URI,一系列的断言Predicates和过滤器Filters组成,如果断言为true,则匹配该路由。
断言:参考Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容,例如请求头或请求参数,如果请求与断言相匹配则进行路由。
之前有写过Predicate的文章 java代码之美(13)--- Predicate详解
过滤:Spring框架中GatewayFilter的实例,使用过滤器,可以载请求被路由前或者后对请求进行修改。
总结下就是: 一个web请求,通过一些匹配条件,定位到真正的服务节点,在这个转发的过程中,进行一些精细化的控制。predicate就是匹配条件,filter就是拦截器。
predicate + filter + 目标uri实现路由route,所以一般都是组合使用,一个请求可以经过多个predicate或者多个filter。
4、Gatway工作流程
下面是官网给的一张图,它总体上描述了Spring Cloud Gateway的工作流程

1)客户端向Spring Cloud Gateway发出请求。
2)如果Gateway Handler Mapping确定请求与路由匹配,则将其发送到Gateway Web Handler。
3)Handler通过指定的过滤器链将请求发送到我们实际的服务执行业务逻辑,然后返回。
4)过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前或之后执行逻辑。
核心:路由转发 + 过滤器链
二、Gatway与Zuul区别
Zuul有两个大版本分别为: Zuul1和Zuul2。所以要比较的话有个跟这两个版本进行比较。
1、Gatway与Zuul1比较
1)Zuul1.x是一个基于阻塞I/O的API 网关
2)Zuul1.x基于Servlet2.5使用阻塞架构,它不支持任何长连接(如WebSocket)Zuul的设计模式和Nginx比较相似,每次I/O操作都是从工作线程中选择一个执行,请求线程
被阻塞到工作线程完成,但是差别是Nginx用C++实现,Zuul用Java实现。
3) Spring Cloud Gateway建立在Spring Framewor5、Project Reactor和Spring Boot2之上,使用非阻塞API。
2、Gatway与Zuul2比较
1)首先Zuul2从产品角度来看 因为Zuul2的升级一直跳票,一下开源一下闭源。所以SpringCloud目前还没有整合Zuul2。这就带来很大的不方便。也是因此SpringCloud最后自己
研发了一个网关代替Zuul,就是SpringCloud Gateway。它才是Spring的亲儿子。
2)跟Zuul1相比Zuul2.x理念更加先进,想基于Netty非阻塞和支持长连接。Zuul2.x的性能较Zuul1.x有很大提升。在性能方面,根据官网提供的基准测试,
SpringCloud Gateway 的RPS(每秒请求数)是Zuul的1.6倍。
三、编码实现
这里先附上一张图,到目前为止,Nacos注册中心、Nacos配置中心、Feign服务调用、Sentinel流量控制 在之前的博客都有写,项目中都有实现,这里也在之前
项目的基础上开始实现Gateway功能。

1、pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、application.yml
server:
port: 8001
spring:
application:
name: api-gateway
cloud:
gateway:
routes: #数组形式
- id: mall-goods #路由唯一标识
uri: http://127.0.0.1:6001 #想要转发到的地址
order: 1 #优先级,数字越小优先级越高
predicates: #断言 配置哪个路径才转发
- Path=/mall-goods/**
#- Before=2020-09-11T01:01:01.000+08:00 # 在这个时间点之后不能访问
#- Query=source #一定携带这个参数
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第一层前缀
3、启动类
@SpringBootApplication
public class GatWayApplication {
public static void main(String [] args){
SpringApplication.run(GatWayApplication.class,args);
}
}
注意 pom文件中不能有 spring-boot-starter-web jar包。否则启动会直接报错。
4、测试
1)直接访问mall-goods地址
http://localhost:6001/api/v1/sentinel/test-sentinel

2)通过网关服务上面这个接口
http://localhost:8001/mall-goods/api/v1/sentinel/test-sentinel

发现通过服务网关地址后成功转发到商品微服务的接口。
四、配置详解
上面有讲过Gatway有着很重的3个概念 路由、断言、过滤。
id:路由的ID
uri:匹配路由的转发地址
predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。
order:路由的优先级,数字越小,优先级越高。
filters: 过滤器
一个routes下可以有多个上面的配置,上面一个配置可以理解成一个微服务节点。如果有多个微服务需要转发那么就在routes下多配置几个,示例

id
路由的ID。可以任意字符串。但如果有几十个微服务都随意取名,到时候不好找。这里用微服务的名称当成路由的ID,这样一看就知道对于那个微服务做路由转发。
uri
匹配路由的转发地址。这里好理解就是将请求网关的地址,转到具体微服务节点的地址。
predicates
配置该路由的断言。主要请求满足该断言(true)才会进入该路由。这个可以同时配置多个。多个的情况下代表需要 同时满足。
order
路由的优先级,数字越小,优先级越高。可能我们一个请求经来,同时满足匹配多个路由。那这里order谁小就进那个路由。
filters
过滤器。跟predicates一样。同时可以配置多个。多个的意思就是一个一个过滤。
上面这样解释或许有点枯燥,所以这里根据上面的实际例子来做解释。
#为什么通过配置后请求第一个url会转发到第二个url
http://localhost:8001/mall-goods/api/v1/sentinel/test-sentinel
http://localhost:6001/api/v1/sentinel/test-sentinel
步骤如下
1)首先是断言predicates 上面只配置了一个 - Path=/mall-goods/**。上面的请求中是有 /mall-goods/ 所以命中当前路由。
2)那么根据 uri: http://127.0.0.1:6001 属性,那么请求的IP+端口号 由 localhost:8001 转为 127.0.0.1:6001。
3)同时上面配置了一个过滤器 - StripPrefix=1 去掉第一层前缀,也就是去掉 /mall-goods/ 这一层。所以最终的路由转发就变成了http://127.0.0.1:6001/api/v1/sentinel/test-sentinel。 也就是商品微服务对应的请求接口。
总结:有关 predicates 和 filters 官方都提供了很多种规则实现类,我们要根据特定的需求去使用他们,如果不满足那就需要我们自定义predicates 或 filters。
github地址 nacos-feign-sentinel-gatway
参考
如何评价 spring cloud gateway? 对比 zuul2.0 主要的优势是什么?
少说多做,句句都会得到别人的重视;多说少做,句句都会受到别人的忽视。(12)
Spring Cloud Alibaba(12)---Gatway概述、简单示例的更多相关文章
- Spring Cloud Alibaba(2)---Nacos概述
Spring Cloud Alibaba(2)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- Spring Cloud Alibaba(3)---Nacos概述
Spring Cloud Alibaba(3)---nacos概述 上一篇博客讲了有关 SpringCloudAlibaba的概述,这篇开始讲SpringCloudAlibaba组件之一---Naco ...
- Spring Cloud Alibaba(13)---Sleuth概述
Sleuth概述 前言 在微服务架构中,众多的微服务之间互相调用,如何清晰地记录服务的调用链路是一个需要解决的问题.同时,由于各种原因,跨进程的服务调用失败时,运维人员希望能够通过 查看日志和查看服务 ...
- Spring Cloud Alibaba(9)---Sentinel概述
Sentinel概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统自适应保护.热点防 ...
- Spring Cloud Alibaba(8)---Feign服务调用
Feign服务调用 有关Spring Cloud Alibaba之前写过五篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring Clo ...
- Spring Cloud Alibaba(10)---Sentinel控制台搭建+整合SpringCloudAlibaba
上一篇博客讲了Sentinel一些概念性的东西 Spring Cloud Alibaba(9)---Sentinel概述 这篇博客主要讲 Sentinel控制台搭建,和 整合SpringCloudAl ...
- Spring Cloud Alibaba(4)---Nacos(注册中心)
Nacos(注册中心) 有关Spring Cloud Alibaba之前写过三篇文章. Spring Cloud Alibaba(1)---入门篇 Spring Cloud Alibaba(2)--- ...
- Spring Cloud Alibaba(6)---Nacos持久化Mysql8.0版本
Nacos持久化Mysql8.0版本 有关Nacos之前写过三篇文章. Spring Cloud Alibaba(3)---Nacos概述 Spring Cloud Alibaba(4)---Naco ...
- Spring Cloud Alibaba(11)---Sentinel+Nacos持久化
Sentinel+Nacos持久化 有关Sentinel之前有写过两篇 Spring Cloud Alibaba(9)---Sentinel概述 Spring Cloud Alibaba(10)--- ...
随机推荐
- 从本质彻底精通Git——4个模型1个周期1个史观1个工作流
一.什么是Git? Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git是Linus Torvalds为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软 ...
- C++并发与多线程学习笔记--多线程数据共享问题
创建和等待多个线程 数据和共享问题分析 只读的数据 有读有写 其他案例 共享数据的保护案例代码 创建和等待多个线程 服务端后台开发就需要多个线程执行不同的任务.不同的线程执行不同任务,并返回执行结果. ...
- 各种OJ网站,刷题必备
各种OJ网站 落谷 vijos JoyOI CodeVS Comet OJ 北京大学 浙江大学 杭州电子科技大学 信息学奥赛一本通 以上就是本蒟蒻所知的OJ网站 收集和打字应该值一个赞吧
- AOE网与关键路径
声明:图片及内容基于https://www.bilibili.com/video/BV1BZ4y1T7Yx?from=articleDetail 原理 AOE网 关键路径 数据结构 核心代码 Topo ...
- 史上最全jdk新特性总结,涵盖jdk8到jdk15!
前言 在本文中,我将描述自第8版以来Java最重要且对开发人员友好的功能.为什么会有这样的主意?在Web上,您可以找到许多文章,其中包含每种Java版本的新功能列表.但是,由于缺少文章,因此无法简要概 ...
- OO 第三单元
一.JML语言理论基础 JML 是用于对 Java 程序进行规格化设计的一种表示语言,为严格的程序设计提供了一套行之有效的方法. 我个人对于 JML 的几点看法: JML 的规格化设计相较于自然语言的 ...
- 学习WEB前端是应该自学还是参加培训机构?
先说观点,我强烈建议每个人都要自学,不要参加培训班. 我干web前端工程师这个职位已经有6年多的时间,之前在蚂蚁金服做过2年,后来离开是因为加班实在熬不住才走的,像这些已经上市的互联网公司几乎没有不加 ...
- 解决WebStorm无法正确识别Vue3组合式API的问题
1 问题描述 Vue3的组合式API无法在WebStorm中正确识别,表现为defineComponent等无法被识别: 2 尝试方案 猜想这种问题的原因是无法正确识别对应的Vue3库,笔者相信Web ...
- Spring 学习笔记(三):Spring Bean
1 Bean配置 Spring可以看做是一个管理Bean的工厂,开发者需要将Bean配置在XML或者Properties配置文件中.实际开发中常使用XML的格式,其中<bean>中的属性或 ...
- 一文教你读懂JVM的类加载机制
Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运 ...