Spring Cloud 之 GateWay

前言

请添加图片描述

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z
请添加图片描述

ChatGPT体验地址

请添加图片描述

文章目录

  • 前言
  • 前言
  • 1、通过API网关访问服务
  • 2、Spring Cloud GateWay 最主要的功能就是路由转发
  • 3、Gateway的工作流程
  • 4、Predicate 断言
  • 5、示例
    • 5.1、pom.xml配置
    • 5.2、application.xml配置
    • 5.3、启动类
  • 6、动态路由
    • 6.1、修改application.xml配置
  • 7、过滤器Filter
    • 7.1、Filter 分类
      • 7.1.1、GatewayFilter
      • 7.1.2、实例
      • 7.1.2、GlobalFilter

前言

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

1、通过API网关访问服务

  • 客户端通过 API 网关与微服务交互时,客户端只需要知道 API 网关地址即可,而不需要维护大量的服务地址,简化了客户端的开发。
  • 客户端直接与 API 网关通信,能够减少客户端与各个服务的交互次数。
  • 客户端与后端的服务耦合度降低。
  • 节省流量,提高性能,提升用户体验。
  • API 网关还提供了安全、流控、过滤、缓存、计费以及监控等 API 管理功能。

2、Spring Cloud GateWay 最主要的功能就是路由转发

而在定义转发规则时主要涉及了以下三个核心概念,如下表。

核心概念描述
Route(路由)网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成。
Predicate(断言)路由转发的判断条件,我们可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。
Filter(过滤器)过滤器,我们可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理。

3、Gateway的工作流程

image.png

  • 客户端将请求发送到 Spring Cloud Gateway 上。
  • Spring Cloud Gateway 通过 Gateway Handler Mapping 找到与请求相匹配的路由,将其发送给 Gateway Web Handler。
  • Gateway Web Handler 通过指定的过滤器链(Filter Chain),将请求转发到实际的服务节点中,执行业务逻辑返回响应结果。
  • 过滤器之间用虚线分开是因为过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑。
  • 过滤器(Filter)可以在请求被转发到服务端前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等。
  • 过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。
  • 响应原路返回给客户端。

4、Predicate 断言

