Spring Cloud之API网关(Gateway)

目录

API网关

好处

解决方案

Gateway

简介

特征

核心概念

Route(路由)

Predicate(断言)

Filter(过滤器)

工作流程

Route(路由)

路由配置方式

1.yml配置文件路由

2.bean进行配置

3.动态路由

动态路由

Predicate(断言)

特点

常见断言

示例

Filter(过滤器)

filter分类

Pre 类型

Post 类型

网关过滤器

格式

示例

全局过滤器

示例


在微服务架构中,一个系统由多个微服务组成,而这些服务可能部署在不同的地区、不同的机房,客户端想要连接,就需要知道它们具体的地址信息;

存在问题:

1.当服务数量众多时,客户端需要维护大量的服务地址,这对于客户端来说,是非常繁琐的

2.某些情况下存在跨域请求问题

3.认证难度大,每个微服务需要独立认证

API网关

        网关是一个搭建在客户端和微服务之间的服务,我们可以在 API 网关中处理一些非业务功能的逻辑,例如权限验证、监控、缓存、请求路由等

        网关就像整个微服务系统的门面一样,是系统对外的唯一入口。有了它,客户端会先将请求发送到 API 网关,然后由 API 网关根据请求的标识信息将请求转发到微服务实例

好处

1.网关与微服务交互时,客户端只需要知道网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发

2.客户端直接与网关通信,能够减少客户端与各个服务的交互次数

3.客户端与后端的服务耦合度降低

4.节省流量,提高性能,提升用户体验

5.网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能

解决方案

1.gateway

2.zuul

3.kong

4.Nginx+Lua

Gateway

简介

        Spring Cloud 团队基于 Spring 5.0、Spring Boot 2.0 和 Project Reactor 等技术开发的高性能 API 网关组件;旨在提供一种简单而有效的途径来发送 API,并为它们提供横切关注点,例如:安全性,监控/指标和弹性

特征

1.基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 构建

2.任意请求属性上匹配路由

3.断言 和过滤器是特定于路由的

4.集成了 Hystrix 熔断器

5.集成了 Spring Cloud DiscoveryClient(服务发现客户端)

6.易于编写断言和过滤器

7.能够限制请求频率

8.能够重写请求路径

核心概念

gateway最主要的功能就是路由转发,而在定义转发规则时主要涉及到三个核心概念

Route(路由)

        网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成

Predicate(断言)

        路由转发的判断条件,我们可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。

Filter(过滤器)

        我们可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理

工作流程

说明:

1.客户端将请求发送到gateway

2.gateway通过gateway Handler Mapping找到相匹配得到路由,将其发送给gateway web Handler

3.gateway web Handler通过指定的过滤器链,将请求转发到实际的服务节点中,执行业务返回响应结果

注意:

1.过滤器之间用虚线分开是因为过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑

2.过滤器(Filter)可以在请求被转发到服务端前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等

3.过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。

        Gateway 的请求需要通过一定的匹配条件,才能定位到真正的服务节点。在将请求转发到服务进行处理的过程前后(pre 和 post),我们还可以对请求和响应进行一些精细化控制。

Route(路由)

        路由是网关最基础的部分,路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成。如果断言为真,则说明请求URL和配置的路由匹配。

格式:

id:我们自定义的路由 ID,保持唯一

uri:目标服务地址

路由配置方式

1.yml配置文件路由
#第一种:ws(websocket)方式: uri: ws://localhost:8888
#第二种:http方式: uri: http://localhost:8888/
#第三种:lb(注册中心中服务名字)方式: uri: lb://consumer
spring:cloud:gateway:routes:# 路由id,没有固定规则,建议配合服务名- id: consumer# 匹配后提供服务的路由地址# 需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri。uri: lb://consumerpredicates:# 断言:路径相匹配的进行路由- Path=/**
2.bean进行配置
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();// 第一个参数是路由的唯一idroutes.route("consumer",r -> r.path("/hello").uri("http://localhost:8888/hello")).build();return routes.build();}
}
3.动态路由

