springcloud:4.1 GateWay

概述

Gateway

简介

Spring Cloud Gateway基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发
旨在为微服务架构提供一种简单有效的、统一的API路由管理方式,并为微服务架构提供安全、监控、指标和弹性等功能
其目标是替代Zuul

特点

易于编写谓词和过滤器,其Predicates和Filters可作用于特定路由
支持路径重写
支持动态路由
集成了Spring Cloud DiscoveryClient

底层原理

简介

Spring Cloud Gateway 用"Netty + Webflux"实现,不要加入Web依赖,否则会报错,它需要加入Webflux依赖

Netty

Netty 是一个基于NIO的客户、服务器端的编程框架。
提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序

WebFlux

1.Webflux模式替换了旧的Servlet线程模型。用少量的线程处理request和response io操作,这些线程称为Loop线程,
而业务交给响应式编程框架处理,响应式编程是非常灵活的,用户可以将业务中阻塞的操作提交到响应式框架的work线程中执行,
而不阻塞的操作依然可以在Loop线程中进行处理,大大提高了Loop线程的利用率
2.Webflux虽然可以兼容多个底层的通信框架,但是一般情况下,底层使用的还是Netty,毕竟,Netty是目前业界认可的最高性能的通信框架。
而Webflux的Loop线程,正好就是著名的Reactor模式IO处理模型的Reactor线程,如果使用的是高性能的通信框架Netty

三大核心概念

路由

路由是 Gateway 的⼀个基本单元
这是网关的基本构建块,它由一个ID,一个目标URI,一组断言和一组过滤器定义,如果断言为真,则路由匹配

断言

也称谓词,实际上是路由的判断规则,一个路由中可以添加多个谓词的组合

输入类型是一个ServerWebExchange。我们可以使用它来匹配来自HTTP请求的任何内容,例如headers或参数

过滤

可以在请求被路由前或者之后对请求进行修改

Gateway 组件使用了⼀种 FilterChain的模式对请求进行处理,每⼀个服务请求(Request)在发送到目标标服务之前都要被⼀串FilterChain处理。

同理,在 Gateway接收服务响应的过程中也会被 FilterChain 处理⼀把

搭建【cloud-gateway9527】

依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

application.yml

server:port: 9527
spring:application:name: cloud-gateway9527cloud:gateway:discovery:locator:enabled: false    #不开启服务注册和发现的功能lower-case-service-id: true #请求路径上的服务名称转换为小写#路由配置routes:#cloud-eureka-pro接口路由- id: cloud-eureka-prouri: lb://cloud-eureka-propredicates:- Path=/eureka/pro/**#跨域配置globalcors:# 解决options请求被拦截问题add-to-simple-url-handler-mapping: truecors-configurations:# 拦截的请求'[/**]':# 允许跨域的请求#allowedOrigins: "*" # spring boot2.4以前的配置allowedOriginPatterns: "*" # spring boot2.4以后的配置# 允许请求中携带的头信息allowedHeaders: "*"# 运行跨域的请求方式allowedMethods: "*"# 是否允许携带cookieallowCredentials: true# 跨域检测的有效期,单位smaxAge: 36000
logging:pattern:console: '%d{MM/dd HH:mm:ss.SSS} %clr(%-5level) ---  [%-15thread] %cyan(%-50logger{50}):%msg%n'

启动类

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);log.info("********** Gateway网关 服务启动成功 *********");}
}

相关接口

1.搭建eureka客户端【test-provider8001】

http://t.csdnimg.cn/kIloZ

2.测试网关:http://localhost:9527/payment/index

路由

配置路由

配置文件

spring:cloud:#路由配置routes:#cloud-eureka-pro接口路由- id: cloud-eureka-prouri: lb://cloud-eureka-propredicates:- Path=/eureka/pro/**

配置类

