Gateway学习笔记

news/2024/12/21 22:10:17/

目录

介绍:

核心概念

依赖

路由

断言    

基本的断言工厂

自定义断言

过滤器

路由过滤器

过滤器工厂

自定义路由过滤器

全局过滤器

其他

过滤器执行顺序

前置后置(?)

跨域问题

yaml 解决

配置类解决 


介绍:

Gateway网络为微服务架构提供简单且统一的API路由管理,作为系统的统一入口。

核心概念


路由(route):路由是网关中最基础的部分,路由信息包括一个ID、一个URI、一组断言工厂、一组Filter组成。
断言(predicates):断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。如果断言为真,则说明请求的URL和配置的路由匹配。
过滤器(Filter):Spring Cloud Gateway中的filter分为Gateway Filter和Global Filter。Filter可以对请求和响应进行处理。Filter只有pre和post两种。

依赖


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

路由

spring:application:name: gatewaycloud:nacos:discovery:server-addr: 192.168.178.129:8848gateway:routes:- id: shop-useruri: lb://shop-user    # nacos 中注册的服务名predicates:- Path=/config/test- id: shop-user2uri: 192.168.178.128:111   #ippredicates:- Path=/config/test2

断言    

基本的断言工厂

Path    请求路径必须符合指定规则- Path=/red/{segment},/blue/**
After 是某个时间点后的请求- After=2012-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求- Before=2012-01-20T17:42:47.789+07:00[Asia/Shanghai
Between是某两个时间点之前的请求- Between=2012-01-20T17:42:47.789-07:00[America/Denver] ,2012-01-20T17:42:47.789+07:00[Asia/Shanghai
Cookie    请求必须包含某些cookie - Cookie=chocolate,ch.p
Header 请求必须包含某些header- Header=X-Request-ld, \d+
Host 请求必须是访问某个host(域名)- Host=.something.org,.anotherhost.org
Method    请求凡是必须是指定方式- Method=GEt,POST
Query请求参数必须包含指定参数 - Query=name,kack或者- Query=name
RemoteAddr    请求者的ip必须是指定范围 - RemoteAddr=192.168.1.1/24

官网:路由谓词工厂

自定义断言

步骤:

  1. 开头任意取名,但是必须以RoutePredicateFactory后缀结尾
  2. 继承AbstractRoutePredicateFactory抽象类仿照这个源码写,这个源码的路由规则是根据时间来定义的
public class AfterRoutePredicateFactory extends AbstractRoutePredicateFactory<Config> {public static final String DATETIME_KEY = "datetime";public AfterRoutePredicateFactory() {super(Config.class);}//支持shortcut 如果不重写 用简便形式写就会报错public List<String> shortcutFieldOrder() {return Collections.singletonList("datetime");}//ServerWebExchange这个类似与request,这个是判断是否让请求通过的规则public Predicate<ServerWebExchange> apply(final Config config) {return new GatewayPredicate() {public boolean test(ServerWebExchange serverWebExchange) {ZonedDateTime now = ZonedDateTime.now();return now.isAfter(config.getDatetime());}public Object getConfig() {return config;}public String toString() {return String.format("After: %s", config.getDatetime());}};}//路由规则public static class Config {private @NotNull ZonedDateTime datetime;public Config() {}public ZonedDateTime getDatetime() {return this.datetime;}public void setDatetime(ZonedDateTime datetime) {this.datetime = datetime;}}
}

过滤器

路由过滤器

路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。路由过滤器仅适用于特定的路由。

过滤器工厂

AddRequestHeader给当前请求添加一个请求头- AddRequestHeader=X-Request-red, blue
RemoveRequestHeader移除请求头- RemoveRequestHeader=X-Request-Foo
SetRequestHeader标记请求头- SetRequestHeader=X-Request-Red, Blue
AddRequestParameter添加请求参数- AddRequestParameter=red, blue
RemoveRequestParameter删除请求参数- RemoveRequestParameter=red
RemoveResponseHeader从响应结果中移除一个响应头- RemoveResponseHeader=X-Response-Foo
SetResponseHeader编辑响应中的响应头- SetResponseHeader=X-Response-Red, Blue
RemoveResponseHeader删除响应中的响应头- RemoveResponseHeader=X-Response-Foo
PrefixPath这将作为所有匹配请求的路径的前缀- PrefixPath=/mypath
SetPath修改访问地址- SetPath=/segment
RedirectTo重定向- RedirectTo=302, https://acme.org

全部:GatewayFilter 工厂

默认过滤器

server:port: 10010 # 网关端口
spring:application: name: gateway # 服务名称cloud:nacos:server-addr: localhost:8848 # nacos地址gateway:routes: - id: user-service # url: http://127.0.0.1:8081 url: lb//userservice predicates: # 路由断言,也就是判断请求是否符合路由规则的条件- Path=/usr/** # 这个是按照路径匹配,只要以/user/开头就符合要求- id: order-service url: lb//orderservicepredicates:- Path=/order/** default-filters: # 默认过滤器,会对所有的路由请求都生效- AddRequestHeader=Truth,luxifa is  following her dream # 添加请求头

自定义路由过滤器

1、新建过滤器名称要以GatewayFilterFactory结尾

2、继承AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config>重写其中的方法

@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;//设定一个状态值/标志位,它等于多少,匹配和才可以访问}
}

全局过滤器

创建全局过滤器实现GlobalFilter, Ordered 接口,重写其中的方法

public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在此处编写全局过滤器的逻辑return chain.filter(exchange);}/*** 数字越小优先级越高* @return*/@Overridepublic int getOrder(){return 1;}
}

