网关Gateway-快速上手
gateway网关官方文档: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#
网关的概念
网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。
Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。相比 Zuul 来说,Spring Cloud Gateway 提供更优秀的性能,更强大的功能。Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等等。
核心概念
路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。
断言(predicates)
Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Httprequest中的任何信息,比如请求头和参数等。
过滤器(Filter)
SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理
工作原理
Spring Cloud Gateway 的工作原理跟 Zuul 的差不多,最大的区别就是 Gateway 的 Filter 只有 pre 和 post 两种。
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关 Web 处理程序,此时处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有 pre 过滤器逻辑先执行,然后执行代理请求;代理请求完成后,执行 post 过滤器逻辑。
路由断言工厂(Route Predicate Factories)配置
具体参考gateway官网给的示例: Route Predicate Factories
主要包含一些:时间匹配 路径匹配 cookie配置 Header匹配 query查询条件匹配等
# 核心概念1:路由,一个路由代表一个处理逻辑,# 该逻辑里面包含三个元素:匹配条件(是否该此路由处理)、真实处理地址、过滤器routes:# id要确保唯一性- id: add_request_header_route# 真实处理地址,请求一旦确定是当前路由处理,就会转发到这个地址去uri: https://example.org# 核心概念2:谓语或者断言,作用是判断请求是否由当前路由处理predicates:# 这是断言的一种,检查请求的Cookie中mycookie的值是否等于mycookievalue- Cookie=mycookie,mycookievalue# 核心概念3:过滤器,请求前和请求后都可以有过滤器处理请求响应数据filters:# 这个过滤器的作用是在请求header中添加一个键值对,值等于"aaabbbccc"- AddRequestHeader=X-Request-Red, aaabbbccc
自定义路由工厂
自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。
注意: 命名需要以 RoutePredicateFactory 结尾
@Component
@Slf4j
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {public CheckAuthRoutePredicateFactory() {super(Config.class);}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return new GatewayPredicate() {@Overridepublic boolean test(ServerWebExchange serverWebExchange) {log.info("调用CheckAuthRoutePredicateFactory" + config.getName());if(config.getName().equals("fox")){return true;}return false;}};}
在yaml配置文件中引入自定义的路由工厂
spring:cloud:gateway:#设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID,全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口predicates:# 测试:http://localhost:8888/order/findOrderByUserId/1- Path=/order/** #Path路径匹配#自定义CheckAuth断言工厂
# - name: CheckAuth
# args:
# name: fox- CheckAuth=fox
过滤器工厂( GatewayFilter Factories)配置
gateway官方示例: GatewayFilter Factories
SpringCloudGateway 内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数,添加请求头,为匹配的路由统一添加前缀,重定向操作等
spring:cloud:gateway:#设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID,全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- PrefixPath=/mall-order # 添加前缀 对应微服务需要配置context-path
讲解以下 The RequestRateLimiter GatewayFilter Factory过滤工厂,它可以完成请求的限流,在实际开发中处理网关限流的时候就需要配置
RequestRateLimiter GatewayFilter工厂使用一个RateLimiter实现来确定当前请求是否允许继续。如果不是,返回HTTP 429 - Too Many Requests(默认情况下)的状态。
该过滤器接受一个可选的keyResolver参数和特定于速率限制器的参数
keyResolver是一个实现keyResolver接口的bean。在配置中,使用SpEL按名称引用bean。#{@myKeyResolver}是一个SpEL表达式,它引用了一个名为myKeyResolver的bean。KeyResolver接口如下所示:
public interface KeyResolver {Mono<String> resolve(ServerWebExchange exchange);}
KeyResolver接口允许可插入策略派生限制请求key。在未来的里程碑版本中,将会有一些KeyResolver实现。当前的默认实现类是PrincipalNameKeyResolver ,它从ServerWebExchange检索Principal并调用Principal. getname()。
默认情况下,如果KeyResolver没有找到key,请求将被拒绝。你可以通过设置
spring.cloud.gateway.filter.request-rate-limiter.deny-empty-key (true或false)和spring.cloud.gateway.filter.request-rate- limititer来调整这种行为。empty-key-status-code属性。
public class PrincipalNameKeyResolver implements KeyResolver {/*** {@link PrincipalNameKeyResolver} bean name.*/public static final String BEAN_NAME = "principalNameKeyResolver";@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {return exchange.getPrincipal().flatMap(p -> Mono.justOrEmpty(p.getName()));}}
RedisRateLimiter 限流实现
RedisRateLimiter 继承 AbstractRateLimiter
继承RedisRateLimiter 实现自已的redis请求速率
PrefixPath GatewayFilter Factory
PrefixPath GatewayFilter工厂只接受一个前缀参数。配置PrefixPath GatewayFilter的示例如下:
spring:cloud:gateway:routes:- id: prefixpath_routeuri: https://example.orgfilters:- PrefixPath=/mypath
这将在所有匹配请求的路径前加上/mypath前缀。因此,对/hello的请求将被发送到/mypath/hello。
StripPrefix GatewayFilter Factory
StripPrefix GatewayFilter工厂接受一个参数parts。parts参数表示在下行发送请求之前从请求中剥离的路径中的部件数量。下面的清单配置了一个StripPrefix GatewayFilter:
spring:cloud:gateway:routes:- id: nameRooturi: https://nameservicepredicates:- Path=/name/**filters:- StripPrefix=2
当通过网关向/name/blue/red发出请求时,向nameservice发出的请求看起来像nameservice/red。
Redis RateLimiter
gateway官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-redis-ratelimiter
首先需要引入依赖
<!--redis限流--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency>
有这么几个属性
redis-rate-limiter.replenishRate 你希望允许用户在不丢弃任何请求的情况下每秒执行多少请求。这是令牌桶被填充的速率。
redis-rate-limiter.burstCapacity 允许用户在一秒钟内执行 的最大请求数。这是令牌桶可以容纳的令牌数量。将该值设置为零将阻止所有请求。
redis-rate-limiter.requestedTokens 是一个请求需要多少令牌。这是为每个请求从桶中提取令牌的数量,默认为1。
一个稳定的速率是通过设置相同的值在replenishRate 和burstCapacity。可以通过将burstCapacity设置为高于supplishrate来允许临时突发。在这种情况下,速率限制器需要被允许在爆发之间有一段时间(根据refreshrate),因为两个连续的爆发将导致丢弃的请求(HTTP 429 - Too Many requests)。下面的清单配置了一个reddis -rate-limit:
1个请求/秒以下的速率限制可以通过设置refreshrate为所需的请求数量,设置requestdtokens为时间间隔,
设置burstCapacity为refreshrate和requestdtokens的乘积来实现,
例如设置refreshrate =1, requestdtokens =60和burstCapacity=60将导致1个请求/分钟的限制。
如:
spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: https://example.orgfilters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20redis-rate-limiter.requestedTokens: 1
自定义配置KeyResolver
@Bean
KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}
这定义了每个用户10个请求速率的限制。允许20个请求的突发,但是在下一秒,只有10个请求可用。KeyResolver是一个获取用户请求参数的简单方法(注意,不建议在生产环境中使用)。
还可以将速率限制器定义为实现RateLimiter接口的bean。在配置中,您可以使用SpEL按名称引用bean。#{@myRateLimiter}是一个SpEL表达式,它引用了一个名为myRateLimiter的bean。下面的清单定义了一个使用上一个清单中定义的KeyResolver的速率限制器:
spring:cloud:gateway:routes:- id: requestratelimiter_routeuri: https://example.orgfilters:- name: RequestRateLimiterargs:rate-limiter: "#{@myRateLimiter}"key-resolver: "#{@userKeyResolver}"
RewritePath GatewayFilter factory
RewritePath GatewayFilter factory接受一个路径regexp参数和一个替换参数。它使用Java正则表达式作为重写请求路径的灵活方式。下面的清单配置了一个RewritePath GatewayFilter:
spring:cloud:gateway:routes:- id: rewritepath_routeuri: https://example.orgpredicates:- Path=/red/**filters:- RewritePath=/red/?(?<segment>.*), /$\{segment}
对于/red/blue的请求路径,这将在发出下游请求之前将路径设置为/blue。注意,由于YAML规范的原因,应该替换为应该替换为应该替换为\。
Default Filters
要添加一个过滤器并将其应用于所有路由,你可以使用spring.cloud.gateway.default-filters。此属性接受筛选器列表。下面的清单定义了一组默认过滤器:
spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- PrefixPath=/httpbin
自定义过滤器工厂
继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。
AbstractNameValueGatewayFilterFactory 继承了 AbstractGatewayFilterFactory
@Component
@Slf4j
public class CheckAuthGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {@Overridepublic GatewayFilter apply(NameValueConfig config) {return (exchange, chain) -> {log.info("调用CheckAuthGatewayFilterFactory==="+ config.getName() + ":" + config.getValue());return chain.filter(exchange);};}
}
配置自定义过滤器:
spring:cloud:gateway:#设置路由:路由id、路由到微服务的uri、断言routes:- id: order_route #路由ID,全局唯一uri: http://localhost:8020 #目标微服务的请求地址和端口#配置过滤器工厂filters:- CheckAuth=fox,男
网关Gateway-快速上手相关推荐
- 统一网关Gateway快速入门
1.为什么需要网关 为了不让任何人都能访问我们的微服务,对用户的身份进行一个验证,如果是内部人员才允许访问,如果不是就拦截禁止访问.一切请求都得通过网关在进入到微服务中. 2.搭建网关服务 2.1 创 ...
- spring cloud 快速上手系列 -> 04-网关 Gateway -> 041-空的工程
spring cloud 快速上手系列 系列说明:快速上手,一切从简,搭建一个简单的微服务框架,让新手可以在这个基础框架上做各种学习.研究. 04-网关 Gateway 041-空的工程 1,说明 网 ...
- Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
转载自 Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使 ...
- Spring Boot+Eureka+Spring Cloud微服务快速上手项目实战
说明 我看了一些教程要么写的太入门.要么就是写的太抽象.真正好的文章应该是快速使人受益的而不是浪费时间.本文通过一个包括组织.部门.员工等服务交互的案例让刚接触spring cloud微服务的朋友快速 ...
- 【总结】学习AWS的VPC并通过快速上手实验室动手实操
讲师:黄涛 高级技术讲师 1.邱洋的理解 AWS的服务类型包括 计算.存储内容分发.联网.数据库等10多大类,几十项服务 但是跟网络相关只有2个(VPC和数据中心光纤连接) AWS的VPC是云计算中网 ...
- 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:雄 ...
- 「微服务系列」统一网关Gateway
为什么需要网关 网关功能: 身份认证和权限校验 服务路由.负载均衡 请求限流 在SpringCloud中网关的实现包括两种: Zuul:基于Servlet的实现,属于阻塞式编程. SpringClou ...
- 【微服务】—— 统一网关Gateway
文章目录 1. 概述 1.1 为什么需要网关 1.2 SpringCloud Gateway 2. gateway快速入门 搭建网关服务 1.创建新的module,引入SpringCloudGatew ...
- 【Python全栈100天学习笔记】Day41 Django快速上手
快速上手 Web开发的早期阶段,开发者需要手动编写每个页面,例如一个新闻门户网站,每天都要修改它的HTML页面,随着网站规模和体量的增大,这种方式就变得极度糟糕.为了解决这个问题,开发人员想到了用外部 ...
- 41.Django快速上手
Django快速上手 Web开发的早期阶段,开发者需要手动编写每个页面,例如一个新闻门户网站,每天都要修改它的HTML页面,随着网站规模和体量的增大,这种做法一定是非常糟糕的.为了解决这个问题,开发人 ...
最新文章
- 为什么安装的是gpu版本训练时还是用的cpu?_免费GPU哪家强?谷歌Kaggle vs. Colab | 硬核评测...
- gnuplot_i 文件的说明,翻译成的中文
- 多并发-最后刷新页面
- Mads Torgersen介绍C# 7及后续版本新特性
- anacoda里面安装包显示失败_CAD卸载不干净?安装老是失败?送你官方卸载工具...
- mysql开启binlog启动慢_mysql的binlog和slow_log慢日志
- Android的JNI开发涉及的char和string之间的互相转换
- vmware 搭建k8s无法ping通子节点_一波四折 —— 记一次K8S集群应用故障排查
- 查看grafana版本_使用 Prometheus 与 Grafana 为 Kubernetes 集群建立监控与警报机制
- 10. OD-VC程序暴力破解
- 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
- Kali Linux 秘籍 第七章 权限提升
- MyBatis直接执行SQL查询及批量插入数据
- c# 在mongo中查询经纬度范围
- Reddit大热,伯克利PPT带你丝滑入门机器学习:知识点全面覆盖,笔记可搭配食用...
- 剑指offer——面试题52:构建乘积数组
- oracle10gdmp字符集,从Export DMP文件看导出字符集(上)
- Keil MDK5使用
- 4k hidpi 黑苹果_黑苹果如何通过开启HIDPI来增强显示效果?
- 什么是雷曼时刻(Lehman Moment)
热门文章
- pytorch 模型并行 model parallel
- 鸿蒙系统电视家,华为智慧屏S系列下载哪个直播软件最好?分享用当贝市场下载直播软件方法...
- NYIST 708 ones java
- fama matlab源码_Fama French (1996)3因子模型 论文数据及matlab程序
- 如何尽量不用百度等远离流氓软件随笔
- Lesson 018 —— python 集合
- 卸载腾讯手游模拟器的方法
- LeetCode:309. 最佳买卖股票时机含冷冻期(python)
- 机房重构一路走来——初步总结
- CMS-CMS框架解析