SpringCloud - 服务网关(一)

news2025/1/11 23:56:38

服务网关

Spring Cloud Gateway作为Spring Cloud生态中的网关,不仅提供统一的路由能力,并且还提供了基于FILTER链方式的网关基本的功能。
Spring Cloud Gateway是一个全新的API网关项目,可以替换Zuul开发的网关服务,基于Spring5.0 + SpringBoot2.0 + WebFlux(基于⾼性能的Reactor模式响应式通信框架Netty,异步⾮阻塞模型)等技术开发,性能高于Zuul组件。它可以与Spring Cloud Discovery Client(如Eureka)、Ribbon、Hystrix等组件配合使用,实现路由转发、负载均衡、熔断、鉴权、路径重写、⽇志监控等功能,同时内置了限流过滤器具备限流的能力。

核心概念

A. 路由(Route):路由是网关最基础的部分,路由是由ID、目标 URI、一组断言和一组过滤器组成。如果断言路由为真,则说明请求的 URI 和配置匹配;
B. 断言(Predicate):JAVA8中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是Spring 5.0框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 Http Request中的任何信息,比如请求头、参数、路径等等,当断言为TRUE时,才执行路由;
C. 过滤器(Filter):Spring Cloud Gateway中的Filter分为Gateway Filter 和 Global Filter两种类型,过滤器将会对请求和响应进行处理。

工作原理

在这里插入图片描述
客户端向 Spring Cloud Gateway 发出请求,由网关处理程序 Gateway Handler Mapping 映射并确定与请求相匹配的路由,然后将其发送到网关 Web 处理程序 Gateway Web Handler,该处理程序通过指定的过滤器链,将请求发送到实际的业务逻辑,然后返回处理结果。
过滤器由虚线分隔的原因是,过滤器可以在发送代理请求之前和之后执行处理逻辑。所有 pre 过滤器逻辑均被执行,然后发出代理请求,发出代理请求后再运行 post 过滤器逻辑。

如何使用

① 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
② 编写配置
server:
  port: 8080
spring:
  application:
    name: servicex-gateway              # 网关名称
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true      # 是否将服务名称转小写
          enabled: true                 # 是否开启基于服务发现的路由规则
      # 路由规则    
      routes:
        # 认证中心
        - id: servicex-auth 			# 路由的唯一ID,用于区别其他的路由
          # 动态路由(lb://服务名)
          uri: lb://servicex-auth       # lb://表示根据服务名称从注册中心获取服务请求地址
          predicates:                   # 断言(判断条件)
            - Path=/auth/**             # 匹配对应URL的请求,将匹配到的请求追加在目标 URI 之后
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1

路由组成

路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:
A. id:路由的唯一标识,用于区别其他的路由;
B. uri:路由指向的目的地的URL,客户端请求最终被转发到的该URL对应的微服务上;
C. order:用于多个路由之间的排序,数值越小越靠前,匹配优先级越高;
D. predicates:用于进行条件判断,只有断言为TRUE才执行路由;
E. filters:用于修改请求和响应信息。

路由规则

Spring Cloud Gateway 使用断言工厂RoutePredicateFactory创建 Predicate 对象,Predicate 对象可以赋值给 Route对象。路由断言工厂 RoutePredicateFactory 内置了多个路由断言实现,包括 Datetime、Cookie、请求头、 HOST地址、 请求方法、 请求路径、请求参数、请求地址和路由权重等路由断言。

A. Spring Cloud Gateway 包含许多内置的 Route Predicate Factories;
B. 所有这些断言都匹配 HTTP 请求的不同属性;
C. 多个 Route Predicate Factories 可以通过逻辑与(and)结合起来一起使用。
在这里插入图片描述
使用说明如下:

spring:
  cloud:
    gateway: 
      routes:
        # 认证中心
        - id: servicex-auth 			 # 路由的唯一ID
          # 动态路由(lb://服务名)
          uri: lb://servicex-auth        # lb://表示根据服务名称从注册中心获取服务请求地址
          predicates:                    # 断言(判断条件)
            #- Path=/auth/**             # 匹配对应URL的请求,将匹配到的请求追加在目标 URI 之后
            #- Query=token               # 匹配请求参数中包含参数token的请求
            #- Query=token, abc.         # 匹配请求参数中包含参数token且其值满足正则表达式abc.的请求
            #- Method=GET                # 匹配任意的GET请求
            #- After=2022-07-19T21:20:20.000+08:00[Asia/Shanghai] # 匹配中国上海时间2022-07-19 21:20:20之后的请求
            #- RemoteAddr=192.168.11.1/0 # 匹配远程地址请求是192.168.11.1的请求,0表示子网掩码
            #- Header=X-Request-Id, \d+  # 匹配请求头包含X-Request-Id且其值满足正则表达式\d+的请求
          filters:
            # 验证码处理
            - CacheRequestFilter
            - ValidateCodeFilter
            - StripPrefix=1

过滤器

Spring Cloud Gateway中的Filter从功能上分为:Gateway Filter和Global Filter两种类型,过滤器会对请求和响应进行处理。
A. GatewayFilter:网关过滤器。需要配置在 spring.cloud.routes.filters 过滤器参数的具体路由下,只作用在当前路由上或通过 spring.cloud.default-filters 配置在全局,作用在所有路由上。
B. GlobalFilter:全局过滤器。无需在配置文件中配置即可作用在所有的路由上。
从处理顺序上分为:前置过滤器和后置过滤器两种类型,是以发送代理请求为分界线。
前置过滤器:可以做参数效验、权限效验、流量监控、日志输出、协议转换等;
后置过滤器:可以做响应内容、响应头的修改、日志输出、流量监控等。

① 网关过滤器

Spring Cloud Gateway 包含许多内置的网关过滤器工厂一共有 22 个,包括头部过滤器、 路径类过滤器、Hystrix 过滤器和重写请求 URL 的过滤器, 还有参数和状态码等其他类型的过滤器。根据过滤器工厂的用途来划分,可以分为以下几种:Header、Parameter、Path、Body、Status、Session、Redirect、Retry、RateLimiter 和 Hystrix。
在这里插入图片描述

② 全局过滤器

全局过滤器无需在配置文件中配置,且是作用在所有的路由上的过滤器。
在这里插入图片描述

③ 自定义全局过滤器

自定义全局过滤器需要实现以下两个接口 :GlobalFilter和Ordered。通过全局过滤器可以实现权限校验,安全性验证等功能。

/**
 * SWAGGER全局过滤器,用于解决SPRING-CLOUD-GATEWAY整合后无法获取SWAGGER资源的问题.
 * @author ROCKY
 */