可以通过服务名进行转发,无需配置routes也可以转发

spring:application:name: gatewaycloud:gateway:discovery:locator:#开启根据微服务名称自动转发enabled: true#小写lower-case-service-id: true

动态路由

        默认情况下,Gateway 会根据服务注册中心中维护的服务列表,以服务名作为路径创建动态路由进行转发,从而实现动态路由功能。

形式:

lb://service-name

lb:uri 的协议,表示开启 Spring Cloud Gateway 的负载均衡功能。

service-name:服务名,Spring Cloud Gateway 会根据它获取到具体的微服务地址。

Predicate(断言)

        Predicate 断言来实现 Route 路由的匹配规则。Predicate 是路由转发的判断条件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理;

特点

1.路由与断言的关系为:一对多,一个路由可以包含多个不同断言

2.一个请求想转发到指定的路由上,就必须同时匹配路由上的所有断言

3.当一个请求同时满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发

常见断言

示例

配置文件 application.yml中添加配置内容

server:port: 9527  #端口号
spring:application:name: microServiceCloudGatewaycloud:gateway: #网关路由配置routes:#将 micro-service-cloud-provider-dept-8001 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 9527- id: provider_dept_list_routh   #路由 id,没有固定规则,但唯一,建议与服务名对应uri: http://localhost:8001          #匹配后提供服务的路由地址predicates:#以下是断言条件,必选全部符合条件- Path=/dept/list/**               #断言,路径匹配 注意:Path 中 P 为大写- Method=GET #只能时 GET 请求时,才能访问

配置中在 spring.cloud.gateway.routes 下使用 predicates 属性,定义了以下两个断言条件:

