文章目录

  • 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路由规则和过滤器相关推荐

  1. Spring Cloud GateWay系列(三):路由规则动态刷新

    Spring Cloud Gateway旨在提供一种简单而有效的方式来路由API,并为它们提供横切关注点,例如:安全性.监控/指标和弹性.Route(路由)是网关的基本单元,由唯一标识符ID.目标地址 ...

  2. Spring Cloud Gateway内置的断言和过滤器作用

    文章目录 前言 一.内置断言 二.内置过滤器 1.GlobalFilter 2.GatewayFilter 三.配置参数解析模式 1.DEFAULT 2.GATHER_LIST 3.GATHER_LI ...

  3. Spring Cloud【Finchley】-15 查看Zuul的路由端点和过滤器

    文章目录 概述 确认spring-boot-starter-actuator依赖 application.yml配置启用所有的监控端点 启动服务 查看 Routes Endpoint 查看 Filte ...

  4. 【gateway系列】一步步带你学习gateway路由规则实践

    目录 1.准备 微服务项目 gateway网关服务 2.Path 3.Query 4.Method 5.DateTime 6.RemoteAddr 7.Header 1.准备 微服务项目 新创建一个s ...

  5. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...

    一.说明 网关的核心概念就是路由配置和路由规则,而作为所有请求流量的入口,在实际生产环境中为了保证高可靠和高可用,是尽量要避免重启的,所以实现动态路由是非常有必要的:本文主要介绍 Spring Clo ...

  6. Spring Cloud Gateway –配置简单路由

    可以将Spring Cloud Gateway视为Spring Cloud Netflix Zuul项目的后续产品,并有助于在微服务环境中实现Gateway模式 . 它建立在 Spring Boot ...

  7. 基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理

    前面我们了解过了Sentinel 网关流量控制之Spring Cloud Gateway实战,今天带给大家是基于Nacos配置中心实现Spring Cloud Gateway的动态路由管理. 1.为什 ...

  8. Nacos整合Gateway实现动态路由

    往期回顾 Nacos的安装与配置 Spring Cloud集成Nacos作为注册中心 LoadBalacer集成Nacos实现负载均衡 常见的负载均衡策略分析 Spring Cloud集成Dubbo实 ...

  9. Spring Gateway静态文件路由

    Spring Gateway静态文件路由 Spring gateway路由简介 路由到其他微服务的API路由 Spring zuul Spring Gateway 静态文件服务 Spring zuul ...

最新文章

  1. pl/sql块的基本语法
  2. 深入浅出换肤相关技术以及如何实现
  3. vue编写messageBox,使用函数调用
  4. protobuf入门教程(一):简介和安装
  5. 我对于全栈工程师的理解
  6. 第16课 开灯关灯 《小学生C++趣味编程》
  7. AOSP6.0.1 launcher3入门篇—解析launcher.java文件
  8. Ajax/JavaScript脚本大全,JS脚本大全
  9. 1005打印任务取消不了 hp_惠普HP M1136 MFP多功能打印机 一年半使用感受(学生打印机)...
  10. asp系统转换php系统时间函数,window_Asp常用通用函数之生成时间的整数,'函数名:GetMyTimeNumber()' - phpStudy...
  11. Tomcat服务器搭建及测试教程(1),腾讯技术官发布的“神仙文档”火爆网络
  12. XidianOJ 1175: count
  13. 以前计算机弹玻璃的游戏叫什么,小时候做过的游戏 你还记得多少 是否还有所保留呢...
  14. 使用Nero6刻录软件刻录光盘镜像
  15. 2.74-写出具有如下原型的函数的代码:
  16. 基于51单片机及MAX6675的8通道测温系统 protues仿真
  17. 抑郁量表c语言程序,抑郁自评量表(SDS)
  18. MAC 下 解决ZOC 自动断开
  19. AWS云、阿里云、腾讯云、华为云--云服务器全球区域对比图
  20. 漫画:什么是 “智能供应链” ?

热门文章

  1. python代码下载视频_小白也能学会用一行Python代码下载任意网站视频
  2. python3.9不支持pyhanlp
  3. phpcms 会员头像h5上传_使用elementui的头像上传组件报错
  4. Cadence Allergro提取PCB正反面坐标并生成Excel的方法总结
  5. Android非常规BUG之createView AndroidRuntime(29797)
  6. 苹果ios模拟器,电脑运行苹果ios应用
  7. oracle 创建视图用 with check option 子句详解
  8. 自动拼写检查---jazzy简介
  9. docker 添加挂载目录 mount /mnt /Volume
  10. Apache POI 密码保护只读word文档在WPS中无效