概念

Gateway是基于异步非阻塞模型上进行开发的,有springcloud团队开发。用来代替Zuul。

近几个月收集了收集了N份精校过的PDF版的Java八股文大全,涉及Java后端的方方面面,分享给大家。希望能帮助到大家面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

看这里: 直接获取方式点我

文档版,如下图:

内容

Route(路由)

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

Predicate(断言)

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

Filter(过滤)

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

Zuul

Zuul1基于servlet阻塞I/O的API Gateway,且进入维护
Zuul2虽然基于非阻塞I/O,但是还没有发布,且SpringCloud没有整合

优点

基于Spring Framework5, Project Reactor 和SpringBoot 2.0 进行构建
动态路由:能够匹配任何请求属性
可以对路由指定Predicate(断言) 和 Filter(过滤器)
继承Hystrix的断路器功能
集成SpringCloud服务发现功能
易于编写的Predicate(断言) 和 Filter(过滤器)
请求限流功能
支持路由重写

作用

可以不对外开放服务端,只对外开放网关

Spring Cloud Gateway工作流程

使用

1、 新建网关模型
2、 pom引入Gateway

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

3、将网关注册进eureka/Zookeeper/Consul
4、由yml网关配置。在yml中加入

spring: cloud:gateway:routes:- id: payment_routh #路由的id,没有固定规则但要求唯一,建议配合服务名-url: http://localhost:8001 #匹配后提供服务的路由地址-predicates:- Path=/payment/get/** #断言,路径相匹配的进行路由- id: payment_routh2 #路由的id,没有固定规则但要求唯一,建议配合服务名-url: http://localhost:8001 #匹配后提供服务的路由地址-predicates:- Path=/payment/1b/** #断言,路径相匹配的进行路由

5、测试
在网关中,不需要springboot的web和actuator,否则启动报错。在pom中移除即可
–启动eureka/Zookeeper/Consul、网关、服务端
–通过网关访问服务端

6、用代码配置,创建一个配置类

@Configuration
public class GatwayConfig{@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();routes .route("path_route",r -> r.path("/guonei").uri("http://baidu.com/guonei")).build();return routes.build();}
}

实现动态路由功能

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

实现

spring: cloud:gateway:discovery: locator:enabled: trueroutes:- id: payment_routh #路由的id,没有固定规则但要求唯一,建议配合服务名# -url: http://localhost:8001 #匹配后提供服务的路由地址-url: 1b://cloud-payment-service-predicates:- Path=/payment/get/** #断言,路径相匹配的进行路由- id: payment_routh2 #路由的id,没有固定规则但要求唯一,建议配合服务名#-url: http://localhost:8001 #匹配后提供服务的路由地址-url: 1b://cloud-payment-service-predicates:- Path=/payment/1b/** #断言,路径相匹配的进行路由

predicates的参数.如下为官网内容

1、所述After路线谓词工厂有一个参数,一个datetime(其是Java ZonedDateTime)。该谓词匹配在指定日期时间之后发生的请求。下面的示例配置路由后谓词:
例子1. application.yml

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]

这条路线符合2017年1月20日17:42山区时间(丹佛)之后的任何请求。

  • 获取时区
ZonedDateTime zbj = ZonedDateTime.now();//默认时区
System.out.println(zbj);

2、所述Before路线谓词工厂有一个参数,一个datetime(其是Java ZonedDateTime)。该谓词匹配在指定之前发生的请求datetime。下面的示例配置路由前谓词:
例子2. application.yml

spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

这条路线符合2017年1月20日山区时间(丹佛)之前的任何请求。

3、该Between路线谓词工厂有两个参数,datetime1并且datetime2 这是JavaZonedDateTime对象。该谓词匹配之后datetime1和之前发生的请求datetime2。该datetime2参数必须是后datetime1。以下示例配置了路由之间的谓词:
例子3. application.yml

spring:cloud:gateway:routes:- id: between_routeuri: https://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

此路线与2017年1月20日山区时间(丹佛)之后和2017年1月21日17:42山区时间(丹佛)之后的任何请求相匹配。这对于维护时段可能很有用。