pring Cloud Gateway 通过 Predicate 断言来实现 Route 路由的匹配规则。简单点说,Predicate 是路由转发的判断条件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理。
image.png
常见的 Predicate 断言如下表(假设转发的 URI 为 http://localhost:8001)。

断言示例说明
Path- Path=/user/listUserInfo/**当请求路径与 /user/listUserInfo/** 匹配时,该请求才能被转发到 http://localhost:8001上。
Before- Before=2022-12-07T11:47:34.255+08:00[Asia/Shanghai]在 2022 年 12 月 07 日 11 时 47 分 34.255 秒之前的请求,才会被转发到 http://localhost:8001上。
After- After=2022-12-07T11:47:34.255+08:00[Asia/Shanghai]在 2022 年 12 月 07 日 11 时 47 分 34.255 秒之后的请求,才会被转发到 http://localhost:8001上。
Between- Between=2022-12-07T15:18:33.226+08:00[Asia/Shanghai],2022-12-07T15:23:33.226+08:00[Asia/Shanghai]在 2022 年 12 月 07 日 15 时 18 分 33.226 秒 到 2022 年 12 月 07 日 15 时 23 分 33.226 秒之间的请求,才会被转发到 http://localhost:8001服务器上。
Cookie- Cookie=name,hqyj.com携带 Cookie 且 Cookie 的内容为 name=hqyj.com 的请求,才会被转发到 http://localhost:8001上。
Header- Header=X-Request-Id,\d+请求头上携带属性 X-Request-Id 且属性值为整数的请求,才会被转发到 http://localhost:8001上。
Method- Method=GET只有 GET 请求才会被转发到 http://localhost:8001上。

5、示例

建立子模块:gateway-service

5.1、pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.hqyj</groupId><artifactId>SpringCloud</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>gateway-service</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies></project>

5.2、application.xml配置

server:port: 80
spring:application:name: gateway-servicecloud:gateway: #网关路由配置routes:#将 drp-user-service 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 80- id: drp-user-service_routh   #路由 id,没有固定规则,但唯一,建议与服务名对应uri: http://localhost:8001          #匹配后提供服务的路由地址predicates:#以下是断言条件,必选全部符合条件- Path=/user/userInfoList/**               #断言,路径匹配 注意:Path 中 P 为大写- Method=GET #只能时 GET 请求时,才能访问eureka:instance:instance-id: gateway-servicehostname: localhostclient:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://localhost:7001/eureka

5.3、启动类

@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

访问:http://localhost/user/userInfoList

6、动态路由

以服务名(spring.application.name)作为路径创建动态路由进行转发,从而实现动态路由功能
Route 的 uri 地址修改为以下形式。

lb://service-name

6.1、修改application.xml配置

server:port: 80
spring:application:name: gateway-servicecloud:gateway: #网关路由配置routes:#将 user-service 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 80- id: user-service_routh   #路由 id,没有固定规则,但唯一,建议与服务名对应,必须是*_routh格式,否则报错uri: lb://USER-SERVICE          #匹配后提供服务的路由地址 , 必须引入依赖:spring-cloud-starter-loadbalancerpredicates:#以下是断言条件,必选全部符合条件- Path=/user/userInfoList/**               #断言,路径匹配 注意:Path 中 P 为大写- Method=GET #只能时 GET 请求时,才能访问metadata:connect-timeout: 10#单位毫秒response-timeout: 10000- id: admin-service_routh   #路由 id,没有固定规则,但唯一,建议与服务名对应,必须是*_routh格式,否则报错uri: lb://ADMIN-SERVICE          #匹配后提供服务的路由地址 , 必须引入依赖:spring-cloud-starter-loadbalancerpredicates:#以下是断言条件,必选全部符合条件- Path=/api/admin/**               #断言,路径匹配 注意:Path 中 P 为大写- Method=GET #只能时 GET 请求时,才能访问metadata:connect-timeout: 10#单位毫秒response-timeout: 10000eureka:instance:instance-id: gateway-servicehostname: localhostclient:fetch-registry: trueregister-with-eureka: trueservice-url:defaultZone: http://localhost:7001/eureka

7、过滤器Filter

用户登陆状态校验、签名校验。
Spring Cloud Gateway 提供了以下两种类型的过滤器

过滤器类型说明
Pre 类型这种过滤器在请求被转发到微服务之前可以对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等操作。
Post 类型这种过滤器在微服务对请求做出响应后可以对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。

7.1、Filter 分类

按照作用范围划分,Spring Cloud gateway 的 Filter 可以分为 2 类:GatewayFilter、GlobalFilter

7.1.1、GatewayFilter

应用在单个路由或者一组路由上的过滤器。
常用的GatewayFilter过滤器

路由过滤器描述参数使用示例
AddRequestHeader拦截传入的请求,并在请求上添加一个指定的请求头参数。name:需要添加的请求头参数的 key
value:需要添加的请求头参数的 value。- AddRequestHeader=my-request-header,1024
AddRequestParameter拦截传入的请求,并在请求上添加一个指定的请求参数。name:需要添加的请求参数的 key;
value:需要添加的请求参数的 value。- AddRequestParameter=my-request-param,c.biancheng.net
AddResponseHeader拦截响应,并在响应上添加一个指定的响应头参数。name:需要添加的响应头的 key;
value:需要添加的响应头的 value。- AddResponseHeader=my-response-header,c.biancheng.net
PrefixPath拦截传入的请求,并在请求路径增加一个指定的前缀。prefix:需要增加的路径前缀。-PrefixPath=/consumer
PreserveHostHeader转发请求时,保持客户端的 Host 信息不变,然后将它传递到提供具体服务的微服务中。-PreserveHostHeader
RemoveRequestHeader移除请求头中指定的参数。name:需要移除的请求头的 key。- RemoveRequestHeader=my-request-header
RemoveResponseHeader移除响应头中指定的参数。name:需要移除的响应头。- RemoveResponseHeader=my-response-header
RemoveRequestParameter移除指定的请求参数。name:需要移除的请求参数。- RemoveRequestParameter=my-request-param
RequestSize配置请求体的大小,当请求体过大时,将会返回 413 Payload Too Large。maxSize:请求体的大小。- name:RequestSize
args:
  maxSize: 5000000 |

7.1.2、实例

spring:application:name: gateway-servicecloud:gateway: #网关路由配置routes:#将 user-service 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 80- id: user-service_routh   #路由 id,没有固定规则,但唯一,建议与服务名对应, 必须是*_routh格式,否则报错uri: lb://USER-SERVICE          #匹配后提供服务的路由地址,#匹配后提供服务的路由地址 , 必须引入依赖:spring-cloud-starter-loadbalancerpredicates:#以下是断言条件,必选全部符合条件- Path=/userInfoList/**               #断言,路径匹配 注意:Path 中 P 为大写- Method=GET #只能时 GET 请求时,才能访问filters:- AddRequestHeader=token,tigergege- PrefixPath=/user

7.1.2、GlobalFilter

应用在所有的路由上的过滤器,可用于统一异常处理

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.RequestPath;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;/**** @title DrfGlobalFilter* @desctption 登录验证* @author Administrator* @create 2023/5/15 14:17**/
@Component
public class DrfGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();//获取URI地址RequestPath path = request.getPath();HttpHeaders headers = request.getHeaders();List<String> stringList = headers.get("token");//是否登录验证if(CollectionUtils.isEmpty(stringList)){ServerHttpResponse response = exchange.getResponse();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {//过滤器优先级,0为最高return 0;}
}

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

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

