微服务·架构组件之网关- Spring Cloud Gateway

2023-11-15

微服务·架构组件之网关- Spring Cloud Gateway

引言

微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在微服务架构中的作用。

概述

Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式,统一访问接口。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。它是基于Nttey的响应式开发模式。

核心概念

请添加图片描述
路由(Route):路由是网关最基础的部分,路由信息由一个ID、一个目标的URL、一组断言工程和一组过滤器组成。如果断言为真,则说明请求URL和配置的路由匹配。

断言(Predicates):Java8中的断言函数,Spring Cloud Gateway中的断言函数允许开发者去定义函数匹配来自Http Request中的任何信息,比如请求头和参数等。

过滤器(Filter):一个标准的Spring webFilter, 可以分为Gateway Filter和Global Filter。过滤器Filter可以对请求和响应进行处理。

示例:

server:
	port: 8080
spring:
	application:
		name: api-gateway
	cloud:
		gateway:
			routes:
			- 	id: product-service
				uri:http://127.0.0.1:9002
				predicates:
				-	Path=/product/**
  • id:自定义的路由Id,保持唯一。
  • uri:目标服务地址
  • predicates:路由条件,Predicate接受一个输入参数,返回一个boolean结果。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑,比如:与、或、非
  • filters:过滤规则。

工作流程

请添加图片描述

  • 客户端将请求发送到Spring Cloud Gateway上。
  • Spring Cloud Gateway通过Gateway Handler Mapping找到与请求相匹配的路由,并将其发送给Gateway Web Handler。
  • Gateway Web Handler 通过指定的过滤器链(Filter Chain)将请求转发到实际的服务节点中,执行业务逻辑,返回响应结果。
  • 过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑。
  • 过滤器可以在请求转发到服务端前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等。
  • 过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。

路由规则

在这里插入图片描述

动态路由

动态路由,即自动从注册中心获取服务列表并访问。
现在以spring cloud gateway 集成nacos为例

  1. 添加依赖:在项目的’pom.xml’文件中添加Spring cloud gateway和nacos的相关依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 配置文件:在’application.properties’或’application.yml’中配置Nacos注册中心的地址以及网关的路由规则
spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 
    gateway:
      discovery:
        locator:
          enabled: true # 启用服务发现
      routes:
        - id: service-route
          uri: lb://service-name # 后端服务名称
          predicates:
            - Path=/service-path/** # 匹配的请求路径
          filters:
            - StripPrefix=1 # 去掉前缀
  1. 启动服务发现:在Spring Boot应用程序的主类上使用’@EnableDiscoveryClient’注解,以启用服务发现功能。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

重写转发路径

在Spring Cloud gateway中,路由转发是直接将匹配的路由path直接拼接到映射路径(URL)之后,那么在微服务中开发往往没有那么便利,这里可以通过RewritePath机制来进行路径重写。

spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 
    gateway:
      discovery:
        locator:
          enabled: true # 启用服务发现
      routes:
        - id: service-route
          uri: lb://service-name # 后端服务名称
          predicates:
            - Path=/service-path/** # 匹配的请求路径
          filters:
            - RewritePath=/serive-path/(? <segment>.*), /$\{segment}

过滤器

Spring Cloud Gateway的Filter从作用范围可分为两种:GatewayFilter与GlobalFilter

  • GatewayFilter:应用到单个路由或者一个分组的路由上。
  • GlobalFilter:应用到所有的路由上。

局部过滤器(GatewayFilter)

局部过滤器是针对单个路由的过滤器,可以对访问的URL过滤,进行切面处理。常见的局部过滤器:

  • AddRequestHeader,为原始请求添加Header。
  • Hystrix:为路由引入Hystrix的断路器保护。
  • FallbackHeaders:为fallbackUri的请求头中添加具体的异常信息。
  • RequestRateLiiter:对于请求限流,限流算法为令牌桶算法。

全局过滤器(GlobalFilter)

全局过滤器作用于所有路由,Spring Cloud Gateway定义了GlobalFilter接口,用户可以自定义实现自己的Global Filter。通过全局过滤器可以实现对权限的统一检验,安全性验证等功能。
在这里插入图片描述

高级应用

鉴权

在这里插入图片描述
角色:

  • 客户端:访问微服务资源
  • 网关:负责转发、认证、鉴权
  • OAuth2.0授权服务:负责认证授权颁发令牌
  • 微服务集合:提供资源

流程:

  • 客户端发送请求给网关获取令牌
  • 网关收到请求,直接转发给授权服务
  • 授权服务验证用户名、密码等,验证通过颁发令牌给客户端
  • 客户端携带令牌请求资源,请求直接到网关层
  • 网关层对令牌及性能校验、鉴权和访问资源所需的权限进行比较。如果权限有交集则通过校验,直接转发给微服务
  • 微服务处理逻辑

网关限流

常见的限流算法

  • 计数器法
    一般我们会限制一秒钟能够通过的请求数,比如限流的qps为100,算法的实现思路就从从第一请求进来开始,在接下来的1s内,每来一个请求,就把计数加1,如果累加的数字达到100,那么或许的请求就会被全部拒绝。等到1s结束后,计数器恢复成0,重新开始计数。
  • 漏斗算法
    匀速处理请求。不管调用方多么不稳定,通过漏斗算法进行限流,每10ms处理一次请求,因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理请求就先放到桶里。如果桶满了,那么新进来的请求就丢弃。
  • 令牌桶算法
    令牌桶算法是对漏斗算法的一个改进,存在一个桶,用来存放固定数量的令牌,然后以一定的速率往桶中放令牌。每次请求进来的时候需要先获取令牌,只有拿到令牌才有机会继续执行,否则选择等待可用的令牌或者直接拒绝。
  • Gateway令牌桶
    Spring Cloud Gateway 官方提供了RequestRateLimiterGatewayFilterFactory类,使用redis和lua脚本实现了令牌桶的方式。

实现步骤

  • 引入依赖
<!--基于Redis实现限流-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>2.2.10.RELEASE</version>
</dependency>
  • 创建限流标示
    限流通常要根据某个参数值作为参考依据来进行线路的,例如每个IP只能只能访问2次,创建根据IP限流的对象,该对象需要实现KeyResolver接口
public class IpKeyResolver implements KeyResolver {

    /***
     * 根据IP限流
     * @param exchange
     * @return
     */
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }
}

