Spring Cloud_Gateway新一代网关

news2024/11/17 13:23:01

目录

  • 一、概述简介
    • 1.官网
    • 2.是什么
    • 3.能干嘛
    • 4.微服务架构中网关在哪里
  • 二、三大核心概念
    • 1.Route(路由)
    • 2.Predicate(断言)
    • 3.Filter(过滤)
    • 4.总体
  • 三、Gateway工作流程
    • 1.官网总结
    • 2.核心逻辑:路由转发+执行过滤器链
  • 四、入门配置
    • 1.新建Module
    • 2.POM
    • 3.YML
    • 4.业务类
    • 5.主启动类
    • 6.9527网关如何做路由映射呢???
    • 7.YML新增网关配置
    • 8.测试
    • 5.通过微服务名实现动态路由
      • 5.1.启动
      • 5.2.POM
      • 5.3.YML
      • 5.4.测试
    • 6.Predicate的使用
      • 6.1.是什么
      • 6.2.Route Predicate Factories这个是什么东东?
      • 6.3.常用的Route Predicate
    • 7.Filter的使用
      • 7.1.是什么
      • 7.2.Spring Cloud Gateway的Filter
      • 7.3.常用的GatewayFilter
      • 7.4.自定义过滤器

代码链接
https://github.com/lidonglin-bit/cloud

一、概述简介

1.官网

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
在这里插入图片描述

2.是什么

Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关

https://github.com/Netflix/zuul/wiki
但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关代替Zull,那就是SpringCloud Geteway;
Geteway是原Zuul1.x版的替代
在这里插入图片描述
概述
Gateway是在spring生态系统之上构建的API网关服务,基于Spring5,SpringBoot2和Project Reactor等技术。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等
在这里插入图片描述
SpringCloud Gateway是SpringCloud的一个全新项目,基于Spring5.0+SpringBoot2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。
为了提升网关的性能,SpringCloud Gatway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通讯框架Netty。
SpringCloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关基本的功能,例如:安全、监控/指标、和限流。
一句话
Spring Cloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架
在这里插入图片描述

3.能干嘛

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

4.微服务架构中网关在哪里

在这里插入图片描述

二、三大核心概念

1.Route(路由)

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由

2.Predicate(断言)

参考的是java8的java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

3.Filter(过滤)

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

4.总体

在这里插入图片描述
Web请求,通过一些匹配条件,定位到真正的服务节点。并在这个转发过程的前后,进行一些精细化控制。
Predicate就是我们的匹配条件: 而Filter,就是可以理解为一个无所不能的拦截器。有了这两个元素,再加上目标uri,就可以实现一个具体的路由了。

三、Gateway工作流程

1.官网总结

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-how-it-works
在这里插入图片描述
在这里插入图片描述
客户端向Spring Cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求匹配的路由,将其发送到Gateway Web Handler.
Handler再通过指定的过滤器链来将请求发送给我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

Filter在"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,在"post"类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量控制等有着非常重要的作用

2.核心逻辑:路由转发+执行过滤器链

四、入门配置

1.新建Module

cloud-gateway-gateway9527

2.POM

<?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://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.donglin.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-gateway-gateway9527</artifactId>

    <dependencies>
        <!--新增gateway,不需要引入web和actuator模块-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.donglin.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

3.YML

server:
  port: 9527
spring:
  application:
    name: cloud-gateway

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
      register-with-eureka: true
      fetch-registry: true
      service-url:
          defaultZone: http://localhost:7001/eureka

4.业务类

5.主启动类

package com.donglin.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
    public static void main(String[] args) {
            SpringApplication.run( GateWayMain9527.class,args);
        }
}

6.9527网关如何做路由映射呢???

我们目前不想暴露8001端口,希望在8001外面套一层9527