- Path=/dept/list/*

-Method=GET

HTTP 请求同时满足以上所有的断言时,该请求才会被转发到指定的服务端中

 

Filter(过滤器)

        出于安全方面的考虑,服务端提供的服务往往都会有一定的校验逻辑,例如用户登陆状态校验、签名校验等;微服务架构中,系统由多个微服务组成,所有这些服务都需要这些校验逻辑,此时我们就可以将这些校验逻辑写到Gateway的 Filter 过滤器中。

filter分类

Gateway 提供了以下两种类型的过滤器,可以对请求和响应进行精细化控制:

Pre 类型

        这种过滤器在请求被转发到微服务之前可以对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等操作。

Post 类型

        这种过滤器在微服务对请求做出响应后可以对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。

网关过滤器

GatewayFilter 是 Gateway 网关中提供的一种应用在单个或一组路由上的过滤器。它可以对单个路由或者一组路由上传入的请求和传出响应进行拦截,并实现一些与业务无关的功能,比如登陆状态校验、签名校验、权限校验、日志输出、流量监控等

格式
    spring:cloud:gateway: routes:- id: xxxxuri: xxxxpredicates:- Path=xxxxfilters:- AddRequestParameter=X-Request-Id,1024 #过滤器工厂会在匹配的请求头加上一对请求头,名称为 X-Request-Id 值为 1024- PrefixPath=/dept #在请求路径前面加上 /dept……

Gateway 内置了多达 31 种 GatewayFilter,下表中列举了几种常用的网关过滤器及其使用示例:

示例

application.yml 中在添加一个动态路由:

- id: provider_dept_get_routh

        uri: lb://MICROSERVICECLOUDPROVIDERDEPT #使用服务名代替上面的具体带端口         predicates:

                - Path=/get/**

        filters:

                - PrefixPath=/dept #在请求路径上增加一个前缀 /dept

全局过滤器

        GlobalFilter 是一种作用于所有的路由上的全局过滤器,通过它,我们可以实现一些统一化的业务功能,例如权限认证、IP 访问限制等。当某个请求被路由匹配时,那么所有的 GlobalFilter 会和该路由自身配置的 GatewayFilter 组合成一个过滤器链;

示例

1.新建一个名为 MyGlobalFilter 全局过滤器配置类

/**
* 自定义全局网关过滤器(GlobalFilter)
*/
@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("进入自定义的全局过滤器 MyGlobalFilter" + new Date());String uname = exchange.getRequest().getQueryParams().getFirst("uname");if (uname == null) {log.info("参数 uname 不能为 null!");exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {//过滤器的顺序,0 表示第一个return 0;}
}

2.使用浏览器访问“http://eureka7001.com:9527/dept/list”,我们会发现访问报 406 错误

3.浏览器访问“http://eureka7001.com:9527/dept/list?uname=123”

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IOC课程整理-19 Spring Environment 抽象

1. 理解 Spring Environment 抽象 2. Spring Environment 接口使用场景 3. Environment 占位符处理 4. 理解条件配置 Spring Profiles 5. Spring 4 重构 Profile 6. 依赖注入 Environment 7. 依赖查找 Environment 8. 依赖注入 Value 9. Spring 类型转换在 Environment 中的运用…

ZYNQ连载01-ZYNQ介绍

ZYNQ连载01-ZYNQ介绍 1. ZYNQ 参考文档&#xff1a;《ug585-zynq-7000-trm.pdf》 ZYNQ分为PS和PL两大部分&#xff0c;PS即ARM&#xff0c;PL即FPGA&#xff0c;PL作为PS的外设。 2. 方案 ZYNQ7020为双核A9架构&#xff0c;多核处理器常用的运行模式为AMP(非对称多处理)和…

测试C#调用Vlc.DotNet组件播放视频

除了Windows Media Player组件&#xff0c;在百度上搜索到还有不少文章介绍采用Vlc.DotNet组件播放视频&#xff0c;关于Vlc.DotNet的详细介绍见参考文献1&#xff0c;本文学习Vlc.DotNet的基本用法。   VS2022中新建基于.net core的winform程序&#xff0c;在Nuget包管理器中…

[论文精读]How Powerful are Graph Neural Networks?

论文原文&#xff1a;[1810.00826] How Powerful are Graph Neural Networks? (arxiv.org) 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#x…

脚本木马编写

PHP小马编写 小马用waf扫描&#xff0c;没扫描出来有风险。 小马过waf之后用echo $_SERVER[DOCUMENT_ROOT]获得当前运行脚本所在的文档根目录。&#xff0c;然后在上传大马工具。 $_SERVER&#xff0c;参考&#xff1a;PHP $_SERVER详解 小马编写二次加密 现在是可以被安全…

辅助驾驶功能开发-功能规范篇(22)-4-L2级辅助驾驶方案功能规范

1.3.4 LDW系统功能定义 1.3.4.1 状态机 1.3.4.2 功能定义 1.3.4.2.1 信号需求列表 1.3.4.2.2 系统开启关闭 1)初始化 车辆上电后,车道偏离预警系统(LDW)进行初始化,控制器需要在上电后 220ms 内发出第一帧报文,并在 3s 内 完成内部自检,同时上电 3s 内不进行关联系统…

ProEssentials pro v9 历史更新列表--注册版

ProEssentials标准版和专业版之间的唯一区别是可以渲染的数据点和注释的数量。标准版与专业版一样拥有所有的功能和接口。所有版本包括WPF、WinForm、WebForm、ActiveX、VCL和DLL接口。标准版仅限于8000个数据点和800个图表注释。此限制适用于每个控件实例。你可以运行多个控件…

H5游戏源码分享-像素小鸟游戏(类似深海潜艇)

H5游戏源码分享-像素小鸟游戏&#xff08;类似深海潜艇&#xff09; 点击屏幕控制小鸟的飞行高度 整个小游戏就用JS完成 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88483228 <!DOCTYPE HTML> <html><head><meta http-equiv…

荣耀推送服务消息分类标准

前言 为了提升终端用户的推送体验、营造良好可持续的通知生态&#xff0c;荣耀推送服务将对推送消息进行分类管理。 消息分类 定义 荣耀推送服务将根据应用类型、消息内容和消息发送场景&#xff0c;将推送消息分成服务通讯和资讯营销两大类别。 服务通讯类&#xff0c;包…

进程替换..