相关文章

SQL调优方案

1、尽量避免使用in或not in语句&#xff0c;发生数据库的全表扫描 2、尽量避免使用&#xff01;或< >号&#xff0c;发生数据库的全表扫描 3、在查询多的情况下要使用索引提高查询效率&#xff0c;但也降低了insert或update的操作&#xff0c;对于一个表所要建立的索引…

Web前端转盘抽奖:技术与创意的完美结合

Web前端转盘抽奖&#xff1a;技术与创意的完美结合 在Web前端开发中&#xff0c;转盘抽奖作为一种常见的互动形式&#xff0c;既增加了用户参与度&#xff0c;又提升了用户体验。本文将深入探讨Web前端转盘抽奖的四个方面、五个方面、六个方面和七个方面&#xff0c;带你领略其…

Java中json字符串与json对象

1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串&#xff0c;它遵循json这种格式。 2、前后端交互传输的json是什么&#xff1f; 前后端交互传输的json都是json字符串 比如&#xff1a; 2.1响应过程&#xff1a;后端响应…

JVM的几种常见垃圾回收算法

引言&#xff1a; Java Virtual Machine&#xff08;JVM&#xff09;作为Java程序运行的核心&#xff0c;其垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制在内存管理中起着至关重要的作用。垃圾回收算法是JVM性能优化的重要方面。本文将详细介绍几种常见的垃圾回…

代理IP池功能组件

1.IP池管理器&#xff1a;用于管理IP池&#xff0c;包括IP地址的添加、删除、查询和更新等操作。 2.代理IP获取器&#xff1a;用于从外部资源中获取代理IP&#xff0c;例如从公开代理IP网站上爬取代理IP、从代理服务商订购代理IP等。 3.IP质量检测器&#xff1a;用于检测代理…

树莓派启动后安装向日葵客户端用于唤醒局域网其他机器

11:05 2024/6/11 树莓派启动后安装向日葵客户端 reated symlink /etc/systemd/system/multi-user.target.wants/phtunnel.service → /lib/systemd/system/phtunnel.service. Installation, please later... Successful installation of Phddns Service. -------------------…

ui自动化中,几种文件上传整理2024

input标签的 对于input标签实现的文件上传&#xff0c;看成输入框&#xff0c;直接send_keys 非input标签的 要使用第三方库&#xff1a; 方式1&#xff1a; pip install pypiwin32 要点&#xff1a;图片路径要写路径 方式2&#xff1a;pip install pyautogui 方式3&#…

2024-6-12(沉默JavaIO,Java异常)

