【硬核】Spring Cloud Gateway(网关)
概念
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(网关)相关推荐
- Spring Cloud Gateway网关
Spring Cloud Gateway网关 1. 简介 Spring Cloud Gateway是Spring官网基于Spring 5.0. Spring Boot 2.0.Project Reac ...
- Spring Cloud Gateway网关实现短网址生成、解析、转发
Spring Cloud Gateway网关实现短网址生成.解析.转发 1.概述 2.基础实现 3.路由处理HandlerFunction 4.配置路由 5.测试 1.概述 在一些生成二维码等场景中, ...
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- spring cloud gateway 网关_微服务网关Spring Cloud Gateway全搞定
一.微服务网关Spring Cloud Gateway 1.1 导引 文中内容包含:微服务网关限流10万QPS.跨域.过滤器.令牌桶算法. 在构建微服务系统中,必不可少的技术就是网关了,从早期的Zuu ...
- Spring Cloud Gateway — 网关基本功能API暴露
API网关 API网关是一种设计模式,一种在微服务体系下的经典构件.要了解最新API网关模式可以参考敖小剑写的<Service Mesh和Api Gateway关系深度探讨> 早期SOA阶 ...
- spring cloud gateway网关和链路监控
文章目录 目录 文章目录 前言 一.网关 1.1 gateway介绍 1.2 如何使用gateway 1.3 网关优化 1.4自定义断言和过滤器 1.4.1 自定义断言 二.Sleuth--链路追踪 ...
- Spring Cloud Gateway 网关整合 Knife4j
文章目录 1:环境准备 2:gateway服务设置 1:导包 2:yml配置 3:添加配置类,从网关服务中获取服务列表 4:重写并覆盖/swagger-resources接口 3:其他业务逻辑服务设置 ...
- Spring Cloud Gateway网关实战
文章目录 介绍 基础示例 spring-cloud-gateway-service spring-cloud-gateway-sample网关 介绍 Spring Cloud Gateway是Spri ...
- 微服务架构spring cloud - gateway网关限流
1.算法 在高并发的应用中,限流是一个绕不开的话题.限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击. 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池.线程池). ...
最新文章
- 前端问题多行点点点的问题
- 057_Unicode字符官方标准八
- python数据结构与算法(13)
- python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!
- bean json转kotlin_Android kotlin插件神器Json直接生成javaBean
- Redis Cluster搭建方法简介22211111
- controller调用controller的方法_SpringBoot 优雅停止服务的几种方法
- Linux系统扩硬盘,Linux系统硬盘扩容
- C# WPF动态删除指定类型控件
- 华为Mate 40系列开启线下预约:麒麟9000“末代”旗舰
- MacOS 软件 Adobe Photoshop 2022 安装使用详细教程
- Bit、Byte、kb、KB、MB、KiB、MiB各表示什么意思?
- Universal Source_free Domain Adaption论文阅读笔记
- python:金额数字转为人民币大写
- 【转】浅谈C# 多态的法力
- python复数类型转换_Python程序设计——复数运算(包括极坐标转换)
- 当金融科技遇上云原生,蚂蚁金服是怎么做安全架构的?
- s饥荒服务器物品id,饥荒物品代码大全
- Vue报错 component lists rendered with v-for should have explicit keys.
- 爱春秋-在线挑战-综合渗透训练全部详解(更新中)