7.YML新增网关配置

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
       - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
         uri: http://localhost:8001   #匹配后提供服务的路由地址
         predicates:
           - Path=/payment/get/**   #断言,路径相匹配的进行路由
 
       - id: payment_routh2
         uri: http://localhost:8001
         predicates:
           - Path=/payment/lb/**   #断言,路径相匹配的进行路由

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://localhost:7001/eureka

8.测试

启动7001:cloud-eureka-server7001
启动8001:cloud-provider-payment8001
启动9527网关:cloud-gateway-gateway9527
访问说明
在这里插入图片描述
添加网关前: http://localhost:8001/payment/get/31
添加网关后: http://localhost:9527/payment/get/31

5.通过微服务名实现动态路由

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

5.1.启动

一个eureka7001+两个服务提供者8001/8002

5.2.POM

5.3.YML

server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/get/**   #断言,路径相匹配的进行路由
 
        - id: payment_routh2
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/**   #断言,路径相匹配的进行路由

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://localhost:7001/eureka

需要注意的是uri的协议为lb,表示启用Gateway的负载均衡功能。
lb://serviceName是spring cloud gateway在微服务中自动为我们创建的负载均衡uri

5.4.测试

http://localhost:9527/payment/lb
8001/8002两个端口切换

6.Predicate的使用

6.1.是什么

启动我们的gatewat9527,查看启动日志
在这里插入图片描述

6.2.Route Predicate Factories这个是什么东东?

在这里插入图片描述

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapper基础框架的一部分。
Spring Cloud Gateway包括许多内置的Route Predicate工厂。所有这些Predicate都与HTTP请求的不同属性匹配。多个Route Predicate工厂可以进行组合
Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactory创建Predicate对象,Predicate对象可以赋值给 Route。Spring Cloud Gateway包含许
多内置的Route Predicate Factories。
所有这些谓词都匹配HTTP请求的不同属性。多种谓词工厂可以组合,并通过逻辑and 。

6.3.常用的Route Predicate

1.After Route Predicate
在这里插入图片描述

ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);

  • After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
    • 测试:没到时间进行测试报错

在这里插入图片描述
2.Before Route Predicate

  • YML
    • Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]

3.Between Route Predicate

  • YML
    • Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]

4.Cookie Route Predicate
在这里插入图片描述

  • YML
    • Cookie=username,atguigu #并且Cookie是username=zhangshuai才能访问
  • 不带cookies访问

在这里插入图片描述

  • 带上cookies访问
    • curl下载地址:https://curl.haxx.se/download.html

在这里插入图片描述

  • 加入curl返回中文乱码(帖子): https://blog.csdn.net/leedee/article/details/82685636

5.Header Route Predicate
在这里插入图片描述

  • YML
    • Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式

在这里插入图片描述
6.Host Route Predicate
YML: - Host=**.donglin.com

7.Method Route Predicate
YML:- Method=GET
8.Path Route Predicate
YML:
9. Query Route Predicate
YML: - Query=username, \d+ #要有参数名称并且是正整数才能路由
10.小总结

  • All
server:
  port: 9527

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/get/**   #断言,路径相匹配的进行路由

        - id: payment_routh2
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/**   #断言,路径相匹配的进行路由
            #- After=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
            #- Cookie=username,zhangshuai #并且Cookie是username=zhangshuai才能访问
            #- Header=X-Request-Id, \d+ #请求头中要有X-Request-Id属性并且值为整数的正则表达式
            #- Host=**.atguigu.com
            #- Method=GET
            #- Query=username, \d+ #要有参数名称并且是正整数才能路由


eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://localhost:7001/eureka

说白了,Predicate就是为了实现一组匹配规则,让请求过来找到对应的Route进行处理

7.Filter的使用

7.1.是什么

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。
SpringCloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生。
在这里插入图片描述

7.2.Spring Cloud Gateway的Filter

1.生命周期,Only Two

  • pre
    • 在业务逻辑之前
  • post
    • 在业务逻辑之后

2.种类,Only Two
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#gatewayfilter-factories
1)GatewayFilter(31种之多)
在这里插入图片描述
2)GlobalFilter
在这里插入图片描述

7.3.常用的GatewayFilter

AddRequestParameter
YML
在这里插入图片描述
省略

7.4.自定义过滤器

1.自定义全局GlobalFilter
两个主要接口介绍
impiemerts GlobalFilter ,Ordered
2.能干嘛
全局日志记录
统一网关鉴权
。。。。。。
3.案例代码

package com.donglin.springcloud.filter;

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.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter,Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("*********come in MyLogGateWayFilter: "+new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("username");
        if(StringUtils.isEmpty(username)){
            log.info("*****用户名为Null 非法用户,(┬_┬)");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

4.测试
启动
在这里插入图片描述

正确:http://localhost:9527/payment/lb?username=z3
错误:http://localhost:9527/payment/lb?uname=z3

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

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

相关文章

模板征集活动正式上线 | 加入我们,共创可视化内容!

本活动是由EasyV官方发布举办的定向主题模板征集活动&#xff0c;用户报名参加并使用EasyV进行创作后&#xff0c;通过素材广场上传作&#xff0c;经由官方进行作品评估&#xff0c;取得奖次的用户即可获得相应奖励。活动面向EasyV所有产品用户&#xff0c;以作品为维度独立参与…

tomcat下载与安装win11

目录 一、下载Tomcat及解压 1、选择下载版本&#xff08;本文选择tomcat 10版本为例&#xff09; 2、之后选择解压到任意一个盘&#xff0c;我解压到D盘&#xff0c;解压的路径一定要记住&#xff0c;后面系统环境变量配置的时候要用到。 二、配置环境 三、验证是否配置成功…

jvm 堆 栈大小设置

1、Eclise 中设置jvm内存: 改动eclipse的配置文件,对全部project都起作用 改动eclipse根文件夹下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m //初始内存 -Xmx256m //最大内存 -Xmn16m //最小内存 -XX:PermSize128M //非堆内存 -XX:MaxPermSize256M 2、Eclise 中设置jvm内…

mybatis-plus02

目录一、乐观锁二、查询构造器三、分页查询四、逻辑删除五、Mybatis的应用一、乐观锁 配置示例&#xff1a; 在数据库表中加入version字段&#xff0c;表示数据版本号 修改实体类&#xff0c;在使用类中加入对应的version字段&#xff0c;并使用是乐观锁 //乐观锁 Version pr…

数据结构 第六章 二叉树与树(二叉树的性质)

玫瑰少年&#xff1a;点击收听 1 基本知识点 1、根结点&#xff1a;在一棵树中&#xff0c;(唯一)一个没有前驱的结点 2、叶子结点&#xff1a;在一棵树中&#xff0c;没有后继的结点 3、结点的度&#xff1a;是指结点后继的数量 4、树的度&#xff1a;是指所有结点度的最大值…

VMware ESXi 6.7 U3 Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

ESXi-6.7.0-20221004001 Build 20497097 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-6-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org VMware ESXi 6.7.0 Update 3 Build 20497097 Unlocker &…

[Vulnhub] DC-7

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-7.zip git信息泄露Drupal-CMS 拿shellnc反弹shell反弹shell写入root用户的cron定时任务&#xff0c;root执行提权 目录 <1> 信息搜集 (1) nmap扫靶机ip&端口服务 (2) github上DC-7项目信息泄露 <2&g…

洛谷 P1417 烹调方案 01背包题解 动态规划

真的好久没有写题解了 上次写还是在上次呢 先赞后看好习惯&#xff01; 昨天打了一月份的USACO(美国信奥赛) 给我一个感触&#xff08;也算是感想吧&#xff09;&#xff1a; 我是蒟蒻 我是蒟蒻 我是蒟蒻 我是蒟蒻 水内容&#xff08;&#xff09; 言归正传看今天这道题 题…

电脑键盘打字错乱怎么办?按键混乱的5种解决方法

有人问电脑无故乱打字&#xff0c;明明按的正确的键&#xff0c;打出来的却是错误的字母。换个键盘是不是就能解决呢&#xff1f; 不过如果你的手边恰好没有新键盘&#xff0c;又立刻要用电脑&#xff0c;可以先试试下面的5种方法。 重新连接键盘和电脑禁用键盘上的Num Lock运…

爬虫进阶(web逆向之b站)

文章目录 简介分析nowh5获取动态参数模拟 now模拟 h5小结简介 前面在《web逆向初步》练习了一些 JS 加密操作,这篇进入基础实战部分,通过给b沾刷播放量的例子,体会逆向的作用!当然,这里不是恶意刷流量,而是通过程序模拟一个正常用户,给视频增加一次播放量分析 一个正常用…

【深度学习框架-Paddle】丝滑安装PaddlePaddle,无缝衔接使用多卡

目录Paddle爱恨史PaddleCloud多卡Paddle爱恨史 Paddle是由百度开发的国内的深度学习框架&#xff0c;PaddlePaddle支撑了PaddleOCR、PaddleNLP等一系列领域内的开源工具包&#xff0c;为国内深度学习的落地与实践做出了大量贡献。 但是&#xff0c;PaddlePaddle安装问题一直都…

wpa_supplicant EAPOL状态机分析

协议 EEE 802.1X-2004协议&#xff1a;基于端口的网络接入控制协议&#xff08;port based network access control protocol&#xff09;。在LAN口对所接入的用户设备进行认证和控制&#xff0c;如果通过认证则端口打开&#xff0c;可以访问局域网中的资源。 状态机设计原理…

TYPE-C接口引脚详解

Type-C口有4对TX/RX分线&#xff0c;2对USBD/D-&#xff0c;一对SBU&#xff0c;2个CC&#xff0c;另外还有4个VBUS和4个地线。 1、当Type-C接口仅用作传输DP信号时&#xff0c;则可利用4对TX/RX&#xff0c;从而实现4Lane传输&#xff0c;这种模式称为DPonly模式&#xff1b;…

如何对项目健康度进行测量?评估项目健康状况

项目驱动变革&#xff0c;大部分公司逐步由运营驱动转变为项目驱动&#xff0c;带来更多重新和商业价值。对组织而言&#xff0c;从商业角度看&#xff0c;项目旨在推动组织从一个状态转到另一个状态&#xff0c;从而达成特定目标。项目的健康情况如何关乎项目和变革的成本&…

生成package.json文件报错“系统找不到指定的路径”

文章目录一、提出问题二、解决问题一、提出问题 package.json文件作为Web工程的入口&#xff0c;到底有多少配置是和我们的日常开发相关的&#xff1f;使用npm或yarn命令生成一个最简单的package.json文件。在命令行执行命令&#xff1a;yarn init -y 执行命令hadoop version也…

IB数学还能做什么IA

苦恼着不知道怎么写数学科IA。对呀&#xff0c;数学不就是做做题&#xff0c;算算数吗&#xff0c;加减乘除神马的&#xff0c;到底还可以做什么课题&#xff01;&#xff1f; 第一问&#xff1a;“到底怎么才是一个没有bug的数学IA题目呢&#xff1f;” 面对这个问题&#xff…

快速构建和安装干净的 ESXi 8 镜像指南

申请的 ESXi 8 的免费授权到了&#xff0c;所以趁着春节假期最后一天&#xff0c;折腾一把。这篇文档支持 ESXi 8 及以下版本的安装镜像构建&#xff0c;无需麻烦的依赖安装和解决环境问题。 相比较安装运行网上已经构建好的黑盒镜像&#xff0c;为什么不自己进行构建呢&#…

ARM uboot 主Makefile 分析

一、uboot 主Makefile分析1 1、uboot version 确定&#xff08;Makefile 的 24-29 行&#xff09; (1) uboot 的版本号分 3 个级别&#xff1a; VERSION&#xff1a;主板本号 PATCHLEVEL&#xff1a;次版本号 SUBLEVEL&#xff1a;再次版本号 EXTRAVERSION : 另外附加的版本信…

Redis对不起是我肤浅了(基础和应用篇):位图(Bitmaps)的妙用和深入分析每个子命令的用法

一、前言 在Redis 4.0 版本之前&#xff0c;Redis是单线程程序&#xff0c;主要是指Redis的网络I/O线程。Redis的持久化、集群同步等操作&#xff0c;则是由另外的线程来执行的。但在Redis 4.0 版本之后&#xff0c;Redis添加了多线程的支持&#xff0c;这时的多线程主要体现在…

温湿度传感器不同输出方式的优异对比

温湿度传感器装有湿敏和热敏元件&#xff0c;多以温湿度一体式的探头作为测温元件&#xff0c;将温度和湿度信号采集出来&#xff0c;经过稳压滤波、运算放大、非线性校正、V/I转换、恒流及反向保护等电路处理后&#xff0c;转换成与温度和湿度成线性关系的电流信号或电压信号输…