/*** JAVA API构建路由规则*/
@Configuration
public class GatewayConfig {@Bean//http://localhost:9527/guoneipublic RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();//设置路由 路由ID(随意取,不重复即可)|路径匹配规则|跳转的路径routes.route("path_rote",r -> r.path("/guonei").uri("https://www.baidu.com/guonei")).build();return routes.build();}}

uri的写法

直接写法

- id: route_example
uri: http://example.com
predicates:
- Path=/api/example/**

表示将 `/api/example/**` 的请求路由到 `http://example.com`

转发片段写法

- id: route_example
uri: forward:/internal-service
predicates:
- Path=/api/example/**
表示将/api/example/**的请求转发到网关内部的/internal-service服务  

重定向写法

- id: route_example
uri: redirect:http://new-url.com
predicates:
- Path=/old-url/**
表示将/old-url/**的请求重定向到http://new-url.com

使用 lb:// 前缀实现负载均衡

- id: route_example
uri: lb://service-name
predicates:
- Path=/api/example/**
表示将 /api/example/**的请求通过负载均衡策略转发到名为service-name的服务实例  

使用 DiscoveryClient 做动态路由

- id: route_example
uri: lb://service-name
predicates:
- Path=/api/example/**
filters:
- RewritePath=/api/example/(?<path>.*), /$\{path}
表示将 `/api/example/**` 的请求通过DiscoveryClient进行动态路由,并使用RewritePath过滤器进行路径重写  

动态路由

简介

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

添加Eureka依赖并修改配置文件

我们需要把网关注册到eureka上,然后才能找到注册中心的服务列表

实现思路

搭建两个生产者,但是他们的服务名是一致的,正在配置网关的时候uri写服务名,此时会轮询去调用这两个生产者服务

配置文件示例

#cloud-eureka-pro/cloud-eureka-pro81【动态路由-测试负载均衡】
- id: cloud-eureka-pro-dotailuyouuri: lb://cloud-eureka-propredicates:- Path=/eureka/pro/port

断言

时间方面

注意

需要用UTC时间格式的时间参数

UTC时间格式的时间参数时间生成方法

 public static void main(String[] args) {ZonedDateTime now = ZonedDateTime.now();System.out.println(now);}

After

在该日期时间之后发生的请求都将被匹配

predicates:- Path=/payment/**- After=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

Before

在该日期时间之前发生的请求都将被匹配

predicates:- Path=/payment/**- Before=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

Between

在datetime1和datetime2之间的请求将被匹配

predicates:- Path=/payment/**- Between=2030-02-15T14:54:23.317+08:00[Asia/Shanghai],2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

请求方面

域名

根据域名断言,是这个域名则通过,不是则不匹配
Host文件新增配置
127.0.0.1 itbaizhan
predicates:
- Path=/payment/**
- Host=itbaizhan

请求方法

这个断言是专门验证HTTP Method的
predicates:
- Path=/payment/**
- Method=GET

请求参数

会从ServerHttpRequest中的Parameters列表中查询指定的属性
predicates:
- Path=/payment/**
- Query=username,\d+

Cookie

顾名思义,Cookie验证的是Cookie中保存的信息,Cookie断言和上面介绍的两种断言使用方式大同小异,
唯一的不同是它必须连同属性值一同验证,不能单独只验证属性是否存在
predicates:
- Path=/payment/**
- Cookie=username,zzyy   

请求头

这个断言会检查Header中是否包含了响应的属性,通常可以用来验证请求是否携带了访问令牌
predicates:
- Path=/payment/**
#请求头要有X-Request-Id属性并且值为整数的正则表达式
- Header=X-Request-Id, \d+

网关过滤器

网关过滤器【内置】

简介

应用在单个路由或者一个分组的路由上

示例:SetStatus过滤器

filters:- SetStatus=250 # 修改原始响应的状态码            

内置的网关过滤器

AddRequestHeader    为原始请求添加Header  Header的名称及值
AddRequestParameter    为原始请求添加请求参数    参数名称及值
AddResponseHeader  为原始响应添加Header  Header的名称及值
DedupeResponseHeader   剔除响应头中重复的值 需要去重的Header名称及去重策略
Hystrix    为路由引入Hystrix的断路器保护 HystrixCommand的名称
FallbackHeaders    为fallbackUri的请求头中添加具体的异常信息 Header的名称
PrefixPath 为原始请求路径添加前缀    前缀路径
PreserveHostHeader 为请求添加一个preserveHostHeader=true的属性,路由过滤器会检查该属性以决定是否要发送原始的Host   无
RequestRateLimiter 用于对请求限流,限流算法为令牌桶   keyResolver、rateLimiter、statusCode、denyEmptyKey、emptyKeyStatus
RedirectTo 将原始请求重定向到指定的URL    http状态码及重定向的url
RemoveHopByHopHeadersFilter    为原始请求删除IETF组织规定的一系列Header  默认就会启用,可以通过配置指定仅删除哪些Header
RemoveRequestHeader    为原始请求删除某个Header    Header名称
RemoveResponseHeader   为原始响应删除某个Header    Header名称
RewritePath    重写原始的请求路径  原始路径正则表达式以及重写后路径的正则表达式
RewriteResponseHeader  重写原始响应中的某个Header   Header名称,值的正则表达式,重写后的值
SaveSession    在转发请求之前,强制执行WebSession::save操作 无
secureHeaders  为原始响应添加一系列起安全作用的响应头    无,支持修改这些安全响应头的值
SetPath    修改原始的请求路径  修改后的路径
SetResponseHeader  修改原始响应中某个Header的值  Header名称,修改后的值
SetStatus  修改原始响应的状态码 HTTP 状态码,可以是数字,也可以是字符串
StripPrefix    用于截断原始请求的路径    使用数字表示要截断的路径的数量
Retry  针对不同的响应进行重试    retries、statuses、methods、series
RequestSize    设置允许接收最大请求包的大小。如果请求包大小超过设置的值,则返回 413 Payload Too Large 请求包大小,单位为字节,默认值为5M
ModifyRequestBody  在转发请求之前修改原始请求体内容   修改后的请求体内容
ModifyResponseBody 修改原始响应体的内容 修改后的响应体内容
Default    为所有路由添加过滤器 过滤器工厂名称及值

网关过滤器【自定义】

需求

通过过滤器,配置是否在控制台输出日志信息,以及是否记录日

实现步骤

1.类名必须叫做XxxGatewayFilterFactory,注入到Spring容器后使用时的名称就叫做Xxx。
2.创建一个静态内部类Config, 里面的属性为配置文件中配置的参数, - 过滤器名称=参数1,参数2…
3.类必须继承 AbstractGatewayFilterFactory,让父类帮实现配置参数的处理。
4.重写shortcutFieldOrder()方法,返回List参数列表为Config中属性集合
5.无参构造方法中super(Config.class)
6.编写过滤逻辑 public GatewayFilter apply(Config config)

自定义局部过滤器

@Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterFactory.Config> {public LogGatewayFilterFactory(){super(Config.class);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("consoleLog");}@Overridepublic GatewayFilter apply(Config config) {return ((exchange, chain) -> {if (config.consoleLog) {System.out.println("console日志已开启...");}return chain.filter(exchange);});}//过滤器使用的配置内容,如 - Log=true中的true会传到这里@Datapublic static class Config{private boolean consoleLog;}
}

配置使用

filters:# 控制日志是否开启- Log=true

全局过滤器

全局过滤器【内置】

简介

应用在所有的路由上

内置的全局过滤器

路由过滤器(Forward)
路由过滤器(LoadBalancerClient)
Netty路由过滤器
Netty写响应过滤器(Netty Write Response F)
RouteToRequestUrl 过滤器
路由过滤器 (Websocket Routing Filter)
网关指标过滤器(Gateway Metrics Filter)
组合式全局过滤器和网关过滤器排序(Combined Global Filter and GatewayFilter Ordering)
路由(Marking An Exchange As Routed)

全局过滤器【自定义】

需求

对于验证用户是否已经登录及鉴权的过程,可以在网关统一校验
自定义一个GlobalFIlter,去校验所有请求的请求参数中是否包含“token”,如果不包含请求参数“token”则不转发路由,否则执行正常逻辑

自定义全局过滤器

package com.itbaizhan.filter;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** 自定义全局过滤器,需要实现GlobalFilter和Ordered接口*/
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getQueryParams().getFirst("token");if (StringUtils.isEmpty(token)) {System.out.println("鉴权失败。确少token参数。");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}if (!"jack".equals(token)) {System.out.println("token无效...");exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 继续执行filter链return chain.filter(exchange);}/*** 顺序,数值越小,优先级越高* @return*/@Overridepublic int getOrder() {return 0;}
}

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

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