@Component
public class SwaggerFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        // SPRING-CLOUD-GATEWAY整合SWAGGER3后需要将URL进行特殊处理。
        if (!StringUtils.endsWithIgnoreCase(path, SwaggerProvider.SWAGGER3URL)) {
            return chain.filter(exchange); // 继续向下执行
        }
        return chain.filter(exchange.mutate().request(request.mutate().path(SwaggerProvider.SWAGGER3URL).build()).build());
    }
    // 指定过滤器的执行顺序,数值越小,优先级越高
    @Override
    public int getOrder()
    {
        return -300;
    }
}
④ 自定义网关过滤器

自定义网关过滤器需要实现以下两个接口 :GatewayFilter和Ordered,可以通过配置文件指定也可以通过代码完成自定义网关过滤器的注册,一般采用前者。

断言

官方文档-断言工厂
我们可以理解为:当满足条件后才会进行路由转发,如果有多个条件则多个条件需要同时满足才会进行路由准发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程访问NAS

远程访问NAS&#xff08;网络附加存储&#xff09;可以通过多种方法实现&#xff0c;每种方法都有其特定的适用场景和优势。以下是一些常见的远程访问NAS的方法&#xff1a; 一、VPN&#xff08;虚拟专用网络&#xff09; VPN是通过公共网络建立安全的连接&#xff0c;实现远…

一看就懂导线间隔棒和导线间隔棒在线监测

深圳鼎信智慧科技带您走近导线间隔棒和导线间隔棒在线监测&#xff0c;先来后到&#xff0c;我们先从导线间隔棒讲起&#xff1a; 一、导线间隔棒 导线间隔棒&#xff0c;也称为间隔器&#xff0c;是高压输电线路中不可或缺的关键组件。其主要作用是保持多条导线之间的间距&a…

第二证券:参与股票分红到底有无意义?

A股的上市公司有一些会在半年报后分红&#xff0c;半年报披露在每年8月底截止&#xff0c;所以A股中期分红的公司一般在9-11月进行分红。 股票分红自身是个中性事情&#xff0c;分红后会进行除权除息&#xff0c;出资者总资产是没有改动的。 现金分红&#xff1a;除息后的股价…

中国银河资产笔试25届考什么?如何通过考试|附真题库面试攻略

嘿&#xff0c;各位小伙伴们&#xff01;我是职小豚&#xff0c;今天就带大家一起探秘中国银河资产 25 届秋招&#xff0c;为大家揭开这场金融之旅的神秘面纱。 一、中国银河资产介绍 中国银河资产&#xff0c;那可是金融领域的璀璨巨星&#xff01;它就像一座闪耀着智慧光芒…

开放式耳机哪些品牌值得推荐?开放式耳机是什么意思?

现在开放式耳机真的越来越多&#xff0c;也越来越火了&#xff0c;所以如何才能选到一款适合自己的开放式耳机&#xff0c;这真的难到了一部分的小伙伴&#xff0c;也有很多小伙伴过来私信我&#xff0c;作为耳机测评师&#xff0c;这些问题也干脆出一篇文章来回答&#xff0c;…

Centos使用阿里云镜像安装docker及docker hub下载失败解决方案

一 配置阿里云的Yum镜像源 配置阿里云的Yum镜像源可以提高下载速度&#xff0c;尤其是在国内网络环境下。以下是配置阿里云Yum镜像源的步骤&#xff1a; 1. 备份原有的Yum源配置文件 首先&#xff0c;备份系统现有的Yum源配置文件&#xff0c;以防出现问题时可以还原&#x…

