微服务のGeteWay

目录

概念:

三大核心:

工作流程:

9527网关如何做路由映射:

GetWay高级特性:

按服务名动态路由服务:

断言Route Predicate Factories :

获取当前时区时间: 

After Route : 

例:

Before,Between 同理:

Cookie Route :

Header Route :

自定义断言 :

Filter过滤器:

1. Filter的作用

2. Filter的分类

1. Pre Filter(前置过滤器)

2. Post Filter(后置过滤器)

3. Error Filter(错误过滤器)

请求头AddRequestHeader :

请求参数 RemoveRequestParameter和AddRequestParameter

 请求回应ResponseHeader:

前缀和路径相关组: 

全局过滤器: 

自定义条件Filter: 


概念:

 微服务中网关在哪里?

三大核心:

Route路由 ,Predicate断言,Filter过滤器

工作流程:

核心逻辑:路由转发,断言判断,执行过滤器链

9527网关如何做路由映射:

前提:

我们需要提前把GeteWay服务注册到consul当中

核心:配置yml

server:port: 9527spring:application:name: cloud-gateway #以微服务注册进consul或nacos服务列表内cloud:consul: #配置consul地址host: localhostport: 8500discovery:prefer-ip-address: trueservice-name: ${spring.application.name}gateway:routes:- id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由- id: pay_routh2 #pay_routh2                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名uri: http://localhost:8001                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/info/**              # 断言,路径相匹配的进行路由

隐真示假 ,让用户不知道我们真正的地址:

没有使用GeteWay之前访问的路径是 http://localhost:8001/pay/gateway/get/1

使用了GeteWay之后可以使用http://localhost:9527/pay/gateway/get/1

将feignclient请求的微服务更改为注册中心的geteway:

先启动 8001微服务和feign80,可以看到请求失败:

启动9527网关后,请求成功,说明现在请求微服务必须通过geteway,配置成功: 

 

GetWay高级特性:

按服务名动态路由服务:

格式: 

uri:lb://service

微服务名为cloud-payment-service,通过使用注册中心的微服务名称,就可以动态的配置路由地址,配置如下: 

断言Route Predicate Factories :

官网地址:点击跳转 

通过断言判断请求是否路由到微服务。 

获取当前时区时间: 

在讲解之前,我们需要先知道如何获取默认时区时间 

public static void main(String[] args)
{ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区System.out.println(zbj);
}

After Route : 

官网描述如下:

 表示只有在当前时间之后,该路由才会被匹配。

例:

yml配置格式 ,我配置的时间是大于当前时间的,但我们必须要在该时间后才能访问到:

