我的编程空间,编程开发者的网络收藏夹
学习永远不晚

服务网关:SpringCloud Gateway核心技术

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

服务网关:SpringCloud Gateway核心技术

本章概述

SpringCloud Gateway能够实现多种网关功能,比如路由转发、断言、过滤器、熔断、限流、降级、自定义谓词配置、自定义过滤器等等多种功能。今天,我们就一起来聊聊SpringCloud Gateway中的断言、过滤器与熔断机制。

网关断言

断言的英文是Predicate,也可以翻译成谓词。主要的作用就是进行条件判断,可以在网关中实现多种条件判断,只有所有的判断结果都通过时,也就是所有的条件判断都返回true,才会真正的执行路由功能。

SpringCloud Gateway内置断言

SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。

基于日期时间类型的断言

基于日期时间类型的断言根据时间做判断,主要有三个:

  • AfterRoutePredicateFactory:接收一个日期时间参数,判断当前请求的日期时间是否晚于指定的日期时间。
  • BeforeRoutePredicateFactory:接收一个日期时间参数,判断当前请求的日期时间是否早于指定的日期时间。
  • BetweenRoutePredicateFactory:接收两个日期时间参数,判断当前请求的日期时间是否在指定的时间时间段内。

使用示例

- After=2022-05-10T23:59:59.256+08:00[Asia/Shanghai]

基于远程地址的断言

RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断发出请求的客户端的IP地址是否在指定的IP地址段内。

使用示例

- RemoteAddr=192.168.0.1/24

基于Cookie的断言

CookieRoutePredicateFactory:接收两个参数, Cookie的名称和一个正则表达式。判断请求的Cookie是否具有给定名称且值与正则表达式匹配。

使用示例

- Cookie=name, binghe.

基于Header的断言

HeaderRoutePredicateFactory:接收两个参数,请求Header的名称和正则表达式。判断请求Header中是否具有给定的名称且值与正则表达式匹配。

使用示例

- Header=X-Request-Id, \d+

基于Host的断言

HostRoutePredicateFactory:接收一个参数,这个参数通常是主机名或者域名的模式,例如**.binghe.com这种格式。判断发出请求的主机是否满足匹配规则。

使用示例

- Host=**.binghe.com

基于Method请求方法的断言

MethodRoutePredicateFactory:接收一个参数,判断请求的类型是否跟指定的类型匹配,通常指的是请求方式。例如,POST、GET、PUT等请求方式。

使用示例

- Method=GET

基于Path请求路径的断言

PathRoutePredicateFactory:接收一个参数,判断请求的链接地址是否满足路径规则,通常指的是请求的URI部分。

使用示例

- Path=/binghe/{segment}

基于Query请求参数的断言

QueryRoutePredicateFactory :接收两个参数,请求参数和正则表达式, 判断请求的参数是否具有给定的名称并且参数值是否与正则表达式匹配。

使用示例

- Query=name, binghe.

基于路由权重的断言

WeightRoutePredicateFactory:接收一个[组名,权重]格式的数组,然后对于同一个组内的路由按照权重转发。

使用示例

- id: weight1
uri: http://localhost:8080
predicates:
- Path=/api
@Data
public class NameRoutePredicateConfig implements Serializable {
private static final long serialVersionUID = -3289515863427972825L;
private String name;
}

(2)实现自定义断言时,需要新建类继承org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory类,在io.binghe.shop.predicate包下新建NameRoutePredicateFactory类,继承org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory类,并覆写相关的方法,源码如下所示。


@Component
public class NameRoutePredicateFactory extends AbstractRoutePredicateFactory<NameRoutePredicateConfig> {

public NameRoutePredicateFactory() {
super(NameRoutePredicateConfig.class);
}

@Override
public Predicate<ServerWebExchange> apply(NameRoutePredicateConfig config) {
return (serverWebExchange)->{
String name = serverWebExchange.getRequest().getQueryParams().getFirst("name");
if (StringUtils.isEmpty(name)){
name = "";
}
return name.equals(config.getName());
};
}

@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("name");
}
}

(3)在服务网关的application.yml文件中的spring.cloud.gateway.routes节点下的- id: user-gateway下面进行如下配置。

spring:
cloud:
gateway:
routes:
- id: user-gateway
uri: http://localhost:8060
order: 1
predicates:
- Path=/server-user
@Data
public class GrayscaleGatewayFilterConfig implements Serializable {
private static final long serialVersionUID = 983019309000445082L;
private boolean grayscale;
}