相关文章

解决谷歌浏览器最新chrome94版本CORS跨域问题

项目场景&#xff1a; 谷歌浏览器升级到chrome94版本出现CORS跨域问题 问题描述 解决谷歌浏览器最新chrome94版本CORS跨域问题。 CORS跨域问题&#xff1a; 升级谷歌浏览器最新chrome94版本后&#xff0c;提示Access to XMLHttpRequest at ‘http://localhost:xxxx/api’ fro…

zabbix企业微信接入结合海螺问问编写的shell脚本

前言 博客懒得写详细了&#xff0c;视频剪的累死了&#xff0c;看视频就好了 白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 shell脚本 #!/bin/bash #set -x CorpID"" #我的企业下面的CorpID Secret"" #创建的应用那…

C到C++的敲门砖-1

文章目录 关键字命名空间输入和输出缺省参数函数重载 关键字 相较于C语言32个关键字&#xff1a; autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifwhilesta…

用python写网络爬虫:2.urllib库的基本用法

文章目录 urllib库抓取网页data参数timeout参数更灵活地配置参数登录代理Cookies 参考书籍 建议新入门的小伙伴先看我同一专栏的文章&#xff1a;用python写网络爬虫&#xff1a;1.基础知识 urllib库 urllib是python中一个最基础的HTTP库&#xff0c;一般是内置的&#xff0c;…

2024年 前端JavaScript Web APIs 第三天 笔记