1.文件流(开发中操作十分频繁&#xff0c;eg:躺着一个Apache FileUtils类) File 类是文件和目录的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。要想修改文件内容&#xff0c;需要借助输入输出流。 2.字节流&#xff1a;JavaIO的基石 一切文件&#xf…

打造你的专属扭蛋机:淘宝扭蛋机小程序搭建全攻略

想要在互联网娱乐领域大展拳脚吗&#xff1f;淘宝扭蛋机小程序或许是你的不二选择。本文将为你提供详细的搭建教程&#xff0c;帮助你轻松打造属于自己的扭蛋机小程序。 一、了解扭蛋机小程序的基本原理 在开始搭建之前&#xff0c;我们需要了解扭蛋机小程序的基本原理。扭蛋机…

Vue26-内置指令03:v-cloak指令

一、需求 将引入本地JS的代码&#xff0c;换成引入外部JS&#xff0c;且引入的外部JS要等待5S。 【备注】&#xff1a;浏览器也能调节网速 二、js阻塞 <body>的最下方也能引入JS&#xff1a; 此时&#xff0c;用户能在5S内看到root容器未编译的部分。 解决该问题&#x…

国思RDIF.vNext全新低代码快速开发框架平台6.1版本发布(支持vue2、vue3)

1、平台介绍 RDIF.vNext&#xff0c;全新低代码快速开发集成框架平台&#xff0c;给用户和开发者最佳的.Net框架平台方案&#xff0c;为企业快速构建跨平台、企业级的应用提供强大支持。 RDIF.vNext的前身是RDIFramework框架&#xff0c;RDIF(Rapid develop Integrate Framewor…

HBase中的CRUD

Table接口&#xff1a;负责表数据的基本操作。 Admin类&#xff1a;负责管理建表、删表、该表等元数据操作的接口。 1、Put方法 1.1、了解put方法之前&#xff0c;必须知道的相关知识。 在HBase中有一个理念&#xff1a;所有的数据皆为bytes。因此在HBase中所有的数据最终都…

【云原生| K8S系列】Kubernetes Daemonset,全面指南

Kubernetes中的DaemonSet是什么? Kubernetes是一个分布式系统&#xff0c;Kubernetes平台管理员应该有一些功能可以在所有节点上运行特定于平台的应用程序。例如&#xff0c;在所有Kubernetes节点上运行日志代理。 这就是Daemonset发挥作用的地方。 Daemonset是一个原生的K…

yolo-inference多后端+多任务+多算法+多精度模型 框架开发记录(cpp版)

先贴出github地址&#xff0c;欢迎大家批评指正&#xff1a;https://github.com/taifyang/yolo-inference 不知不觉LZ已经快工作两年了&#xff0c;由于之前的工作内容主要和模型部署相关&#xff0c;想着利用闲暇时间写一些推理方面的经验总结&#xff0c;于是有了这个工程。其…

JsSIP+FreeSwitch+Vue实现WebRtc音视频通话

效果 让同事帮我测的&#xff0c;在两个电脑分别打开该页面&#xff0c;一个注册 1007 分机号&#xff0c;另一个注册 1005&#xff0c;然后拨打视频电话 依赖版本 jssip&#xff1a;3.6.1 freeswitch&#xff1a;1.10.5-release~64bit vue&#xff1a;2.6.12 488错误解…

【杂记-浅谈SNMP网络管理标准协议】

一、SNMP概述、作用、优点 概述 1、SNMP&#xff0c;Simple Network Management Protocol&#xff0c;简单网络管理协议、利用网络管理网络&#xff0c;网络管理员利用SNMP平台在网络上的任意节点完成信息查询、信息修改和故障排查等工作&#xff0c;工作效率得以提高。 2、SN…

基于WPF技术的换热站智能监控系统06--实现左侧故障统计

1、区域划分 2、ui实现 这里使用的是livechart的柱状图呈现的 3、运行效果 走过路过不要错过&#xff0c;点赞关注收藏又圈粉&#xff0c;共同致富&#xff0c;为财务自由作出贡献

Linux基础IO【II】

今天&#xff0c;我们接着在上一篇文章的基础上&#xff0c;继续学习基础IO。观看本文章之前&#xff0c;建议先看&#xff1a;Linux基础IO【I】&#xff0c;那&#xff0c;我们就开始吧&#xff01; 一.文件描述符 1.重新理解文件 文件操作的本质&#xff1a;进程和被打开文件…

PCA降维算法

decomposition.h #pragma once #include <arrayfire.h>namespace decomposition {class PCA{public:af::array zero_centred(af::array

DETR实现目标检测(一)-训练自己的数据集

1、DETR架构 DETR&#xff08;Detection Transformer&#xff09;是一种新型的目标检测模型&#xff0c;由Facebook AI Research (FAIR) 在2020年提出。DETR的核心思想是将目标检测任务视为一个直接的集合预测问题&#xff0c;而不是传统的两步或多步预测问题。这种方法的创新…