一文详解企业上云数据库是干嘛的

企业上云数据库是干嘛的&#xff1f;企业上云数据库是企业将其数据库系统从传统的本地数据中心迁移到由第三方云服务提供商管理的远程服务器上的过程。这样做的目的通常是为了提高数据处理的效率、降低成本、增强数据的安全性和可靠性&#xff0c;以及利用云计算的弹性和可扩展…

【中秋送大礼包49份】

中秋节本商城送出49份大礼包 感谢&#xff1a;各位开发者和读者的支持 代码展示一波 Tips 领取礼包

从新手到高手:用这9个策略让ChatGPT成为你的私人顾问!

ChatGPT已经出来快一年多了&#xff0c;但是我发现周围的小伙伴还是处在调戏ChatGPT的阶段&#xff0c;并没有在日常工作和生活中发挥他应由的价值。我调研下来发现最关键的痛点就是&#xff1a;不知道该怎么写Prompt可以让ChatGPT输出期望的回答。 哎吆&#xff0c;这不正是撞…

Kamailio-基于Zabbix+Kamcli的SIP指标监控

什么是Kamailio? Kamailio 是一个开源的 Session Initiation Protocol (SIP) 服务器&#xff0c;它主要用于建立和管理实时通信会话&#xff0c;如语音和视频通话&#xff0c;与opensips这个产品是同根同源的存在。它们相似&#xff0c;没有更好&#xff0c;是有更合适。 此…

大数据Flink(一百一十三):Flink Python写DataStreamAPI作业快速入门

文章目录 Flink Python写DataStreamAPI作业快速入门 一、Flink数据流 二、Flink分层API 三、Flink流处理程序的一般流程 四、​​​​​​​​​​​​创建PyFlink项目 Flink Python写DataStreamAPI作业快速入门 一、Flink数据流 在 Flink 中&#xff0c;应用程序由数据…

Windows Python 指令补全方法

网络上搜集的补全代码 # python startup file import sys import readline import rlcompleter import atexit import os# tab completion readline.parse_and_bind(tab: complete) # history file histfile os.path.join(os.environ[HOMEPATH], .pythonhistory) try:readline…

从数据模型到直观界面,零编码一键生成列表表单设计

大家好&#xff0c;我是软件部长&#xff0c;今天给大家介绍JVS低代码的模型生成设计功能。 欢迎关注微信公众号: 【软开企服】&#xff0c;获取开源项目分享、产品功能和视频教程等。 模型生成设计是什么 在JVS低代码平台根据模型生成设计&#xff0c;则是基于数据模型的列表…

【QT】Qt窗口

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;菜单栏设置&#x1f449;&#x1f3fb;QToolBar练习 &#x1f449;&#x1f3fb;QStausBar&#x1f449;&#x1f3fb;Q…

HTML5中的重要元素详解

第3章 HTML5中的重要元素 3.1 html根元素 HTML文档中&#xff0c;元素html代表了文档的根&#xff0c;其他所有元素都是在该元素的基础上进行延伸或拓展的&#xff0c;该元素也是HTML文档的最外层元素&#xff0c;因此也称为根元素。 html元素的常用属性&#xff1a; manif…

Kubernetes精讲之prometheus

目录 一 Prometheus简介 1.1 Prometheus架构 二 在k8s中部署Prometheus 2.1 下载部署Prometheus所需资源 2.3 登陆grafana 2.4 导入面板 三 监控使用示例 3.1 建立监控项目 一 Prometheus简介 Prometheus是一个开源的服务监控系统和时序数据库 其提供了通用的数据模型…

【专题】2024跨境出海供应链洞察-更先进供应链报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37665 当前&#xff0c;全球化商业浪潮促使跨境电商行业飞速发展&#xff0c;产业带与跨境电商接轨、平台半托管模式涌现、社交电商带来红利机会以及海外仓不断扩张&#xff0c;这使得产业带外贸工厂、内贸工厂、传统进出口企业和品…

攻防世界---> 简单检查-100

学习笔记。 前言&#xff1a; 额&#xff0c;不会 gdb 一直以为reverse不会用到gdb&#xff0c;pwn才会使用到gdb。(已老实) 下载 查壳。 ida打开。 ida动态&#xff0c;发现&#xff0c;咱们输入的v8用v6的地址接收&#xff0c;且v8只是if判断&#xff0c;所以能够确定&#x…

响应式网站对seo有哪些影响?

响应式网站设计是一种能够自动调整布局以适应不同屏幕尺寸和设备类型的网站设计方法。这种设计方式对于搜索引擎优化&#xff08;SEO&#xff09;有着显著的影响&#xff0c;主要体现在以下几个方面&#xff1a; 响应式网站对seo都有哪些影响&#xff1f; 提高用户体验&#…

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程&#xff08;Gaussian Process&#xff0c;简称GP&#xff09;是一种概率模型&#xff0c;用于描述一组随机变量的联合概率分布&#xff0c;其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高…