SpringCloud之微服务API网关Gateway介绍
文章目录
- 1 微服务API网关Gateway
- 1.1 网关简介
- 1.2 Spring Cloud Gateway介绍
- 1.3 Gateway特性
- 1.4 Gateway核心概念
- 1.4.1 路由
- 1.4.1.1 定义
- 1.4.1.2 动态路由
- 1.4.2 断言
- 1.4.2.1 默认断言
- 1.4.2.2 自定义Predicate
- 1.4.3 过滤器
- 1.4.3.1 默认过滤器
- 1.4.3.2 自定义Filter(GatewayFilter)
- 1.4.3.2 自定义Filter(GlobalFilter)
- 1.4.3.3 自定义Filter(AbstractGatewayFilterFactory)
- 1.5 Gateway工作流程
- 1.6 实际操作
- 1.6.1 pom.xml
- 1.6.2 启动类
- 1.6.3 配置文件 application.yml
1 微服务API网关Gateway
1.1 网关简介
如果没有网关,难道不行吗?功能上是可以的,我们直接调用提供的接口就可以了。那为什么还需要网关?
因为网关的作用不仅仅是转发请求而已。我们可以试想一下,如果需要做一个请求认证功能,我们可以接入到 API 服务中。但是倘若后续又有服务需要接入,我们又需要重复接入。这样我们不仅代码要重复编写,而且后期也不利于维护。
由于接入网关后,网关将转发请求。所以在这一层做请求认证,天然合适。这样这需要编写一次代码,在这一层过滤完毕,再转发给下面的 API。所以 API 网关的通常作用是完成一些通用的功能,如请求认证,请求记录,请求限流,黑白名单判断等。
API网关是一个服务器,是系统的唯一入口。
API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关提供REST/HTTP的访问API。
1.2 Spring Cloud Gateway介绍
Spring Cloud Gateway 是 Spring Cloud 的新一代API网关,基于WebFlux框架实现,它旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix ZUUL,具有更好的性能、更强的扩展性、以及更丰富的功能特性,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,限流等。
1.3 Gateway特性
Spring Cloud Gateway特性:
- 基于Spring Framework 5, Project Reactor和Spring Boot 2.0
- 动态路由:能够匹配任何请求属性
- 可以对路由指定 Predicate 和 Filter
- 集成
Hystrix断路器 - 集成
Spring Cloud DiscoveryClient服务发现功能 - 易于编写的Predicate和Filter
- 请求限流
- 支持路径重写
1.4 Gateway核心概念
1.4.1 路由
1.4.1.1 定义
路由(Route)是网关最基础的部分,路由信息由一个ID,一个目标URI,一组断言和过滤器组成。路由断言Predicate用于匹配请求,过滤器 Filter 用于修改请求和响应。如果断言为true,则说明请求URI和配置匹配,则执行路由。
spring:cloud:gateway:# 定义多个路由routes:# 一个路由route的id- id: path_route# 该路由转发的目标URIuri: https://example.org# 路由条件集合predicates:- Path=/test/**# 过滤器集合filters:- AddRequestHeader=X-Request-Id, 1024- AddRequestParameter=color, red
1.4.1.2 动态路由
网关接收外部请求,按照一定的规则,将请求转发给其他服务或者应用。如果站在服务调用的角度,网关就扮演着服务消费者的角色,此时,如果再来看看服务调用的目标URI配置,就会很自然的发现一个问题,服务提供者调用的地址是写死的,即网关没有动态的发现服务,这就涉及到了服务的自动发现问题,以及发现服务后,所涉及到的服务调用的负载均衡的问题。
可以通过Nacos或者Eureka注册中心动态发现服务,通过Ribbon进行服务调用的负载均衡。同样,Gateway也可以整合Nacos或者Eureka,Ribbon从而实现动态路由的功能。
想要使用动态路由的功能,首先要整合注册中心,这里以Nacos为例
pom依赖
<!--SpringCloud ailibaba nacos -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置文件
spring:application:name: cloud-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:routes:#路由的ID,没有固定规则但要求唯一,建议配合服务名- id: config_route#匹配后提供服务的路由地址, 这里lb之后,跟的是要调用的服务名称uri: lb://nacos-provider-8002# 断言,路径相匹配的条件predicates:- Path=/routeconfig/rest/**
此时,当id为config_route的路由规则匹配某个请求后,在调用该请求对应的服务时,就会从nacos注册中心自动发现服务,并在服务调用的时候实现负载均衡。
1.4.2 断言
断言(Predicate)参考Java8 中的断言 Predicate ,用于实现请求匹配逻辑,例如匹配路径、请求头、请求参数等。请求与断言匹配则执行该路由。
在Gateway中,有一些的内置Predicate Factory,有了这些Pridicate Factory,在运行时,Gateway 会自动根据需要创建其对应的 Pridicate 对象测试路由条件。
1.4.2.1 默认断言
Gateway提供的断言有:Path 路由断言,After 路由断言,Cookie 路由断言,Header 路由断言 ,Host 路由断言 ,Method 路由断言
Path 路由断言 Factory: 根据请求路径匹配的路由条件工厂
spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:# 如果可以匹配的PathPattern有多个,则每个路径模式以,分开- Path=/red/{segment},/blue/{segment}
After 路由断言 Factory: 在指定日期时间之后发生的请求都将被匹配
spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
Cookie 路由断言 Factory: Cookie 路由断言 Factory有两个参数,cookie名称和正则表达式。请求包含此cookie名称且正则表达式为真的将会被匹配。
spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p
Header 路由断言 Factory: Header 路由断言 Factory有两个参数,header名称和正则表达式。请求包含此header名称且正则表达式为真的将会被匹配。
spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+
Host 路由断言 Factory: Host 路由断言 Factory包括一个参数:host name列表。使用Ant路径匹配规则, . 作为分隔符。
spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org
Method 路由断言 Factory: Method 路由断言 Factory只包含一个参数:需要匹配的HTTP请求方式
spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET
1.4.2.2 自定义Predicate
可以自定义Predicate来实现复杂的路由匹配规则
实现自定义 Predicate 工厂
通过HostRoutePredicateFactory创建Predicate进行路由判断
@Component
public class MyHostRoutePredicateFactory extends AbstractRoutePredicateFactory<MyHostRoutePredicateFactory.Config> {public MyHostRoutePredicateFactory() {// Config 类作为 Predicate 的配置参数类super(Config.class);}public static class Config {// 路由匹配规则private String hostName;public String getHostName() {return hostName;}public void setHostName(String hostName) {this.hostName = hostName; }}// 生成一个 Predicate 实例@Overridepublic Predicate<ServerWebExchange> apply(Config config) {// 实现匹配逻辑return exchange -> {// 根据config实现匹配判断 String host = exchange.getRequest().getURI().getHost();// 匹配配置中的域名return host.equals(config.getHostName());};}
}
使用
RouteLocator locator = new RouteLocatorBuilder(router).routes().route("test_route", r -> r.path("/test").filters(f -> f.filter(new MyHostRoutePredicateFactory.Config("www.test.com"))).uri("http://localhost:8080")).build();
1.4.3 过滤器
过滤器(Filter) 指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前后对请求进行修改
1.4.3.1 默认过滤器
配置文件中添加过滤器 filters
filters:- AddRequestHeader=name,zs #请求头添加name:zs- AddRequestParameter=color,blue #请求参数添加color:blue- AddResponseHeader=phone,973345344 #响应头添加phone:973345344- PrefixPath=/mypath #添加路径前缀/mypath- StripPrefix=n #删除路径前缀n个
Spring Cloud Gateway内置的多种过滤器类,例如:
AddRequestHeader GatewayFilter:在请求头中添加参数PrefixPath GatewayFilter:请求路径前缀Hystrix GatewayFilter:断路器RateLimit GatewayFilter:限流Retry GatewayFilter:重试
1.4.3.2 自定义Filter(GatewayFilter)
可以通过实现GatewayFilter和Ordered接口自定义Filter来实现请求处理逻辑:
@Component
public class TokenFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//请求处理逻辑log.info("请求路径:"+ exchange.getRequest().getPath());ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, HttpCookie> cookies = request.getCookies();List<HttpCookie> tokens = cookies.get("access_token");if (tokens == null || tokens.size() == 0) {throw new RuntimeException("少了cookie!");}return chain.filter(exchange);}@Overridepublic int getOrder() {return 0; }
}
1.4.3.2 自定义Filter(GlobalFilter)
public class MyFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();return null;}
}
1.4.3.3 自定义Filter(AbstractGatewayFilterFactory)
通过继承AbstractGatewayFilterFactory来实现
public class DemoGatewayFilterFactory extends AbstractGatewayFilterFactory<DemoGatewayFilterFactory.Config> {@Overridepublic GatewayFilter apply(Config config) {return null;}//Config 静态内部类,负责指定网关的参数static class Config{private String arg1;}
}
注意:DemoGatewayFilterFactory 的命名方式:由Demo + GatewayFilterFactory组成,
其中Demo是自己起名字,GatewayFilterFactory是固定的。
范型中的Config是我们待会要用到的静态内部类,用于声明过滤器中传递的参数
在Spring Cloud Gateway中,自定义的过滤器会在全局过滤器链中生效,不需要显式配置在路由配置中。这是因为AbstractGatewayFilterFactory类已经实现了GatewayFilterFactory接口,并且通过Spring的自动装配机制将其注册到全局过滤器链中,并且可以在任何路由上生效。
需要注意的是,在全局过滤器链中的顺序是根据Spring Bean加载顺序决定的。可以通过设置@Order注解或实现Ordered接口来控制自定义过滤器在全局过滤器链中的顺序。
1.5 Gateway工作流程
客户端向 Spring Cloud Gateway发出请求,然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler再通过指定的过滤器链来对请求进行过滤处理,最后发送到我们实际的服务执行业务逻辑,然后返回。