需要将IpKeyResolver的实例交给Spring容器管理。

@Configuration
public class GatewayRateLimitConfig {

@Bean("ipKeyResolver")
public KeyResolver userIpKeyResolver(){
	return new IpKeyResolver();
}
}

  • 配置限流速率
spring:
	cloud:
        gateway:
          routes:
            #商品服务
            - id: goods_route
              uri: lb://mall-goods
              predicates:
                - Path=/mall/brand/**
              filters:
                - StripPrefix=1
                # 指定过滤器
                - name: RequestRateLimiter
                  args:
                    # 指定限流标识
                    key-resolver: '#{@ipKeyResolver}'
                    # 速率限流
                    redis-rate-limiter.replenishRate: 1
                    # 能容纳的并发流量总数
                    redis-rate-limiter.burstCapacity: 2

监控

监控每个请求的响应参数是否包含手机号码
首先,您需要创建一个自定义过滤器类,该类将检查响应参数中是否包含手机号码。这可以通过解析响应内容并搜索手机号码的正则表达式来完成。下面是一个示例:

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
@Order(1) // 设置过滤器顺序
public class PhoneNumberCheckFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 检查响应内容是否包含手机号码的逻辑
        // 解析响应内容并搜索手机号码的正则表达式
        // 如果包含手机号码,则可以进行相关处理,例如记录日志或触发警报
        // 这里仅提供示例框架,具体实现需要根据需求编写
        return chain.filter(exchange);
    }
}

然后配置过滤器

spring:
  cloud:
    gateway:
      routes:
        - id: route-name
          uri: http://example.com
          filters:
            - PhoneNumberCheck= # 这里填写自定义过滤器的名字
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务·架构组件之网关- Spring Cloud Gateway 的相关文章

随机推荐

  • JAVA是什么意思

    JAVA的意思是计算机的编程语言 Java通过面向对象的编程语言 它不仅吸收了C 语言的优点 而且摒弃了C 中难于理解的多继承和指针的概念 具有简单性 功能强大 分布式 健壮性 安全性 平台独立与可移植性 多线程及动态性的特点 Java语言
  • 第二十一课,几何着色器(基础篇)

    几何着色器的作用 输入 输入类型 从顶点着色器接收下列任何一个图元值 类型 数组大小 points 绘制GL POINTS图元时 1 lines 绘制GL LINES或GL LINE STRIP时 2 lines adjacency GL
  • seaborn学习笔记(二):散点图、线图

    html font family sans serif ms text size adjust 100 webkit text size adjust 100 body margin 0 article aside details figc
  • Spring Cloud Gateway替代zuul作为API网关(一)

    本文简要介绍如何使用Spring Cloud Gateway 作为API 网关 不是使用zuul作为网关 关于Spring Cloud Gateway和zuul的性能比较本文不再赘述 基本可以肯定Spring Cloud Finchley版
  • matlab 中.*和*有什么区别

    和 的区别 在进行数之间的运算时 和 是没有区别的 都是表示普通的乘法运算 例 m 2 n 3 m n 6 m n 6 在进行矩阵之间的运算时 和 的意义就有所不同了 假设a b表示两个矩阵 a b表示矩阵a与矩阵b进行矩阵相乘 a b表示
  • 微软服务器dda,实战DDA硬件直通:Hyper-V虚拟机直通NVMe固态硬盘

    虚拟机可以把一台电脑模拟成许多台完整的系统 并在他们当中安装运行各自的操作系统和软件应用 在使用虚拟机的时候我们既可以利用NVMe固态硬盘的性能 同时承载多个虚拟机的读写请求 也可以让其中某个需要重负载读写的虚拟机独享它的性能 这时就需要用
  • VsCode搭建Windows C++ (MSVC)开发环境

    由于最近的学习需求 折腾起了vscode 毕竟是跨平台 对以后项目的拓展也很方便 至于为什么不用mingw tdm gcc一类 主要因为毕竟是Windows平台 使用自家的MSVC开发环境一来可以放心 少出BUG 二来能够增强Windows
  • kmeans算法原理以及实践操作

    原文 http www cnblogs com dudumiaomiao p 5839905 html kmeans算法原理以及实践操作 多种k值确定以及如何选取初始点方法 kmeans一般在数据分析前期使用 选取适当的k 将数据聚类后 然
  • springboot搭建文件预览解决方案,支持目前主流格式office文件,txt文件,png,jpg等图片以及压缩文件的在线预览功能

    应用场景及实现思路 应用场景 给定一个网址 输入网址后立即显示预览文件 实现思路 1 将文件下载到本地 存储到某个指定目录 2 进行文件转换 此处是重点 3 进行文件展示 实现过程 首先 搭建一个springboot项目 搭建完毕后项目结构
  • ovsdb <10> Ops-cli结合ovsdb部分流程及接口分析

    4 6Ops cli结合ovsdb部分流程及接口分析 Ops中对于ovsdb的应用主要是基于上述的ovsdb的简单用法上的一个扩展和函数封装 现在就其与之前不同的地方做补充说明并就各个函数的使用做相应的说明 根据前面的ovsdb的数据结构描
  • 素数表

    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 1
  • C#条码设计-CODE93

    由于最近一段时间在忙考试 一直也没有时间接着写 现在考完试了 慢慢将其他的编码规则发上来 希望对各位能有所帮助 今天要跟大家分享的CODE93编码规则 一 了解一下CODE93的发展 1 Code 93於1982年 基於code 39之上而
  • Ubuntu14.04 64位机上配置OpenCV3.4.2+OpenCV_Contrib3.4.2+Python3.4.3操作步骤

    Ubuntu 14 04 64位上默认安装了两个版本的python 一个是python2 7 6 另外一个是python3 4 3 这里使用OpenCV最新的稳定版本3 4 2在Ubuntu上安装python3 4 3支持OpenCV的操作
  • 1.10 throws和throw:声明和抛出异常

    Java 中的异常处理除了捕获异常和处理异常之外 还包括声明异常和拋出异常 实现声明和抛出异常的关键字非常相似 它们是 throws 和 throw 可以通过 throws 关键字在方法上声明该方法要拋出的异常 然后在方法内部通过 thro
  • 构建微服务技术中台,SpringCloud和Kubernetes该如何选型?【最优:Kubernetes+Nacos+SpringBoot,不用SpringCloud】

    前言 中台架构一词最近在技术圈内比较火 波波基于自己的经验和视角 也来凑个热闹聊聊什么是中台架构 中台架构实际由若干个层次组成 其中微服务技术中台是构建中台架构的重要组成部分 SpringCloud和Kubernetes 是目前互联网企业构
  • C语言练习题(10)求函数返回值,传入 -1 ,则在64位机器上函数返回(非常详细的讲解)

    1 求函数返回值 传入 1 则在64位机器上函数返回 int func int x int count 0 while x count x x x 1 与运算 return count A 死循环 B 64 C 32 D 16 解析 C 1
  • BurpSuite插件HaE与Authz用法

    HaE与Authz均为BurpSuite插件生态的一员 两者搭配可以避免 越权 未授权 两类漏洞的重复测试行为 适用于业务繁杂 系统模块功能多的场景 两个插件都可以在store里安装 安装完后 点击Filter Settings勾选Show
  • React学习-推箱子游戏

    游戏效果图 共100关 代码地址 https download csdn net download qq 20698983 12740361 目录 简述 游戏布局 按键监听 推动箱子和移动人物 判断胜利 步数器 上一关 下一关 返回上一步
  • 只用一个typeC线连接树莓派4B(同时完成供电、信号传输、网络共享三合一)

    方法一 使用静态IP 供电 信号传输二合一 一 优缺点 优点 在每次连接树莓派时 无需重新查找树莓派的地址 缺点 无法使用网络共享的功能 网络共享就是可以将你电脑上的网络通过typeC共享给树莓派 这样树莓派就无需连接网络 二 树莓派上的配
  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务 架构组件之网关 Spring Cloud Gateway 引言 微服务架构已成为构建现代化应用程序的关键范式之一 它将应用程序拆分成多个小型 可独立部署的服务 Spring Cloud Gateway是Spring Cloud生态系