其他

过滤器执行顺序

默认路由过滤器 --》路由过滤器 ---》 全局过滤器

前置后置(?)

前置过滤直接在return chain.filter(exchange);  前写入前置逻辑

后置过滤器

 @Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain, String name, String args) {Mono<Void> result = chain.filter(exchange);return result.then(Mono.fromRunnable(() -> {// 编写后置逻辑}));}

跨域问题

yaml 解决

spring:cloud:gateway:globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]': # 拦截所有请求allowedOrgins:  # 允许哪些网站的跨域请求- "http://localhost:8090"- "http://www.leyou.com"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求头携带的信息 * 代表允许所有请求头allowCredentials: true #是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期

配置类解决 

@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}


http://www.ppmy.cn/news/1527386.html

相关文章

运行npm install 时,卡在sill idealTree buildDeps没有反应

一直停留在sill idealTree buildDeps 解决方法 npm config set registry https://registry.npm.taobao.org 配置后用下面命令看是否配置成功 npm config get registry 如果配置还不好使 就执行下行的ssl npm set strict-ssl false 然后执行 npm install 成功执行

SprinBoot+Vue宠物寄养系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

pdf文件怎么转换成ppt?介绍几种pdf转ppt的方法

pdf文件怎么转换成ppt&#xff1f;将pdf文件转换成ppt格式是一种常见且实用的需求&#xff0c;特别是在制作演示文稿和准备报告时。pdf格式因其文件内容的固定排版和高兼容性而广泛应用于文档的保存和分享。然而&#xff0c;在某些情况下&#xff0c;将pdf文件转换为ppt格式可以…

游戏工作室搬砖多开怎么做

在游戏行业中&#xff0c;“搬砖”一词特指通过多账号操作&#xff0c;在游戏中赚取虚拟货币或物品&#xff0c;再将其转换为现实收益的行为。游戏工作室通过多开账号进行搬砖&#xff0c;以实现规模化的收益。然而&#xff0c;随着游戏平台和运营商对多账号操作的监管日益严格…

机器学习 第12章 计算学习理论

目录 基础知识PAC学习有限假设空间可分情形不可分情形 VC维稳定性 基础知识 计算学习理论研究的是关于通过"计算"来进行"学习"的理论&#xff0c;即关于机器学习的理论基础&#xff0c;其目的是分析学习任务的困难本质&#xff0c;为学习算法提供理论保证…

GeoTools解析GeoJson为要素集(FeatureCollection)含嵌套数组属性

Repository - Sonatype Nexus Repository <?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…

windows远程桌面连接ubuntu

通过 Windows 远程连接到 Ubuntu 的桌面环境&#xff0c;可以使用 远程桌面协议&#xff08;RDP&#xff09; 来实现远程登录。 准备工作 一台安装了 Ubuntu 的服务器或计算机。一台 Windows 电脑&#xff08;安装远程桌面客户端&#xff09;。两台机器必须在同一网络中&…

ESP8266_MicroPython——定时器_I2C 总线

MicroPython 文章目录 MicroPython前言一、定时器二、I2C 总线总结 前言 我们继续学习定时器和IIC 一、定时器 定时器&#xff0c;顾名思义就是用来计时的&#xff0c;我们常常会设定计时或闹钟&#xff0c;然后时间到了就告诉我们要做什么了。单片机也是这样&#xff0c;通…