4、所述Cookie路线谓词工厂采用两个参数,该cookiename和regexp(其是Java正则表达式)。该谓词匹配具有给定名称且其值与正则表达式匹配的cookie。以下示例配置cookie路由谓词工厂:
例子4. application.yml

spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p

此路由匹配具有名称为chocolate与ch.p正则表达式匹配的cookie的请求。

5、所述Header路线谓词工厂采用两个参数,报头name和一个regexp(其是Java正则表达式)。该谓词与具有给定名称的标头匹配,该标头的值与正则表达式匹配。以下示例配置标头路由谓词:
例子5. application.yml

spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+

如果请求具有名为X-Request-Id其值与\d+正则表达式匹配的标头(即,其值为一个或多个数字),则此路由匹配。

6、该Host路线谓词工厂需要一个参数:主机名的列表patterns。该模式是带有.分隔符的Ant样式的模式。谓词与Host匹配模式的标头匹配。以下示例配置主机路由谓词:
例子6. application.yml

spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org

{sub}.myhost.org还支持URI模板变量(例如)。

如果请求具有这种路由匹配Host用的头值www.somehost.org或beta.somehost.org或www.anotherhost.org。

该谓词提取URI模板变量(例如sub,在前面的示例中定义的)作为名称和值的映射,并ServerWebExchange.getAttributes()使用中定义的键将其放在中ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。这些值可供工厂使用GatewayFilter

7、所述Method路线谓词厂需要methods的参数,它是一个或多个参数:HTTP方法来匹配。以下示例配置方法route谓词:
例子7. application.yml

spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST

如果请求方法是aGET或a,则此路由匹配POST。

8、该Path路线谓词厂有两个参数:春天的列表PathMatcher patterns和所谓的可选标志matchTrailingSlash(默认true)。以下示例配置路径路由谓词:
例子8. application.yml

spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}

如果请求路径为,则此路由匹配,例如:/red/1或/red/1/或/red/blue或/blue/green。

如果matchTrailingSlash设置为false,则请求路径/red/1/将不匹配。

该谓词提取URI模板变量(例如segment,在前面的示例中定义的)作为名称和值的映射,并ServerWebExchange.getAttributes()使用中定义的键将其放在中ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。这些值可供工厂使用GatewayFilter

可以使用实用程序方法(称为get)来简化对这些变量的访问。下面的示例演示如何使用该get方法:

Map<String, String> uriVariables = ServerWebExchangeUtils.getPathPredicateVariables(exchange);String segment = uriVariables.get("segment");

9、所述Query路线谓词工厂采用两个参数:所要求的param和可选的regexp(其是Java正则表达式)。以下示例配置查询路由谓词:
例子9. application.yml

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=green

如果请求包含green查询参数,则前面的路由匹配。

application.yml

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=red, gree.

如果请求包含一个前述路线匹配red,其值相匹配的查询参数gree.的regexp,所以green和greet将匹配。

10、所述RemoteAddr路线谓词工厂需要的列表(分钟尺寸1) sources,其是CIDR的表示法(IPv4或IPv6)的字符串,如192.168.0.1/16(其中192.168.0.1是一个IP地址和16一个子网掩码)。以下示例配置一个RemoteAddr路由谓词:
例子10. application.yml

spring:cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24

如果请求的远程地址为,则此路由匹配192.168.1.10。

11、该Weight路线谓词工厂有两个参数:group和weight(一个int)。权重是按组计算的。以下示例配置权重路由谓词:
例子11. application.yml

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

这条路线会将大约80%的流量转发到weighthigh.org,将大约20%的流量转发到weightlow.org。

Spring Cloud gateway的Filter

非自定义的简单,按照文档配置即可
Spring Cloud gateway的Filte官方文档

生命周期与种类

1、生命周期-Only Two

  • pre
  • post

2、种类 - Only Two

  • GatewayFilter 单一的Filter
  • GlobalFilter 全局的Filter

自定义过滤器

新建Gateway配置类,实现GlobalFilter,Ordered接口,内容如下

