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,一经查实,立即删除!

相关文章

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性能优化的重要方面。本文将详细介绍几种常见的垃圾回…

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

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

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

想要在互联网娱乐领域大展拳脚吗&#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…

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

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

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错误解…

基于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;进程和被打开文件…

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

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

cesium 渐变虚线效果 PolylineDashMaterialProperty

cesium中有虚线材质PolylineDashMaterialProperty&#xff0c;可以在这个材质的基础上结合uv设置每个顶点的透明度&#xff0c;就能实现渐变的效果了。 一、原理&#xff1a;在glsl中结合uv设置每个顶点的透明度 vec2 st materialInput.st; material.alpha fragColor.a * (1…

Mongodb在UPDATE操作中使用$pull操作

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第68篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

链表题目之指定区间处理

前言 链表中有一些题目是需要知道并且记住对应的技巧的&#xff0c;有一些题目就是基本的链表技巧手动模拟推演注意细节等。 对于需要知道并且记住对应技巧的题目会有专门的一栏进行讲解&#xff0c;此类题目主要有&#xff1a;相交链表、环形链表、回文链表等&#xff0c;这些…

LeetCode | 27.移除元素

这道题的思路和26题一模一样&#xff0c;由于要在元素组中修改&#xff0c;我们可以设置一个index表示目前要修改原数组的第几位&#xff0c;由于遍历&#xff0c;访问原数组永远会在我们修改数组之前&#xff0c;所以不用担心数据丢失的问题&#xff0c;一次遍历数组&#xff…

18. 四数之和 - 力扣

1. 题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 …

LVS+Keepalived NGINX+Keepalived 高可用群集实战部署

Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 VRRP协议&#xff08;虚拟路由冗余协议&#xff09; 是针对路由器的一种备份解决方案由多台路由器组成一个热备组&#xff0c;通过共用的…

五、LVS原理

目录 5.1 LVS 相关原理 5.1.1 LVS集群的体系结构以及特点 5.1.1.1 LVS简介 5.1.1.2 LVS体系结构 5.1.1.3 LVS相关术语 5.1.1.4 LVS工作模式 5.1.1.5 LVS调度算法 5.1.2 LVS-DR集群介绍 5.1.2.1 LVS-DR模式工作原理 5.1.2.2 LVS-DR模式应用特点 5.1.2.3 LVS-DR模式ARP抑制 5.1…

VCS基本仿真

这里记录三种仿真方式&#xff1a; 第一种是将verilog文件一个一个敲在终端上进行仿真&#xff1b; 第二种是将多个verilog文件的文件路径整理在一个文件中&#xff0c;然后进行仿真&#xff1b; 第三种是利用makefile文件进行仿真&#xff1b; 以8位加法器为例&#xff1a; …

一二三应用开发平台应用开发示例(2)——创建应用、模块、实体及配置模型

创建应用 文档管理系统对于开发平台是一个业务应用。 业务应用是通过平台内置的数据字典来维护的&#xff0c;因此访问系统管理模块下的数据字典管理功能&#xff0c;在实体配置分组下找到“应用编码”&#xff0c;点击行记录上的“字典项”。 在打开的新窗口中&#xff0c;在…