(3)在io.binghe.shop.filter包下GrayscaleGatewayFilterFactory类,继承org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory类,主要是实现自定义过滤器,模拟实现灰度发布。代码如下所示。


@Component
public class GrayscaleGatewayFilterFactory extends AbstractGatewayFilterFactory<GrayscaleGatewayFilterConfig> {

public GrayscaleGatewayFilterFactory(){
super(GrayscaleGatewayFilterConfig.class);
}
@Override
public GatewayFilter apply(GrayscaleGatewayFilterConfig config) {
return (exchange, chain) -> {
if (config.isGrayscale()){
System.out.println("开启了灰度发布功能...");
}else{
System.out.println("关闭了灰度发布功能...");
}
return chain.filter(exchange);
};
}

@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("grayscale");
}
}

(4)分别启动用户微服务和服务网关,在浏览器中输入http://localhost:10001/server-user/user/get/1001,如下所示。

可以看到,通过服务网关正确访问到了用户微服务,并正确获取到了用户信息。

接下来,查看下服务网关的终端,发现已经成功输出了如下信息。

开启了灰度发布功能...

说明正确实现了自定义的局部过滤器。

全局过滤器

全局过滤器是一系列特殊的过滤器,会根据条件应用到所有路由中。

全局过滤器概述

在SpringCloud Gateway中内置了多种不同的全局过滤器,如下所示。

演示全局过滤器

(1)在服务网关模块shop-gateway模块下的io.binghe.shop.config包下新建GatewayFilterConfig类,并在类中配置几个全局过滤器,如下所示。


@Configuration
@Slf4j
public class GatewayFilterConfig {
@Bean
@Order(-1)
public GlobalFilter globalFilter() {
return (exchange, chain) -> {
log.info("执行前置过滤器逻辑");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
log.info("执行后置过滤器逻辑");
}));
};
}
}

注意:@Order注解中的数字越小,执行的优先级越高。

(2)启动用户微服务与服务网关,在浏览器中访问http://localhost:10001/server-user/user/get/1001,如下所示。

在服务网关终端输出如下信息。

执行前置过滤器逻辑
执行后置过滤器逻辑

说明我们演示的全局过滤器生效了。

自定义全局过滤器

SpringCloud Gateway内置了很多全局过滤器,一般情况下能够满足实际开发需要,但是对于某些特殊的业务场景,还是需要我们自己实现自定义全局过滤器。

这里,我们就模拟实现一个获取客户端访问信息,并统计访问接口时长的全局过滤器。

(1)在网关服务模块shop-order的io.binghe.shop.filter包下,新建GlobalGatewayLogFilter类,实现org.springframework.cloud.gateway.filter.GlobalFilter接口和org.springframework.core.Ordered接口,代码如下所示。


@Slf4j
@Component
public class GlobalGatewayLogFilter implements GlobalFilter, Ordered {

private static final String BEGIN_VISIT_TIME = "begin_visit_time";

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//先记录下访问接口的开始时间
exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());
return chain.filter(exchange).then(Mono.fromRunnable(()->{
Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);
if (beginVisitTime != null){
log.info("访问接口主机: " + exchange.getRequest().getURI().getHost());
log.info("访问接口端口: " + exchange.getRequest().getURI().getPort());
log.info("访问接口URL: " + exchange.getRequest().getURI().getPath());
log.info("访问接口URL参数: " + exchange.getRequest().getURI().getRawQuery());
log.info("访问接口时长: " + (System.currentTimeMillis() - beginVisitTime) + "ms");
}
}));
}

@Override
public int getOrder() {
return 0;
}
}

上述代码的实现逻辑还是比较简单的,这里就不再赘述了。

(2)启动用户微服务与网关服务,在浏览器中输入http://localhost:10001/server-user/user/api/filter1?name=binghe,如下所示。

接下来,查看服务网关的终端日志,可以发现已经输出了如下信息。

访问接口主机: localhost
访问接口端口: 10001
访问接口URL: /server-user/user/api/filter1
访问接口URL参数: name=binghe
访问接口时长: 126ms

说明我们自定义的全局过滤器生效了。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

服务网关:SpringCloud Gateway核心技术

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

服务网关:SpringCloud Gateway核心技术