1、单进程版 – 最简单的先看看程序替换 现象就是 1、我们用自己的进程封装了内置指令ls,并且代码中execl 后 printf 的after并没有打印出来。 2、谈进程替换的原理 单进程替换基本原理 上面例子中execl的做法非常简单粗暴&#xff0c;要调用ls&#xff0c;那么就把mycom…

整型在内存中的存储

前言&#xff1a; 本文章旨在从例题中加深对整型在数据中的存储的相关知识的理解。 首先我们需要明确整型在内存中都是以补码的形式进行计算 例1&#xff1a; 解析&#xff1a; 首先我们需要明确整型在内存中都是以补码的形式进行计算。 接着将一个整型类型的数据存储在ch…

详细介绍如何使用 NeRF 进行 3D 体积渲染-附源码下载

介绍 在此示例中,我们展示了 Ben Mildenhall 等人的研究论文 NeRF:将场景表示为用于视图合成的神经辐射场的最小实现 。等人。作者提出了一种巧妙的方法,通过神经网络对体积场景函数进行建模来合成场景的新颖视图。 为了帮助您直观地理解这一点,让我们从以下问题开始: 是…

基于FPGA的图像PSNR质量评估计算实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 设置较大的干扰&#xff0c;PSNR15。 设置较小的干扰&#xff0c;PSNR25。 2.算法运行软件版本 matlab2022a vivado2019.2 3.部分核心程序 ti…

一周通过Professional Scrum Master(PSM1)考试准备分享

目录 一、为什么要考PSM 二、考试培训费用 三、学习时间 四、备考流程 1.通读Scrum Guide 2.完成Scrum Open的练习题3次 3.找题库刷题 4.再次完成Scrum Open的练习题3次 5.正式参加考试 五、其他考试准备 1.考试资格购买 2.语言 六、后记 一、为什么要考PSM 市面上有不少…

应用开发平台集成工作流系列之17——流程建模功能前端设计与改造回顾

背景 对于流程设置不友好的问题&#xff0c;国内钉钉另行设计与实现了一套流程建模模式&#xff0c;跟bpmn规范无关&#xff0c;有人仿照实现了下&#xff0c;并做了开源&#xff08;https://github.com/StavinLi/Workflow-Vue3&#xff09;&#xff0c;效果图如下&#xff1a…

蓝桥杯每日一题2023.10.28

题目描述 递增三元组 - 蓝桥云课 (lanqiao.cn) 题目分析 60分解法&#xff1a; 直接暴力循环每一个数进行比较 #include<bits/stdc.h> using namespace std; const int N 2e5 10; typedef long long ll; ll n, a[N], b[N], c[N], ans; int main() {cin >> n;…

从InnoDB索引的数据结构,去理解索引

从InnoDB索引的数据结构&#xff0c;去理解索引 1、InnoDB 中的 BTree1.1、BTree 的组成1.2、BTree中的数据页 2、聚簇索引2.1、聚簇索引的特点2.2、聚簇索引的结构示例2.3、聚簇索引的优缺点 3、非聚簇索引3.1、非聚簇索引结构示例3.2、关于回表3.3、聚簇索引和非聚簇索引的区…

STM32G030F6P6点灯闪烁

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

centos ubantu IP一直变化,远程连接不上问题

文章目录 一、为什么IP地址会变1.主机DHCP导致 二、解决IP地址变化1.centos2.ubantu 总结 虚拟机能连接为互联网,但下一次启动IP地址再发生变化,无法使用ssh远程连接 一、为什么IP地址会变 1.主机DHCP导致 虚拟机系统(ubantu,centos…)启动后会向本地申请IP地址租约,租聘的I…

单片机为什么一直用C语言,不用其他编程语言?

单片机为什么一直用C语言&#xff0c;不用其他编程语言&#xff1f; 51 单片机规模小得拮据&#xff0c;C 的优势几乎看不到。放个类型信息进去都费劲&#xff0c;你还想用虚函数&#xff1f;还想模板展开&#xff1f;程序轻松破 10k。最近很多小伙伴找我&#xff0c;说想要一些…