Gateway 简介

是什么?

Spring Cloud 全家桶中有个很重要的组件:网关。在 1.x 版本中使用的是 Zuul 网关,但是到了 2.x,由于Zuul的升级不断跳票,Spring Cloud 自己研发了一套网关组件:Spring Cloud Gateway。

Spring Cloud Gateway基于 Spring Boot 2.x,Spring WebFlux 和 Project Reactor 构建,使用了 Webflux 中的 reactor-netty 响应式编程组件,底层使用了 Netty 通讯框架。

详见:官网

能干嘛?

反向代理

鉴权

流量控制

熔断

日志监控

......

网关在微服务架构中的位置

Gateway 的三大概念

Route(路由):路由是构建网关的基本模块,它由 ID、目标 URI、一系列的断言和过滤器组成,如果断言为 true 则匹配该路由

Predicate(断言)参考的是 Java8 中的 java.util.function.Predicate。开发人员可以匹配 HTTP 请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

Filter(过滤):指的是 Spring 框架中 GatewayFilter 的实例,使用过滤器,可以在请求被路由之前或之后对请求进行修改

工作流程

Clients make requests to Spring Cloud Gateway. If the Gateway Handler Mapping determines that a request matches a route, it is sent to the Gateway Web Handler. This handler runs the request through a filter chain that is specific to the request. The reason the filters are divided by the dotted line is that filters can run logic both before and after the proxy request is sent. All “pre” filter logic is executed. Then the proxy request is made. After the proxy request is made, the “post” filter logic is run.

翻译:客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序。该处理程序通过特定于请求的过滤器链来运行请求。 筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有 “前置“ 过滤器逻辑均被执行,然后发出代理请求,发出代理请求后,将运行“ 后置 ”过滤器逻辑。

总结:路由转发 + 执行过滤器链

两种配置方式

配置文件方式

我们以访问「百度新闻网」为例,添加如下配置

server:
port: 9527
spring:
application:
name: cloud-gateway9527
cloud:
gateway:
routes:
- id: news # 路由id
uri: http://news.baidu.com # 真实调用地址
predicates:
- Path=/guonei # 断言,符合规则进行路由

浏览器虽然输入 localhost:9527/guonei,却会转发到指定的地址

编码方式

新增配置文件

@Configuration
public class GatewayConfig {
@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
return builder.routes()
.route("news2", r -> r.path("/guoji").uri("http://news.baidu.com"))
.build();
}
}

效果:

动态路由

开启后,默认情况下 Gateway 会根据注册中心注册的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能

