Gateway-02-gateway路由规则和过滤器
文章目录
- 1:gateway的Helloworld程序
- 1:设置order服务(普通服务)
- 2:设置user服务(普通服务)
- 3:设置gateway-server服务
- 1:导包
- 2:配置application.yml
- 4:测试
- 2:Gateway路由规则
- 1:路由断言工厂
- 2:日期时间路由匹配规则
- 3:Cookie路由匹配规则
- 4:Header路由匹配规则
- 5:Host路由匹配规则
- 6: Method路由匹配规则
- 7:Path路由匹配规则
- 8:Query路由匹配规则
- 9:RemoteAddr路由匹配规则-远端ip地址匹配
- 10:Weight路由匹配规
- 3:Gateway过滤器
- 1:Gateway过滤器工厂介绍
- 2:自定义过滤器
- 1:自定义Gateway Filter-实现GatewayFilter、Ordered两个接口
- 2:自定义Gateway Filter Factory-继承AbstractGatewayFilterFactory
- 3:自定义全局过滤器
- 4:gateway和nacos整合
- 1:导包
- 2:各项服务注册进nacos
- 3:gateway路由规则按照注册服务名称调用
1:gateway的Helloworld程序
1:设置order服务(普通服务)
application.yml
server:port: 19092spring:application:name: gateway-order
2:设置user服务(普通服务)
application.yml
server:port: 19091spring:application:name: gateway-user
3:设置gateway-server服务
1:导包
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
2:配置application.yml
server:port: 19090spring:application:name: gateway-servercloud:gateway:routes: #路由规则定义- id: gataway-user #路由ID,必须唯一uri: http://localhost:19091/ #路由地址,后续也可更改成其他的类型,诸如指向微服务predicates: # 断言规则,既满足此断言既按照此路由规则跳转- Path=/user/**- id: gateway-orderuri: http://localhost:19092/predicates:- Path=/order/**
4:测试
2:Gateway路由规则
1:路由断言工厂
Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping 基础架构的一部分进行匹
配。Spring Cloud Gateway包括许多内置的路由断言工厂。所有这些断言都与HTTP请求的不同属性匹
配。您可以将多个路由断言工厂与逻辑 and 语句结合使用。
路由断言工厂RoutePredicateFactory包含的主要实现类如图所示,包含Datetime、Cookie、
Header、Host、Method、Path、Query、RemoteAddr、Weight等类型的路由断言。
2:日期时间路由匹配规则
1:匹配指定日期之前后的请求After
spring:
application:name: gateway-server
cloud:gateway:routes:- id: after_routeuri: http://localhost:8080/predicates:- After=2021-04-20T06:06:06+08:00[Asia/Shanghai]
2:匹配指定日期时间之前的请求 Before
spring:
application:name: gateway-server
cloud:gateway:routes:- id: before_routeuri: http://localhost:8080/predicates:- Before=2021-04-20T06:06:06+08:00[Asia/Shanghai]
3:匹配指定日期时间之间的请求 Between
spring:
application:name: gateway-server
cloud:gateway:routes:- id: betwwen_routeuri: http://localhost:8080/predicates:- Between=2021-01-20T06:06:06+08:00[Asia/Shanghai],2021-04-
20T06:06:06+08:00[Asia/Shanghai]
3:Cookie路由匹配规则
所述Cookie路由断言工厂采用两个参数,该cookiename和regexp(其是Java正则表达式)。该断言匹
配具有给定名称且其值与正则表达式匹配的cookie。以下示例配置cookie路由断言工厂:
spring:
application:name: gateway-server
cloud:gateway:routes:- id: cookie_routeuri: http://localhost:8080/predicates:- Cookie=token, \d+
4:Header路由匹配规则
所述 Header ;路由断言工厂采用两个参数,报头 name 和一个 regexp (其是Java正则表达式)。该断
言与具有给定名称的头信息匹配,该标头的值与正则表达式匹配。以下示例配置Header路由断言:
spring:
application:name: gateway-server
cloud:gateway:routes:- id: header_routeuri: http://localhost:8080/predicates:- Header=X-Request-Id, \d+
5:Host路由匹配规则
该 Host 路由断言工厂需要一个参数:主机名的列表 patterns 。该模式是带有.分隔符的Ant样式的模
式。断言与 Host 匹配模式的标头匹配。以下示例配置主机路由断言:
spring:
application:name: gateway-server
cloud:gateway:routes:- id: host_routeuri: http://localhost:8080/predicates:- Host=**.somehost.org,**.anotherhost.org
6: Method路由匹配规则
所述 Method 路由断言厂需要 methods 的参数,它是一个或多个参数:HTTP方法来匹配。以下示例配置方法路由断言:
spring:
application:name: gateway-server
cloud:gateway:routes:- id: method_routeuri: http://localhost:8080/predicates:- Method=GET,POST
7:Path路由匹配规则
spring:
application:name: gateway-server
cloud:gateway:routes:- id: path_routeuri: http://localhost:8080/predicates:- Path=/product/{segment}
8:Query路由匹配规则
所述 Query 路由断言工厂采用两个参数:所要求的 param 和可选的 regexp (其是Java正则表达式)。
以下示例配置查询路由断言:
spring:
application:name: gateway-server
cloud:gateway:routes:- id: query_routeuri: http://localhost:8080/predicates:- Query=green
如果请求包含 green 查询参数,则前面的路由匹配。
9:RemoteAddr路由匹配规则-远端ip地址匹配
所述 RemoteAddr 路由断言工厂需要的列表(分钟尺寸1) sources ,其是CIDR的表示法(IPv4或
IPv6)的字符串,如 192.168.0.1/16 (其中 192.168.0.1 是一个IP地址和 16 一个子网掩码)。下面
的示例配置RemoteAddr路由断言:
spring:
cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24
10:Weight路由匹配规
该 Weight 路由断言工厂有两个参数: group 和 weight (一个int)。权重是按组计算的。以下示例配
置权重路由断言:
spring:
cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2
这条路线会将大约80%的流量转发到weighthigh.org,将大约20%的流量转发到weightlow.org。
这个方案可以用来做灰度发布
3:Gateway过滤器
Gateway分为Pre类型的过滤器和Post类型的过滤器。
- Pre类型的过滤器在请求转发到后端微服务之前执行,在Pre类型过滤器链中可以做鉴权、限流等操
作。 - Post类型的过滤器在请求执行完成之后、将结果返回给客户端之前执行。
在Spring Cloud Gateway中内置了很多Filter,Filter有两种实现,分别是GatewayFilter和
GlobalFilter。GlobalFilter全局过滤器会应用到所有的路由上,而GatewayFilter只会应用到单个路由或
者一个分组的路由上。
1:Gateway过滤器工厂介绍
过滤器 有 20 多个 实现 类, 包括 头部 过滤器、 路径 类 过滤器、 Hystrix 过滤器 和 变更 请求 URL 的
过滤器, 还有 参数 和 状态 码 等 其他 类型 的 过滤器。
内置的过滤器工厂有22个实现类,包括 头部过滤器、路径过滤器、Hystrix 过滤器 、请求URL 变更过滤
器,还有参数和状态码等其他类型的过滤器。根据过滤器工厂的用途来划分,可以分为以下几种:
Header、Parameter、Path、Body、Status、Session、Redirect、Retry、RateLimiter和Hystrix
2:自定义过滤器
Spring Cloud Gateway提供了过滤器的扩展功能,开发者可以根据实际业务需求来自定义GatewayFilter网关过滤器或者GlobalFilter全局过滤器。
GatewayFilter可以制定在某些路由上
1:自定义Gateway Filter-实现GatewayFilter、Ordered两个接口
编写过滤器
package com.example.gatewayserver.filter;import org.springframework.boot.web.servlet.filter.OrderedFilter;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @author wangkanglu* @version 1.0* @description* @date 2022-08-26 17:42*/public class MyFirstFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("自定义过滤器启动");return chain.filter(exchange);}//过滤器存在优先级,order越大,优先级越低@Overridepublic int getOrder() {return -1;}
}
定义好MyFirstFilter 以后,其需要跟Route绑定使用,不能在application.yml文件中配置使用
package com.example.gatewayserver.config;import com.example.gatewayserver.filter.MyFirstFilter;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author wangkanglu* @version 1.0* @description* @date 2022-08-26 19:30*/
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {return builder.routes().route(r ->r.path("/user/**")//转发路由.uri("http://localhost:19091/")//注册自定义过滤器.filters(new MyFirstFilter())//给定id.id("gataway-user")).build();}}
2:自定义Gateway Filter Factory-继承AbstractGatewayFilterFactory
很多时候更希望在配置文件中配置Gateway Filter,所以可以自定义过滤器工厂实现。
自定义过滤器工厂需要继承AbstractGatewayFilterFactory,该类必须以GatewayFilterFactory结尾
package com.example.gatewayserver.filter;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;/*** @author wangkanglu* @version 1.0* @description* @date 2022-08-26 19:44*/
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<MyGatewayFilterFactory.Config> {public MyGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {System.out.println("自定义过滤器工厂:"+config.isEnabled());return chain.filter(exchange);};}// @Data
// @AllArgsConstructor
// @NoArgsConstructor//必须是静态内部类,必须优于Factory提前加载public static class Config {// 控制是否开启认证private boolean enabled;public Config() { }public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}}
}
在配置文件中新增如下配置生效自定义的过滤器,这边的名称就是自定义过滤器的前缀:
server:port: 19090spring:application:name: gateway-servercloud:gateway:routes: #路由规则定义- id: gataway-user #路由ID,必须唯一uri: http://localhost:19091/ #路由地址,后续也可更改成其他的类型,诸如指向微服务predicates: # 断言规则,既满足此断言既按照此路由规则跳转- Path=/user/** #请注意这个Path的P是大写的!- id: gateway-orderuri: http://localhost:19092/predicates:- Path=/order/**filters:- name: My #名称就是自定义过滤器的前缀args:enabled: true
3:自定义全局过滤器
全局过滤器,顾名思义,应用于全局,对于每一个经过网关的请求都会走到全局过滤器。全局过滤器可以做日志的监控以及鉴权等等功能。
全局过滤器需要实现GlobalFilter, Ordered接口,并且加上加上@Component注解即可;
package com.example.gatewayserver.filter;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;/*** @author wangkanglu* @version 1.0* @description 全局过滤器* @date 2022-08-26 20:09*/
@Component
public class MyCustomerGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("此时全局过滤器前置加载-----");
// return chain.filter(exchange);return chain.filter(exchange).then(Mono.fromRunnable(()-> System.out.println("此时后置过滤器加载------------")));}//数字越小,优先级越高@Overridepublic int getOrder() {return -2;}
}
4:gateway和nacos整合
1:导包
<!-- 服务注册/发现--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
2:各项服务注册进nacos
所有服务都要注册金nacos
spring:application:name: gateway-usercloud:nacos:discovery:#注册中心地址server-addr: ip:8848#注册中心命名空间namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
3:gateway路由规则按照注册服务名称调用
server:port: 19090spring:application:name: gateway-servercloud:nacos:discovery:#注册中心地址server-addr: ip:8848#注册中心命名空间namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9gateway:routes: #路由规则定义- id: gataway-user #路由ID,必须唯一uri: lb://gataway-user #路由地址,后续也可更改成其他的类型,诸如指向微服务predicates: # 断言规则,既满足此断言既按照此路由规则跳转- Path=/user/** #请注意这个Path的P是大写的!- id: gateway-orderuri: lb://gateway-orderpredicates:- Path=/order/**filters:- name: My #名称就是自定义过滤器的前缀args:enabled: true
Gateway-02-gateway路由规则和过滤器相关推荐
- Spring Cloud GateWay系列(三):路由规则动态刷新
Spring Cloud Gateway旨在提供一种简单而有效的方式来路由API,并为它们提供横切关注点,例如:安全性.监控/指标和弹性.Route(路由)是网关的基本单元,由唯一标识符ID.目标地址 ...
- Spring Cloud Gateway内置的断言和过滤器作用
文章目录 前言 一.内置断言 二.内置过滤器 1.GlobalFilter 2.GatewayFilter 三.配置参数解析模式 1.DEFAULT 2.GATHER_LIST 3.GATHER_LI ...
- Spring Cloud【Finchley】-15 查看Zuul的路由端点和过滤器
文章目录 概述 确认spring-boot-starter-actuator依赖 application.yml配置启用所有的监控端点 启动服务 查看 Routes Endpoint 查看 Filte ...
- 【gateway系列】一步步带你学习gateway路由规则实践
目录 1.准备 微服务项目 gateway网关服务 2.Path 3.Query 4.Method 5.DateTime 6.RemoteAddr 7.Header 1.准备 微服务项目 新创建一个s ...
- angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...
一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...
- Spring Cloud Gateway –配置简单路由
可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品,并有助于在微服务环境中实现Gateway模式 . 它建立在 Spring Boot ...
- 基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理
前面我们了解过了Sentinel 网关流量控制之Spring Cloud Gateway实战,今天带给大家是基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理. 1.为什 ...
- Nacos整合Gateway实现动态路由
往期回顾 Nacos的安装与配置 Spring Cloud集成Nacos作为注册中心 LoadBalacer集成Nacos实现负载均衡 常见的负载均衡策略分析 Spring Cloud集成Dubbo实 ...
- Spring Gateway静态文件路由
Spring Gateway静态文件路由 Spring gateway路由简介 路由到其他微服务的API路由 Spring zuul Spring Gateway 静态文件服务 Spring zuul ...
最新文章
- pl/sql块的基本语法
- 深入浅出换肤相关技术以及如何实现
- vue编写messageBox,使用函数调用
- protobuf入门教程(一):简介和安装
- 我对于全栈工程师的理解
- 第16课 开灯关灯 《小学生C++趣味编程》
- AOSP6.0.1 launcher3入门篇—解析launcher.java文件
- Ajax/JavaScript脚本大全,JS脚本大全
- 1005打印任务取消不了 hp_惠普HP M1136 MFP多功能打印机 一年半使用感受(学生打印机)...
- asp系统转换php系统时间函数,window_Asp常用通用函数之生成时间的整数,'函数名:GetMyTimeNumber()' - phpStudy...
- Tomcat服务器搭建及测试教程(1),腾讯技术官发布的“神仙文档”火爆网络
- XidianOJ 1175: count
- 以前计算机弹玻璃的游戏叫什么,小时候做过的游戏 你还记得多少 是否还有所保留呢...
- 使用Nero6刻录软件刻录光盘镜像
- 2.74-写出具有如下原型的函数的代码:
- 基于51单片机及MAX6675的8通道测温系统 protues仿真
- 抑郁量表c语言程序,抑郁自评量表(SDS)
- MAC 下 解决ZOC 自动断开
- AWS云、阿里云、腾讯云、华为云--云服务器全球区域对比图
- 漫画:什么是 “智能供应链” ?
热门文章
- python代码下载视频_小白也能学会用一行Python代码下载任意网站视频
- python3.9不支持pyhanlp
- phpcms 会员头像h5上传_使用elementui的头像上传组件报错
- Cadence Allergro提取PCB正反面坐标并生成Excel的方法总结
- Android非常规BUG之createView AndroidRuntime(29797)
- 苹果ios模拟器,电脑运行苹果ios应用
- oracle 创建视图用 with check option 子句详解
- 自动拼写检查---jazzy简介
- docker 添加挂载目录 mount /mnt /Volume
- Apache POI 密码保护只读word文档在WPS中无效