过滤器链被虚线分隔,是因为过滤器既可以在转发请求前拦截请求,也可以在请求处理之后对响应进行拦截处理。
1.6 实际操作
1.6.1 pom.xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1.6.2 启动类
@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
1.6.3 配置文件 application.yml
spring: application:name: cloud-gateway cloud:gateway:routes:# 路由的ID,没有固定规则但要求唯一,建议配合服务名- id: config_route# 匹配后提供服务的路由地址uri: http://ityouknow.com# 断言,路径相匹配的条件predicates:- Path=/routeconfig/rest/**- id: header_routeuri: http://ityouknow.compredicates:- Header=X-Request-Id, \d+
参考连接:
https://mp.weixin.qq.com/s/LY66FPCajHkzXJUFlfSNYg
https://blog.csdn.net/h1774733219/article/details/124384527
https://blog.csdn.net/qq_46203643/article/details/127150590
相关文章:
SpringCloud之微服务API网关Gateway介绍
文章目录 1 微服务API网关Gateway1.1 网关简介1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway核心概念1.4.1 路由1.4.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 默认过滤器1.4.3.2 自定义Filter(…...
机器学习入门之 pandas
pandas 有三种数据结构 一种是 Series 一种是 Dataframe import pandas as pd import numpy as np score np.random.randint(0,100,[10,5])score[0,0] 100Datascore pd.DataFrame(score)subject ["语文","数学","英语","物理&quo…...
Django之JWT库与SimpleJWT库的使用
Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…...
Jmeter远程服务模式运行时引用csv文件的路径配置
问题 在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。 在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考虑将脚本拷贝到remote主机。但是jmeter…...
《OWASP代码审计》学习——注入漏洞审计
一、注入的概念 注入攻击允许恶意用户向应用程序添加或注入内容和命令,以修改其行为。这些类型的攻击是常见且广泛的,黑客很容易测试网站是否易受攻击,攻击者也很容易利用这些攻击。如今,它们在尚未更新的遗留应用程序中非常常见…...
Linux虚拟机中安装MySQL5.6.34
目录 第一章、xshell工具和xftp的使用1.1)xshell下载与安装1.2)xshell连接1.3)xftp下载安装和连接 第二章、安装MySQL5.6.34(不同版本安装方式不同)2.1)关闭防火墙,传输MySQL压缩包到Linux虚拟机2.2&#x…...
Django的FBV和CBV
Django的FBV和CBV 基于django开发项目时,对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV,function base views,其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…...
[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目
文章目录 1.参考项目2.技能点3.GO的Dockerfile配置后端的结构如图Dockerfile先手动docker调试服务是否可以启动报错 4.Vue的Dockerfile配置前端的结构如图nginx_docker.confDockerfile构建 5.docker-compose 整合前后端docker-compose.yml错误记录(1)ip端…...
springboot-mybatis的增删改查
目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作: 准备数据库表 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动…...
HTML5(H5)的前生今世
目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML(超文本标记语言)的第五个版本,于2014年由万维网联盟(W3C)正式推出。HTML5的前身可以追溯到互联…...
抽象工厂模式(Abstract Factory)
抽象工厂模式提供一个创建一组相关或相互依赖的对象的接口,而无须指定它们具体的类,每个子类可以生产一系列相关的产品。 The Abstract Factory Pattern is to provide an interface for creating families of related or dependent objects without s…...
Java 实现下载文件工具类
package com.liunian.utils;import lombok.SneakyThrows;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream;/*** ClassName DownloadFileUtils* Author liuyan 下载文件工具类…...
C# 12 预览版的新功能
作者:Kathleen Dollard 排版:Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在,您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验…...
34.利用matlab解 多变量多目标规划问题(matlab程序)
1.简述 学习目标:适合解 多变量多目标规划问题,例如 收益最大,风险最小 主要目标法,线性加权法,权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) ; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…...
暑假刷题第18天--7/30
165. 小猫爬山 - AcWing题库(dfs) #include<iostream> #include<string> #include<bitset> #include<cstring> #include<algorithm> using namespace std; const int N18; bool vis[N]; int a[N],n,ans,sum[N],k; bool cmp(int x,int y){retur…...
通向架构师的道路之Apache整合Tomcat
一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…...
如何消除“信息孤岛”对业务增长的威胁?
根据CMSWire的数据,员工平均每天要花36%的时间来查找和整合信息。但44%的情况下,他们找不到信息。这种时间和精力的浪费就是信息孤岛造成的。 什么是信息孤岛? 当部门存储数据并限制其他人访问数据时,就会出现信息孤岛ÿ…...
Kali部署dvwa和pikachu靶场
kali换源 进入 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib替换完后更新源 apt-get upadteDVWA靶场环境搭建 使用git从github上把DV…...
LeetCode解法汇总722. 删除注释
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给一个 C 程序,删除程序中的注释。这个程序source是一个数组&#x…...
Linux中的firewall-cmd
2023年8月4日,周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务?为什么会有服务?打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones࿰…...
基于深度学习的宠物皮肤病识别系统
前言 随着人们对宠物健康和福利的关注增加,对宠物皮肤病的早期诊断和治疗变得尤为重要。然而,准确识别宠物的皮肤病类型是具有挑战性的,因为这需要专业的医学知识和经验。因此,本研究旨在开发一个基于深度学习的宠物皮肤病识别系统…...
HagiCode Skill 系统技术解析:如何打造可扩展的 AI 技能管理平台铀
环境安装 pip install keystone-engine capstone unicorn 这3个工具用法极其简单,下面通过示例来演示其用法。 Keystone 示例 from keystone import * CODE b"INC ECX; ADD EDX, ECX" try:ks Ks(KS_ARCH_X86, KS_MODE_64)encoding, count ks.asm(CODE)…...
【PCIe 验证每日学习・Day29】PCIe 链路训练与 LTSSM 状态机全解析
大家好,今天我们进入 PCIe 最核心、最基础,同时也是所有链路问题根源的模块:LTSSM 链路训练状态机。内容承接此前电源管理、虚拟化、中断等知识,从 “上电链路建立” 到 “异常恢复” 完整拆解,所有描述严格遵循 PCIe …...
Linux内核中的RCU机制详解
Linux内核中的RCU机制详解 引言 RCU(Read-Copy-Update)是Linux内核中一种高效的读写同步机制,特别适合读多写少的场景。它允许多个读者同时访问数据,写者通过复制和更新的方式来修改数据,避免了传统锁机制带来的性能开…...
ccmusic-database效果展示:麦克风实时录音→30秒截取→5类预测全链路演示
ccmusic-database效果展示:麦克风实时录音→30秒截取→5类预测全链路演示 1. 引言:当AI成为你的私人音乐DJ 想象一下这样的场景:你刚用手机录了一段朋友弹吉他的即兴片段,或者一段街头艺人的表演。你很好奇,这属于什…...
5分钟掌握CAD_Sketcher:Blender中实现精确参数化设计的终极指南
5分钟掌握CAD_Sketcher:Blender中实现精确参数化设计的终极指南 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher CAD_Sketcher是Blender中基于约束的几何草图工具…...
Redis:延迟双删的适用边界与落地细节弦
pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...
51单片机项目省电实战:除了掉电模式,你的STC89C52还能这样‘偷懒’降功耗
51单片机低功耗设计实战:从电路优化到代码框架的全方位策略 在电池供电的物联网设备中,51单片机因其高性价比依然占据重要地位。但许多开发者在使用STC89C52这类经典型号时,往往只关注了手册中提到的掉电模式,却忽略了系统级功耗优…...
别让AI代码,变成明天的技术债甭
如果有多个供应商,你也可以使用 [[CC-Switch]] 来可视化管理这些API key,以及claude code 的skills。 # 多平台安装指令 curl -fsSL https://claude.ai/install.sh | bash ## Claude Code 配置 GLM Coding Plan curl -O "https://cdn.bigmodel.cn/i…...
Umi-CUT:三步批量处理图片黑边,解放你的生产力
Umi-CUT:三步批量处理图片黑边,解放你的生产力 【免费下载链接】Umi-CUT 项目地址: https://gitcode.com/gh_mirrors/um/Umi-CUT 还在为海量图片的黑边烦恼吗?Umi-CUT批量图片处理工具就是你的终极解决方案。这款开源软件专为图片批量…...