3.1-表单全选反选案例 <!DOCTYPE html><html><head lang"en"><meta charset"UTF-8"><title></title><style>* {margin: 0;padding: 0;}table {border-collapse: collapse;border-spacing: 0;border: 1px solid …

网络安全实训Day5

写在前面 昨天忘更新了......讲的内容不多&#xff0c;就一个NAT。 之前记的NAT的内容&#xff1a;blog.csdn.net/Yisitelz/article/details/131840119 网络安全实训-网络工程 NAT 公网地址与私网地址 公网地址 可以在互联网上被寻址&#xff0c;由运营商统一分配全球唯一的I…

在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

本文首发于公众号&#xff1a;Hunter后端 原文链接&#xff1a;在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手 最近 ChatGPT 式的聊天机器人比较火&#xff0c;可以提供各种问答功能&#xff0c;阿里最近推出了 Qwen1.5 系列的大模型&#xff0c;提供了各个参数…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【C#算法实现】可见的山峰对数量

文章目录 前言一、题目要求二、算法设计及代码实现2.1 算法思想2.2 代码实现 前言 本文是【程序员代码面试指南&#xff08;第二版&#xff09;学习笔记】C#版算法实现系列之一&#xff0c;用C#实现了《程序员代码面试指南》&#xff08;第二版&#xff09;栈和队列中的可见的…

OpenCV-Java 开发简介

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a; 如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇&#xff1a;暂无 ​ 警告&#xff1a; 本教程可能包含过时的信息。 从 OpenCV 2.4.4 开始&…

java集合框架——Map集合概述

前言&#xff1a; 之前接触了单列合集&#xff0c;现在又接触了双列合集。整理下心得&#xff0c;打好基础&#xff0c;daydayup&#xff01;&#xff01; Map集合 Map集合称为双列集合&#xff0c;也被称为“键值对集合”。格式&#xff1a;{key1value1,key2value2...}&#…

【GPT-SOVITS-01】源码梳理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

jwt以及加密完善博客系统

目录 一、背景 二、传统登陆功能&强制登陆功能 1、传统的实现方式 2、session存在的问题 三、jwt--令牌技术 1、实现过程 2、令牌内容 3、生成令牌 4、检验令牌 四、JWT登陆功能&强制登陆功能 1、JWT实现登陆功能 2、强制登陆功能 3、运行效果 五、加密/加…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型&#xff0c;该模型专门用于使用新型3D生成预训练Transformer&#xff08;GPT&#xff09;处理光谱RS图像。 重建损失由两个部分组成&#xff1a;令牌到令牌和频谱到频谱 下游任务&#xff1a;

[数据集][目标检测]铝片表面工业缺陷检测数据集VOC+YOLO格式400张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;400 标注数量(xml文件个数)&#xff1a;400 标注数量(txt文件个数)&#xff1a;400 标注类别…

Coursera上Golang专项课程2:Functions, Methods, and Interfaces in Go 学习笔记

Functions, Methods, and Interfaces in Go Course Certificate 本文是学习 Functions, Methods, and Interfaces in Go 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Functions, Methods, and Interfaces in GoMODULE 1: FUNCTIONS AND ORGANIZ…

Epuck2机器人固件更新及IP查询

文章目录 前言一、下载固件更新软件包&#xff1a;二、查询机器人在局域网下的IP 前言 前面进行了多机器人编队仿真包括集中式和分布式&#xff0c;最近打算在实物机器人上跑一跑之前的编队算法。但由于Epuck2机器人长时间没使用&#xff0c;故对其进行固件的更新&#xff0c;…

【Godot4.0】几何图形、网格、刻度线顶点求取函数库ShapePoints

概述 用于生成常见二维几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。 生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。 枚举 enum{AXIS_X 1,AXIS_Y 2, }enum{SIDE_UP 1,SIDE_RIGHT 2,SIDE_BOTTOM 3,SIDE_LEFT 4 }测试场景 …

从JVM的退出机制分析Java程序的优雅关闭退出

前言 Java程序启动从main函数开始启动&#xff0c;是程序入口和主线程&#xff0c;但程序会在什么时候结束&#xff1f;为什么有的Java程序在启动后很快就结束了&#xff0c;比如HelloWorld程序&#xff0c;有的程序却能一直在运行&#xff0c;比如Tomcat启动后就一直保持进程…

odoo17开发教程(8):设置界面UI的字段属性

目录 添加字段 给字段设置只读和不可拷贝 给字段添加默认值 保留字段 本节目标&#xff1a;在本文末尾&#xff0c;售价(selling price)应为只读值&#xff0c;卧室数量(bedrooms)和可用日期(availability date)应为默认值。此外&#xff0c;在复制记录时&#xff0c;售价和…