@Component
public class GatewayConfig implements GlobalFilter,Ordered{@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain){//exchange可以获取到请求信息,chain用来将新的请求发出到下一个过滤链String name = exchange.getRequest().getQueryParams().getFilter("uname");if(name == null){...}return chain.filter(exchange);}//getOrder是顺序@Overridepublic int getOrder(){...return 0;}
}

【硬核】Spring Cloud Gateway(网关)相关推荐

  1. Spring Cloud Gateway网关

    Spring Cloud Gateway网关 1. 简介 Spring Cloud Gateway是Spring官网基于Spring 5.0. Spring Boot 2.0.Project Reac ...

  2. Spring Cloud Gateway网关实现短网址生成、解析、转发

    Spring Cloud Gateway网关实现短网址生成.解析.转发 1.概述 2.基础实现 3.路由处理HandlerFunction 4.配置路由 5.测试 1.概述 在一些生成二维码等场景中, ...

  3. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  4. spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定

    一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...

  5. Spring Cloud Gateway — 网关基本功能API暴露

    API网关 API网关是一种设计模式,一种在微服务体系下的经典构件.要了解最新API网关模式可以参考敖小剑写的<Service Mesh和Api Gateway关系深度探讨> 早期SOA阶 ...

  6. spring cloud gateway网关和链路监控

    文章目录 目录 文章目录 前言 一.网关 1.1 gateway介绍 1.2 如何使用gateway 1.3 网关优化 1.4自定义断言和过滤器 1.4.1 自定义断言 二.Sleuth--链路追踪 ...

  7. Spring Cloud Gateway 网关整合 Knife4j

    文章目录 1:环境准备 2:gateway服务设置 1:导包 2:yml配置 3:添加配置类,从网关服务中获取服务列表 4:重写并覆盖/swagger-resources接口 3:其他业务逻辑服务设置 ...

  8. Spring Cloud Gateway网关实战

    文章目录 介绍 基础示例 spring-cloud-gateway-service spring-cloud-gateway-sample网关 介绍 Spring Cloud Gateway是Spri ...

  9. 微服务架构spring cloud - gateway网关限流

    1.算法 在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池). ...

最新文章

  1. 前端问题多行点点点的问题
  2. 057_Unicode字符官方标准八
  3. python数据结构与算法(13)
  4. python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!
  5. bean json转kotlin_Android kotlin插件神器Json直接生成javaBean
  6. Redis Cluster搭建方法简介22211111
  7. controller调用controller的方法_SpringBoot 优雅停止服务的几种方法
  8. Linux系统扩硬盘,Linux系统硬盘扩容
  9. C# WPF动态删除指定类型控件
  10. 华为Mate 40系列开启线下预约:麒麟9000“末代”旗舰
  11. MacOS 软件 Adobe Photoshop 2022 安装使用详细教程
  12. Bit、Byte、kb、KB、MB、KiB、MiB各表示什么意思?
  13. Universal Source_free Domain Adaption论文阅读笔记
  14. python:金额数字转为人民币大写
  15. 【转】浅谈C# 多态的法力
  16. python复数类型转换_Python程序设计——复数运算(包括极坐标转换)
  17. 当金融科技遇上云原生,蚂蚁金服是怎么做安全架构的?
  18. s饥荒服务器物品id,饥荒物品代码大全
  19. Vue报错 component lists rendered with v-for should have explicit keys.
  20. 爱春秋-在线挑战-综合渗透训练全部详解(更新中)

热门文章

  1. 【破解工具】Hashcat加密破解工具
  2. 深度学习基础 - 概率的三个公理
  3. docker-compose部署单机版nacos(自定义数据库)
  4. docker-compose安装kafka
  5. java 把ascll转换成char_java中 怎么把一个ascii转换成字符串
  6. 关于给hexo博客增加每日一言(诗句,影视名句,网易云热评等)
  7. 云主机试用,云主机最高14天试用
  8. 【学习笔记】人工智能相关概念
  9. 【概率论】指数分布 Exponential Distribution
  10. 顺丰快递商家寄件发货接口API类型和接入流程方案【快递100接口Demo】