spring:
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
routes:
- id: payment_routh1
#uri: http://localhost:8001 #静态,写死了地址,只能调用一个服务
uri: lb://CLOUD-PAYMENT-SERVICE #动态,lb://微服务名
predicates:
- Path=/payment/get/**
- id: payment_routh2
#uri: http://localhost:8001
uri: lb://CLOUD-PAYMENT-SERVICE
predicates:
- Path=/payment/lb/**

Predicate 的使用

时间相关配置

After:在指定时间之进行路由

Before:在指定时间之进行路由

Between:在指定时间之进行路由

predicates:
- Path=/payment/lb/**
#- After=2020-04-25T16:30:58.215+08:00[Asia/Shanghai]
#- Before=2020-04-25T16:40:58.215+08:00[Asia/Shanghai]
- Between=2020-04-25T16:35:58.215+08:00[Asia/Shanghai],2020-04-25T16:40:58.215+08:00[Asia/Shanghai]

上述配置的时间格式可以通过以下代码得到

@Test
public void test(){
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
}

请求相关配置

Cookie

配置说明:【Cookie=cookie名, cookie值的正则表达式规则】

predicates:
- Path=/payment/lb/**
- Cookie=id, [0-9]

使用 curl 工具模拟携带 cookie 发送请求

Header

配置说明:【Header=header名, header值的正则表达式规则】

predicates:
- Path=/payment/lb/**
- Header=h, [a-h]

Host

配置说明:【Host=主机名(可配置多个,也可以使用通配符)】

predicates:
- Path=/payment/lb/**
- Host=**.a.com,**.b.cn

Method

配置说明:【Method=请求类型】

predicates:
- Path=/payment/lb/**
- Method=GET

Path

配置说明:【Path=请求路径】

predicates:
- Path=/payment/lb/**

Query

配置说明:【Query=参数名,参数值】

predicates:
- Path=/payment/lb/**
- Query=name, zhangsan

详见:官网

Filter 的使用

  • 生命周期:pre、post
  • 种类:GatewayFilter、GlobalFilter

GatewayFilter 在官方文档有几十种!详细配置可参考 官网,这里主要介绍自定义全局过滤器。

@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String username = exchange.getRequest().getQueryParams().getFirst("username");
//用户名为空时,给出错误响应
if (username == null) {
log.info("用户名为空,非法登录");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
} @Override
public int getOrder() {
return 0;
}
}


获取完整代码

SpringCloud-Gateway 网关路由、断言、过滤的更多相关文章

  1. 【springcloud】API Gateway 的路由和过滤(Zuul--1)

    转自:https://blog.csdn.net/pengjunlee/article/details/87084646 Zuul是什么? API Gateway 是随着微服务(Microservic ...

  2. spring cloud gateway网关路由分配

    1, 基于父工程,新建一个模块 2,pom文件添加依赖 <dependencies> <dependency> <groupId>org.springframewo ...

  3. SpringCloud(四)GateWay网关

    GateWay网关 概述简介 Gateway是在 Spring生态系统之上构建的AP网关服务,基于 Spring5, Spring Boot2和 Project Reactor等技术. Gateway ...

  4. SpringCloud之网关 Gateway(五)

    前面我们在聊服务网关Zuul的时候提到了Gateway,那么Zuul和Gateway都是服务网关,这两个有什么区别呢? 1. Zuul和Gateway的恩怨情仇 1.1 背景 Zuul是Netflix ...

  5. 使用Gateway配置路由以及动态路由

    1. 新建module cloud-gateway-gateway9527 2. pom.xml <!--注意不需要web模块依赖,否则报错--> <?xml version=&qu ...

  6. springboot gateway 动态路由-01

    SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发 ...

  7. SpringCloud Gateway入门

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

  8. ⑥SpringCloud 实战:引入gateway组件,开启网关路由功能

    这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...

  9. 【SpringCloud技术专题】「Gateway网关系列」(3)微服务网关服务的Gateway全流程开发实践指南(2.2.X)

    开发指南须知 本次实践主要在版本:2.2.0.BUILD-SNAPSHOT上进行构建,这个项目提供了构建在Spring生态系统之上API网关. Spring Cloud Gateway的介绍 Spri ...

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

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

随机推荐

  1. 一 JVM垃圾回收模型

    一 JVM垃圾回收模型 一. GC算法 1.1 标记-清除算法(Mark-Sweep) 算法分为"标记"和"清除"两个阶段首先标记出所有需要回收的对象,然后回收 ...

  2. coding++:win10家庭版升级专业版方案

    win10家庭版升级专业版密钥: VK7JG-NPHTM-C97JM-9MPGT-3V66T 4N7JM-CV98F-WY9XX-9D8CF-369TT FMPND-XFTD4-67FJC-HDR8C ...

  3. Ubuntu在Anaconda中安装TensorFlow GPU,Keras,Pytorch

    安装TensorFlow GPU pip install --ignore-installed --upgrade tensorflow-gpu 安装测试: $ source activate tf ...

  4. 一些常用关键字的用法(一.static)

    17:36:26 2020-04-05 又是充实的一天,刚刚开始学习不久java的我,从面向过程的语言转变到面向对象的语言,在思想上上还是需要花费很多时间转变的.今天学习到了这几个关键字了,觉得这几个 ...

  5. 20175314 《Java程序设计》第十周学习总结

    20175314 <Java程序设计>第十周学习总结 教材学习内容总结 进程与线程:一个进程的进行期间可以产生多个线程. Java内置对多线程的支持,计算机只能执行线程中的一个,Java虚 ...

  6. 安装 MySQL 过程记录

    最近安装 MySQL 时 遇到了许多问题,记录一下安装过程以及遇到的问题. 第一步:在官网上下载适合自己版本的 MySQL,我选择的是 Windows 64 位免安装版的:    官网地址:https ...

  7. RocketMQ调研

    一.发展历程 早期淘宝内部有两套消息中间件系统:Notify和Napoli. 先有的Notify(至今12历史),后来因有序场景需求,且恰好当时Kafka开源(2011年),所以参照Kafka的设计理 ...

  8. A 组队参赛

    时间限制 : - MS   空间限制 : - KB  评测说明 : 1s,256m 问题描述 一年一度的ioiAKer大赛即将来临,何老板打算让信竞队的同学们组队参赛.信竞队共n名队员,他们的CF积分 ...

  9. F - F HDU - 1173(二维化一维-思维)

    F - F HDU - 1173 一个邮递员每次只能从邮局拿走一封信送信.在一个二维的直角坐标系中,邮递员只能朝四个方向移动,正北.正东.正南.正西. 有n个需要收信的地址,现在需要你帮助找到一个地方 ...

  10. 华为五年自动化测试工程详细解说:unittest单元测试框架

    一.单元测试框架说明 ​ 单元测试是指在编程中,针对程序模块的最小单元(类中的方法)进行正确性检验的测试工作.python+selenium自动化测试中通常使用unittest或者pytest作为单元 ...