spring:
  cloud:
    gateway:
      routes:
        - id: route1
          uri: http://localhost:8081
          predicates:
            - Path=/api/**
            - After=2024-12-26T17:31:14.523838700+08:00[Asia/Shanghai]

访问结果如下: 

Before,Between 同理:

Cookie Route :

官方描述如下:

通过键值对的方式配置Cookie,访问时必须带上Cookie,否则访问不到服务。

 

Header Route :

请求头要有X-Request-Id属性并且值为整数的正则表达式

 其他的断言用到了请查阅官方文档,写得很详细

自定义断言 :

@Component
public class MyRoutePredicateFactory extends AbstractRoutePredicateFactory<MyRoutePredicateFactory.Config>
{public MyRoutePredicateFactory(){super(MyRoutePredicateFactory.Config.class);}@Validatedpublic static class Config{@Setter@Getter@NotEmptyprivate String userType; //钻、金、银等用户等级}@Overridepublic Predicate<ServerWebExchange> apply(MyRoutePredicateFactory.Config config){return new Predicate<ServerWebExchange>(){@Overridepublic boolean test(ServerWebExchange serverWebExchange){//检查request的参数里面,userType是否为指定的值,符合配置就通过String userType = serverWebExchange.getRequest().getQueryParams().getFirst("userType");if (userType == null) return false;//如果说参数存在,就和config的数据进行比较if(userType.equals(config.getUserType())) {return true;}return false;}};}//开启shortcut支持@Overridepublic List<String> shortcutFieldOrder() {return Collections.singletonList("userType");}
}

YML配置:

 必须加上usertype=diamond才能访问的服务

Filter过滤器:

官方文档:点击跳转 

1. Filter的作用

Filters 通常用于以下几种场景:

  • 请求预处理:对请求进行检查、修改、验证或转换,如请求数据格式化、认证、限流、日志记录等。
  • 响应后处理:在响应数据返回客户端之前进行处理,如数据加密、响应格式化、缓存处理等。
  • 路由转发:基于请求中的一些特定信息(如URL路径、请求头、请求参数等)决定如何路由请求。

2. Filter的分类

在不同的网关架构中,Filter的分类有所不同。以 Spring Cloud GatewayAPI Gateway 为例,它们通常将 Filter 分为以下几种类型:

1. Pre Filter(前置过滤器)

前置过滤器在请求到达服务之前执行。它们可以用来进行:

  • 身份验证:如检查JWT令牌是否合法。
  • 日志记录:记录请求的信息。
  • 限流:检查请求是否超过某些限制。
2. Post Filter(后置过滤器)

后置过滤器在服务响应后,客户端接收到响应之前执行。它们可以用来:

  • 修改响应:比如修改响应体或响应头。
  • 性能监控:计算请求处理时间,进行性能分析。
  • 缓存处理:根据某些条件返回缓存的响应。
3. Error Filter(错误过滤器)

错误过滤器用于处理请求过程中发生的错误。例如:

  • 统一错误处理:当发生异常时,返回特定的错误响应。
  • 日志记录:记录错误信息以便后续分析。

请求头AddRequestHeader :

        是 Spring Cloud Gateway 中的一个 GatewayFilter 工厂,用于在请求转发之前,向请求中添加自定义的 HTTP 请求头。 

向服务端新增方法:

@GetMapping(value = "/pay/gateway/filter")public ResultData<String> getGatewayFilter(HttpServletRequest request){String result = "";Enumeration<String> headers = request.getHeaderNames();while(headers.hasMoreElements()){String headName = headers.nextElement();String headValue = request.getHeader(headName);System.out.println("请求头名: " + headName +"\t\t\t"+"请求头值: " + headValue);if(headName.equalsIgnoreCase("X-Request-atguigu1")|| headName.equalsIgnoreCase("X-Request-atguigu2")) {result = result+headName + "\t " + headValue +" ";}}return ResultData.success("getGatewayFilter 过滤器 test: "+result+" \t "+ DateUtil.now());}

yml配置:

- id: pay_routh3 #pay_routh3uri: lb://cloud-payment-service                #匹配后提供服务的路由地址predicates:- Path=/pay/gateway/filter/**              # 断言,路径相匹配的进行路由filters:- AddRequestHeader=X-Request-atguigu1,atguiguValue1  # 请求头kv,若一头含有多参则重写一行设置- AddRequestHeader=X-Request-atguigu2,atguiguValue2

 运行结果:

请求参数 RemoveRequestParameter和AddRequestParameter

打印输入的参数 

System.out.println("=============================================");String customerId = request.getParameter("customerId");System.out.println("request Parameter customerId: "+customerId);String customerName = request.getParameter("customerName");System.out.println("request Parameter customerName: "+customerName);System.out.println("=============================================");

yml添加:

- AddRequestParameter=customerId,9527001 # 新增请求参数Parameter:k ,v
- RemoveRequestParameter=customerName   # 删除url请求参数customerName,你传递过来也是null

测试请求的路径;

http://localhost:9527/pay/gateway/filter?customerId=9999&customerName=z3

打印结果:

 可以发现添加到参数会覆盖原有的值,移除的参数就算是传值也会被置为null

 请求回应ResponseHeader:

修改之前的响应头:

 配置yml:

- AddResponseHeader=X-Response-atguigu, BlueResponse # 新增请求参数X-Response-atguigu并设值为BlueResponse
- SetResponseHeader=Date,2099-11-11 # 设置回应头Date值为2099-11-11
- RemoveResponseHeader=Content-Type # 将默认自带Content-Type回应属性删除

修改后响应头: 

前缀和路径相关组: 

The PrefixPath GatewayFilter Factory

The SetPath GatewayFilter Factory

The RedirectTo GatewayFilter Factory 

 

全局过滤器: 

官方文档:点击跳转

新建global类: 

package com.atguigu.cloud.mygateway;import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Map;@Component
@Slf4j
public class MyGlobalFilter implements GlobalFilter, Ordered {public final static String BEGIN_VISIT_TIME = "beginVisitTime";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//记录访问接口开始时间exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis());//返回统计的各个结果给后台return chain.filter(exchange).then(Mono.fromRunnable(()->{Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME);if(beginVisitTime != null){log.info("访问接口主机:"+exchange.getRequest().getURI().getHost());log.info("访问接口端口:"+exchange.getRequest().getURI().getPort());log.info("访问接口URL:"+exchange.getRequest().getURI().getPath());log.info("访问接口URL后面的参数:"+exchange.getRequest().getURI().getRawQuery());log.info("访问接口时长:"+(System.currentTimeMillis()-beginVisitTime)+"毫秒");log.info("=================分割线======================");System.out.println();}}));}@Overridepublic int getOrder() {return 0;}
}

yml:

 测试结果:

自定义条件Filter: 

过滤条件是 必须带有 ’yuanshen‘的请求参数 

package com.atguigu.cloud.mygateway;import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.SetPathGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.Arrays;
import java.util.List;@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config>
{public MyGatewayFilterFactory(){super(MyGatewayFilterFactory.Config.class);}@Overridepublic GatewayFilter apply(MyGatewayFilterFactory.Config config){return new GatewayFilter(){@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain){ServerHttpRequest request = exchange.getRequest();System.out.println("进入了自定义网关过滤器MyGatewayFilterFactory,status:"+config.getStatus());if(request.getQueryParams().containsKey("atguigu")){return chain.filter(exchange);}else{exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);return exchange.getResponse().setComplete();}}};}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("status");}public static class Config{@Getter@Setterprivate String status;//设定一个状态值/标志位,它等于多少,匹配和才可以访问}
}
//单一内置过滤器GatewayFilter

yml:

补充: 

对应关系:

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

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

相关文章

Python世界:函数模块知识点小结

Python世界&#xff1a;函数模块知识点小结 Python函数模块 部分笔记汇总&#xff0c;持续刷新中。区别于其他笔记之处在于&#xff0c;主要记录易错点坑点。 Python函数模块 函数是编码过程中最小的功能模块。 什么是函数式编程&#xff1f; 函数式编程&#xff0c;本质是通…

机器学习随机森林回归时间序列预模型中时间滑动窗口作用以及参数设置

一、时间序列模型中时间滑动窗口作用 在时间序列模型中&#xff0c;时间滑动窗口&#xff08;Sliding Window&#xff09;起到了至关重要的作用。它是一种常见且有效的数据表示技术&#xff0c;通过将时间序列数据分割成多个固定大小的窗口&#xff0c;来捕捉和分析数据中的模式…

idea 的 springboot项目spring-boot-devtools 自动编译 配置热部署

1&#xff0c;设置一 2&#xff0c;设置二 设置二&#xff08;旧版本&#xff09; CtrlShiftAlt/ 点击弹出框中Registry... 引入&#xff08;如果报错&#xff0c;换不同的版本&#xff09; <dependency><groupId>org.springframework.boot</groupId><a…

GitHub CLI 安装指南

GitHub CLI 是 GitHub 官方提供的命令行工具&#xff0c;可以帮助开发者方便地与 GitHub 平台进行交互&#xff0c;例如克隆仓库、提交代码、创建 Pull Request 等。 相比传统的 HTTPS 下载和操作&#xff0c;GitHub CLI 提供了以下显著的优势和特殊功能&#xff1a; GitHub …

建立一个Macos载入image的实例含界面

前言 为了方便ios程序的开发&#xff0c;有时候需要先用的Macos平台进行一些功能性的程序开发。 作为对比和参考。 1、创建一个MacOS的App 2、主界面控件的增加 添加的控件方法与ios相同&#xff0c;也是再用commandshiftL&#xff08;CtrlShiftL&#xff09;,就会弹出控件…

Megatron - LM 怎么进行模型切分的,怎么匹配服务器的

Megatron - LM 怎么进行模型切分的,怎么匹配服务器的? Megatron - LM主要针对Transformer模型进行层内模型并行训练,其模型切分和服务器匹配策略如下: 模型切分 多头注意力模块切分:在Transformer的多头注意力模块中,Megatron - LM利用其内在并行性,将与矩阵乘运算相关…

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示

在CodeBlocks搭建SDL2工程构建TFT彩屏模拟器虚拟TFT彩屏幕显示 参考文章源码下载地址一、SDL2的创建、初始化、退出二、系统基本Tick、彩屏刷新、按键事件三、彩屏获取与设置颜色四、彩屏填充颜色及清屏五、彩屏显示中文和英文字符串六、彩屏显示数字七、彩屏初始化八、主函数测…

基于Springboot + vue实现的校园周边美食探索及分享平台

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

LeetCode - 初级算法 数组(删除排序数组中的重复项)

免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…

MySQL深度解析:优化策略与实战案例

MySQL深度解析:优化策略与实战案例 在当今数据驱动的时代,数据库作为数据存储与管理的核心组件,其性能的优化直接关系到业务系统的响应速度、稳定性和可扩展性。MySQL,作为一款开源的关系型数据库管理系统,凭借其高性能、高可靠性和易用性,在Web应用、数据分析等领域得到…

MVCC实现原理以及解决脏读、不可重复读、幻读问题

MVCC实现原理以及解决脏读、不可重复读、幻读问题 MVCC是什么&#xff1f;有什么作用&#xff1f;MVCC的实现原理行隐藏的字段undo log日志版本链Read View MVCC在RC下避免脏读MVCC在RC造成不可重复读、丢失修改MVCC在RR下解决不可重复读问题RR下仍然存在幻读的问题 MVCC是什么…

【leetcode100】二叉树的中序遍历

1、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 2、初始思路 2.1 思路 中序遍历的顺序是左→根→右&#xff0c;定义一个函数进行遍历 # Definition for …

租用服务器还是服务器托管:哪种方案更适合您?

随着企业对网络服务质量要求的不断提高&#xff0c;租用服务器和服务器托管是两种常见的选择&#xff0c;各自具备独特的优势和适用场景。这篇文章将从多个维度对这两种方案进行详细分析&#xff0c;帮助大家进行对比选择。 租用服务器的优劣势分析 优点 无需大额初始投入 租用…

Quartus In-System Sources and Probes Editor 的使用说明

文章目录 前言使用说明参考资料 前言 Quartus 提供了 In-System Sources and Probes Editor 调试工具&#xff0c;通过 JTAG 接口使用该工具可以驱动和采样内部节点的逻辑值。即通过 Sources 功能来驱动 FPGA 内部信号&#xff0c;通过 Probes 功能来探测内部节点的逻辑值。在…

2. C语言 基础语法

本章目录: 前言1. C 语言的基础结构1.1 C 程序的基本构成1.2 一个简单的 C 程序实例1.3 复杂的 C 程序结构 2. C 语言的基本构成单元2.1 关键字标准关键字C99 新增关键字C11 新增关键字 2.2 标识符2.3 常量2.4 注释 3. 语句与表达式3.1 语句3.2 表达式 4. 分隔符与空格4.1 分隔…

AURIX的TASKING链接文件语法学习

链接文件中的定义&#xff1a; group (ordered, contiguous, align 4, attributesrw, run_addr 0x70005000)//mem:dsram0){select ".data.user_test_data";select "(.data|.data*)";//select "(.bss|.bss*)"; //select ".bss.…

QT----------QT Data Visualzation

实现思路&#xff1a; 配置项目&#xff1a;在 .pro 文件中添加 QT datavisualization 以引入 QT Data Visualization 模块。创建主窗口&#xff1a;使用 QMainWindow 作为主窗口&#xff0c;添加 Q3DScatter、Q3DBars 和 Q3DSurface 等三维视图组件。初始化和创建三维图表&a…

cursor 配置 deepseek 后,无法使用 cursor 的 Composer问题

我在充值完 cursor 后&#xff0c;就能正常使用 cursor 的 Composer 功能了&#xff0c;我使用的是模型 claud-3.5-sonnet&#xff0c;可是我今天在 cursor 中配置完 deepseek 后&#xff0c;发现 cursor 的 composer 功能无法使用了&#xff0c;即使我把 deepseek 的配置删除后…

IT运维的365天--024 闲置路由器关闭了dhcp,如何知道它的IP是啥

有时候各种原因&#xff0c;我们关闭了路由器的Dhcp&#xff0c;比如需要获取的无线IP和有线同一个网段的情况。时间久了&#xff0c;如果没做标记&#xff0c;大部分时候就会忘了路由器原来设置的是什么IP&#xff0c;没有路由器的对应IP&#xff0c;自然也无法进路由器后台去…

C语言中的printf、sprintf、snprintf、vsnprintf 函数

目录 1.1 概述 1.2 函数原型 1.3 返回值 1.4 示例 1.5 输出结果 1.6 常用格式说明符 1.7 注意事项 2. snprintf 函数 2.1 概述 2.2 函数原型 2.3 返回值 2.4 示例 2.5 输出结果 2.6 使用场景 2.7 注意事项 3. vsnprintf 函数 3.1 概述 3.2 函数原型 3.3 返回…