SpringCloud Gateway能够实现多种网关功能,比如路由转发、断言、过滤器、熔断、限流、降级、自定义谓词配置、自定义过滤器等等多种功能。今天,我们就一起来聊聊SpringCloud Gateway中的断言、过滤器与熔断机制。

服务网关:项目整合 SpringCloud Gateway 网关

我们需要在项目中增加一个服务网关模块shop-gateway,在服务网关模块中实现网关的能力。此时,我们的项目中就会有用户微服务、商品微服务、订单微服务和服务网关。

SpringCloud微服务网关Gateway怎么创建

这篇文章主要介绍“SpringCloud微服务网关Gateway怎么创建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringCloud微服务网关Gateway怎么创建”文章能帮助大家解决问题。
2023-07-02

工业物联网网关的四个核心功能技术

工业物联网网关可以实时、准确、自动地为整个数据信息提供及时、有效和真实的反应,以此有利于实现物联网间的管理行政的信息沟通和协同工作。下面就来看看工业物联网网关的四个核心功能技术吧。

SpringCloud怎么实现服务调用feign、熔断hystrix和网关gateway

本文小编为大家详细介绍“SpringCloud怎么实现服务调用feign、熔断hystrix和网关gateway”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud怎么实现服务调用feign、熔断hystrix和网关gat
2023-07-05

服务网关:网关概述与核心架构

今天,我们正式进入服务网关章节的学习,首先,我们对服务网关进行简要的概述并对其核心架构进行简要的剖析。

服务容错加餐:Sentinel核心技术

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。所以,Sentinel的核心功能包括:流量控制、熔断降级、系统负载保护。

SpringCloud Gateway服务网关的部署与使用的方法是什么

这篇文章主要介绍“SpringCloud Gateway服务网关的部署与使用的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringCloud Gateway服务网关的部署与使用的方法
2023-07-05

SpringCloud实现服务调用feign与熔断hystrix和网关gateway详细分析

这篇文章主要介绍了SpringCloud实现服务调用feign与熔断hystrix和网关gateway,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-05-14

深入剖析PHP Web服务的核心技术:掌握构建强大服务的精髓!

掌握PHP Web服务的核心技术,了解构建强大服务的精髓,从底层框架到实际应用,为您的Web开发之旅奠定坚实基础。
深入剖析PHP Web服务的核心技术:掌握构建强大服务的精髓!
2024-02-05

浅析服务网关对企业核心应用架构的重要性

无论您是企业内部、云厂商或服务商架构师,在梳理业务场景,规划、部署应用架构之时,服务网关设计与实现的成败,是直接决定您系统交付价值的最直接体现。

国家安全中心:为外国软件提供“特殊”网络技术服务涉嫌违法

“国家安全部”公众号今日发布消息,当前,随着我国网络技术应用快速普及深入,网络技术服务行业已成为境外间谍情报机关渗透窃密、规避我网络安全监管防护体系、实施网络间谍行为的新目标。

云时代阿里巴巴服务器引领互联网发展的关键技术

随着科技的不断发展,云计算已经成为互联网发展的重要组成部分。其中,阿里巴巴服务器凭借其强大的计算能力和高效的服务体系,已经成为云计算领域的佼佼者。本文将详细解析阿里巴巴服务器在云时代的地位,以及其如何引领互联网发展的关键技术。正文:随着互联网技术的不断发展,云计算已经成为互联网发展的核心技术之一。云计算技术可以将
云时代阿里巴巴服务器引领互联网发展的关键技术
2023-11-15

博睿数据分布式手机真机监测+两大核心技术,轻松掌控短信服务质量与用户体验

2021年8月10日,博睿数据首次在业界倡导构建中立、客观、有效评估企业短信服务质量与用户体验体系的构想。通过Bonree Net短信网关监测产品,基于博睿数据的WAP会员能力,提供遍布全国各省市的10000+稳定在线的真机短信监测节点,以

2023双态IT乌镇用户大会圆满结束!共同推动信息技术应用创新,提高金融新核心服务保障

2023年10月14日下午,2023第六届双态IT乌镇用户大会两大主题会议之一的“第二届金融信息技术应用创新服务保障主题会议”成功举办。本次会议由ITSS分会、证券基金行业信息技术应用创新联盟指导,ITSS数据中心运营管理组(DCMG)、双

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录