0201概述-网关Gateway-微服务架构

news2024/10/7 4:27:15

文章目录

    • 1 前言
    • 2 项目引入
    • 3 术语
    • 4 工作原理
    • 5 配置示例
      • 5.1 简洁配置
      • 5.2 展开配置
    • 6 Predicate
    • 7 GatewayFilter
      • 7.1 StripPrefix GatewayFilter
      • 7.2 RequestRateLimiter` `GatewayFilter
      • ① pom 依赖
      • ② 配置按照请求IP 的限流
    • 6 Global Filters
    • 7 网关超时配置
      • 7.① 配置全局路由超时时间
      • 7.② 特定接口配置超时时间
    • 8 网关CORS 跨域配置
    • 结语

1 前言

Spring Cloud Gateway是一个基于Spring Framework 5、Spring Boot 2和Project Reactor等技术开发的API网关,它提供了一系列的过滤器(Filter)来处理HTTP请求和响应,可以轻松地实现路由、负载均衡、限流、重试、熔断、安全控制等功能,可以作为微服务架构中的入口和边缘服务。

Spring Cloud Gateway的核心组件包括路由(Route)、断言(Predicate)、过滤器(Filter)等。路由用来将请求映射到不同的微服务上,断言则用来匹配请求的条件,过滤器则可以对请求进行修改和拦截。

Spring Cloud Gateway提供了丰富的可扩展性,可以通过编写自定义的路由、断言、过滤器等组件来满足各种复杂的业务需求。同时,它还集成了Spring Cloud的服务发现和负载均衡机制,可以自动地从注册中心中获取微服务的信息并进行负载均衡

下面我们根据官网文档和我们正在学习的开源项目pig文档以及其他相关文档,介绍一些我们开发中会用到的一些内容。

2 项目引入

项目工程pom.xml文件用引入:

<!-- 版本在spring-cloud-gateway-dependencies中指定 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

3 术语

核心概念描述
Route(路由)网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成。
Predicate(断言)路由转发的判断条件,我们可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。
Filter(过滤器)过滤器,我们可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理。

注意:其中Route和Predicate必须同时申明

4 工作原理

gateway工作原理如下图4-1所示:

在这里插入图片描述

Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关服务,它基于Spring 5,Spring Boot 2和Project Reactor构建,提供了一种简单而有效的方式来路由请求、进行限流、进行身份验证和授权、实现负载均衡等功能。

Spring Cloud Gateway的工作原理可以简单概括如下:

  1. 路由规则配置:开发人员通过配置文件或代码配置路由规则,定义请求的匹配规则和目标服务的位置。
  2. 请求到达网关:客户端请求到达Spring Cloud Gateway,被路由到对应的处理器。
  3. 过滤器链处理:Spring Cloud Gateway通过一系列过滤器链处理请求,每个过滤器可以进行一些操作,如修改请求头、重定向、转发、限流、身份验证等。
  4. 路由转发:根据路由规则,将请求转发到对应的目标服务,可以是Spring Boot应用程序、其他微服务或外部API。
  5. 响应处理:Spring Cloud Gateway收到目标服务的响应后,可以通过过滤器链对响应进行修改,然后将响应返回给客户端。

总之,Spring Cloud Gateway作为一种轻量级的API网关服务,可以通过路由规则和过滤器链处理请求,将请求转发到目标服务并处理响应,从而为微服务架构中的应用提供了一种高效、灵活和可扩展的解决方案。

5 配置示例

5.1 简洁配置

application.xml配置示例

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

5.2 展开配置

application.xml配置示例

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

6 Predicate

路由转发判断条件,可以根据很多信息去判断,包括时间、Cookie、Header、Host、Method、Path等等。

我们这里以开发中的常用的Path为例,示例如下:

routes:
  - id: admin-service_router
    uri: lb://admin-service
    predicates:
      - Path=/admin/**
    filters:
      - StripPrefix=1
  • /admin/**:**表示任意,匹配任意一级路径是admin的请求,转发到对应的uri

7 GatewayFilter

网关过滤器,可以对HTTP请求或者响应做修改。下面介绍2个开发用常用的网关过滤器:

  • StripPrefix:忽略前缀
  • RequestRateLimiter:请求限流

7.1 StripPrefix GatewayFilter

以#6中路由配置为例讲解,后面参数为数字,表示在向下转发的时候,忽略几段路径前缀。

routes:
  - id: admin-service_router
    uri: lb://admin-service
    predicates:
      - Path=/admin/**
    filters:
      - StripPrefix=1
  • 这里stripPrefix值为1,对应的请求示例/admin/user在向下转发的时候忽略掉/admin/,变为/user;
  • 路径分隔符默认/,StripPrefix值对应几个/xxx/分隔符包围的路径。

7.2 RequestRateLimiter GatewayFilter

网关限流实例:

① pom 依赖

这里一定要注意,是网关引入的redis-reactive,背压模式的redis。

<!--基于 reactive stream 的redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

② 配置按照请求IP 的限流

spring:
  cloud:
    gateway:
      routes:
      - id: requestratelimiter_route
        uri: lb://pig-upms
        order: 10000
        predicates:
        - Path=/admin/**
        filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 1  # 令牌桶每秒填充平均速率
            redis-rate-limiter.burstCapacity: 3  # 令牌桶总容量
            key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表达式去的对应的bean
        - StripPrefix=1
  • 配置bean,多维度限流量的入口 对应上边key-resolver
/**
* 自定义限流标志的key,多个维度可以从这里入手
* exchange对象中获取服务ID、请求信息,用户信息等
*/
@Bean
KeyResolver remoteAddrKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}

6 Global Filters

全局过滤器,配合Ordered接口用来指定在过滤器执行链中的顺序。在开发中,我们一般用来做日志记录,获取自定义请求头信息,做校验等等。

下面看下日志记录的实例:

@Slf4j
@Component
public class ApiLoggingFilter implements GlobalFilter, Ordered {

   private static final String START_TIME = "startTime";

   private static final String X_REAL_IP = "X-Real-IP";// nginx需要配置

   @Override
   public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
      if (log.isDebugEnabled()) {
         String info = String.format("Method:{%s} Host:{%s} Path:{%s} Query:{%s}",
               exchange.getRequest().getMethod().name(), exchange.getRequest().getURI().getHost(),
               exchange.getRequest().getURI().getPath(), exchange.getRequest().getQueryParams());
         log.debug(info);
      }
      exchange.getAttributes().put(START_TIME, System.currentTimeMillis());
      return chain.filter(exchange).then(Mono.fromRunnable(() -> {
         Long startTime = exchange.getAttribute(START_TIME);
         if (startTime != null) {
            Long executeTime = (System.currentTimeMillis() - startTime);
            List<String> ips = exchange.getRequest().getHeaders().get(X_REAL_IP);
            String ip = ips != null ? ips.get(0) : null;
            String api = exchange.getRequest().getURI().getRawPath();

            int code = 500;
            if (exchange.getResponse().getStatusCode() != null) {
               code = exchange.getResponse().getStatusCode().value();
            }
            // 当前仅记录日志,后续可以添加日志队列,来过滤请求慢的接口
            if (log.isDebugEnabled()) {
               log.debug("来自IP地址:{}的请求接口:{},响应状态码:{},请求耗时:{}ms", ip, api, code, executeTime);
            }
         }
      }));
   }

   @Override
   public int getOrder() {
      return Ordered.LOWEST_PRECEDENCE;
   }

}

7 网关超时配置

路由超时配置可以为所有路由配置Http超时(响应和连接),并为每个特定路由覆盖Http超时。

7.① 配置全局路由超时时间

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 1000
        response-timeout: 10s
  • connect-timeout 必须以毫秒为单位指定连接超时时间.
  • response-timeout 必须指定为java.time.Duration

7.② 特定接口配置超时时间

- id: pig-upms      # 唯一的服务ID
  uri: lb://pig-upms # 注册中心的服务名称,实现负载均衡
  predicates:
  - Path=/admin/demo  #所有业务的请求前缀
  metadata:
    response-timeout: 200
    connect-timeout: 200

可以通过路由的metadata以下两个参数配置每个路由超时:

  • connect-timeout 必须以毫秒为单位指定连接超时时间.
  • response-timeout 必须以毫秒为单位指定响应超时时间.

8 网关CORS 跨域配置

CORS跨域配置,可以以不同的方式进行配置,这里介绍在网关进行配置的方式。

在网关的配置文件中加入以下内容(请根据实际情况修改)

spring:
  cloud:
    gateway:
#      default-filters:
#        - DedupeResponseHeader=Access-Control-Allow-Origin
      globalcors:
        corsConfigurations:
          '[/**]':
            allowedOriginPatterns: "*"           #注意这个设置只对 spring boot 2.4+ 有效,低版本 使用  allowedOrigins: "*" 属性
            allowed-methods: "*"
            allowed-headers: "*"
            allow-credentials: true
            exposedHeaders: "Content-Disposition,Content-Type,Cache-Control"
  • 以上配置可作为开发环境使用,生成环境建议你根据实际情况修改(请先理解CORS,并参考org.springframework.cloud.gateway.config.GlobalCorsProperties
  • 跨域时会产生预检请求(Pre-Flight Request),这样就会对你的服务器产生额外的网络请求。如果可以通过部署手段解决跨域,则可以关闭跨域支持,方法是把以上配置信息清理掉。

结语

如果小伙伴什么问题或者指教,欢迎交流。

❓QQ:806797785

⭐️源代码仓库地址:https://gitee.com/gaogzhen/micro

参考地址:

[1] springcloud gateway 官方文档

[2] Gateway:Spring Cloud API网关组件(非常详细)

[3] Spring Cloud——微服务网关Spring Cloud GateWay

[4] lengleng /pig

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

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

相关文章

用java 实现二叉树创建

二叉树是数据结构中的一个重要的概念&#xff0c;二叉树的概念最早由 Linus Torvalds在1958年提出。他给出了一个树形数据结构&#xff0c;可以用来存储二叉树。每个节点的左子树和右子树都是空&#xff0c;中间层是子树。在一个给定的空间中&#xff0c;每一个节点都有两个左右…

Adobe认证证书含金量

当今数字时代&#xff0c;Adobe软件已经成为了许多人工作和创造的必备工具。为了证明自己在使用Adobe软件方面的专业能力&#xff0c;许多人选择参加Adobe认证考试并获取Adobe认证证书。 那么&#xff0c;这些证书的含金量究竟如何呢&#xff1f; 首先&#xff0c;需要指出的…

C++:Article:链接器(二):符号决议

链接器 1. C源文件都有些什么1.1 . 目标文件里有什么 2. 符号表 Symbol table2.1. 符号表的位置2.2. 符号的决议2.3. 符号决议过程 3. 实例说明3.1. 意外出现3.2 总结排查 在上篇文章中&#xff0c;我们介绍了 链接器基本概念&#xff0c;我们知道所有的应用程序否是连接器将所…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

Cesium基础教程

一、概述 Cesium是国外一个基于javascript的地图引擎&#xff0c;支持3D、2D、2.5D形式的展示&#xff0c;可以自行绘制图形、高亮区域&#xff0c;并提供良好的触摸支持&#xff0c;并支持大多数的浏览器和移动端。 Cesium 是一个跨平台、跨浏览器的展示三维地球和地图的 ja…

【PWN刷题__ret2text】[CISCN 2019华北]PWN1

ret2text~ 前言 依旧是简单的ret2text 一、checksec查看 No canary found 没有开启栈溢出保护 二、IDA反汇编 双击进入func() 发现后门函数system("cat/flag")&#xff1b;根据语义&#xff0c;函数提供了修改v1&#xff0c;判断v2是否等于11.28125&#xff0c;如…

【倒计时4天】金融服务用户体验专场沙龙开启预约

易观&#xff1a;数智化浪潮下&#xff0c;金融业务用户运营从线下向全渠道延伸。用户体验已成为⾦融机构打造差异化的重要抓手。此外&#xff0c;随着⽤户体验的全⾯数字化和精细化&#xff0c;⽤户体验贯穿于整个客户旅程中&#xff0c;做好用户体验管理&#xff0c;体现差异…

okio篇 1.Buffer

总览: Okio的两个基本概念&#xff1a;Source和Sink。Source对标基础io库中的InputStream&#xff0c;负责读数据。Sink对标OutputStream&#xff0c;负责写数据。 Source和Sink的内部实现&#xff0c;都是一个Buffer。Buffer从字面意思理解就是一个缓冲区&#xff0c;跟Buff…

『pyqt5 从0基础开始项目实战』12. 实现多线程循环检测数据的开始和停止(保姆级图文)

目录 最终效果导包和框架代码 main.py避免重复执行开始与停止事件表格更新事件 scheduler.py初始化开始线程停止线程在线程列表中删除线程TaskThread新建线程StopThread停止线程完整代码main.pythreads.pyscheduler.py 总结 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#…

C. Anadi and Domino(思维 + 枚举)

Problem - C - Codeforces 阿纳迪有一副多米诺骨牌。每张多米诺骨牌都有两个部分&#xff0c;每个部分都包含一些小点。对于每一个a和b&#xff0c;如1≤a≤b≤6&#xff0c;1≤a≤b≤6&#xff0c;正好有一块多米诺骨牌的一半是a点&#xff0c;另一半是b点。这组多米诺骨牌正好…

手动实现 Tomcat 底层机制+ 自己设Servlet

目录 手动实现 Tomcat 底层机制 自己设Servlet 完成小案例 运行效果 此项目用maven至于怎么配置在下一篇文章 创建cal.html CalServlet.java web.xml WebUtils 问题: Tomcat 整体架构分析 测试分析&#xff1a; 抓包情况 手动实现 Tomcat 底层机制 自己设计 Serv…

十个高质量工具网站推荐,AI自动抠图换背景,任意背景自动融合

AI 背景更换是一种利用生成式人工智能创建新图像背景的软件工具。与传统方法需要移除原有的背景并更换新的不同&#xff0c;AI背景生成器使用先进的算法生成与前景完美融合的全新背景。这项技术彻底改变了图像编辑的方式&#xff0c;为设计提供了更多的创造自由和灵活性。 特点…

数据结构--B树、B+树

数据结构--B树、B树 1. 什么是B树2.建立B树的要求3.什么是B树4.Mysql里面为什么使用B树作为索引结构&#xff1f; 1. 什么是B树 B树是一种数据结构&#xff0c;用于在硬盘或其他非易失性存储介质上快速存储和访问大量数据。它是一种平衡树&#xff0c;其每个节点可以存储多个键…

zabbix SNMP traps 监控案例

目标 根据H3C网络设备 发送 SNMP trap 信息进行网络端口的告警。 具体过程 继上次配置的trap 方式进行监控一个案例。 其中log数据中的内容是&#xff1a; 20230330.163810 ZBXTRAP 192.168.21.148 UDP: [192.168.21.148]:52289->[172.18.18.2]:1162 DISMAN-EVENT-MIB::…

Keil5软件安装方法(兼容stm32与c51方法)

目录 一、下载软件包 二、安装软件 1、安装C51v960a.exe (1&#xff09;右键以管理员权限运行程序 &#xff08;2&#xff09;开始安装软件 &#xff08;3&#xff09;勾选协议 &#xff08;4&#xff09;选择安装路径 &#xff08;5&#xff09;填写名字与邮箱 &#xff0…

我国元宇宙行业分析:政策、技术、资金助推行业探索多元化应用场景

1.元宇宙行业概述、特征及产业链图解 元宇宙是人类运用数字技术构建的&#xff0c;由现实世界映射或超越现实世界&#xff0c;可与现实世界交互的虚拟世界&#xff0c;具备新型社会体系的数字生活空间&#xff0c;主要具有沉浸式体验、开放性、虚拟身份、不断演化、知识互动、…

c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL

c/c:指针&#xff0c;指针定义和使用&#xff0c;指针大小4字节&#xff0c;野指针&#xff0c;空指针*pNULL 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&#xf…

VMware开机自启虚拟机系统

一、前提 wmware开机自启&#xff0c;安装完毕wmware不用管&#xff0c;默认该软件以及相关服务就是开机自启准备waware虚拟机&#xff08;一般都linux&#xff0c;我用centos7&#xff0c;你随意&#xff09; 二、脚本 脚本命令如下&#xff0c;等待30秒&#xff08;给服务自启…

NXP公司K20+PF8100实现硬件窗口看门狗

Kinetis K20 72 MHz MCU系列为中等性能的Kinetis产品组合提供了可扩展的入门级产品&#xff0c;具有差异化的集成&#xff0c;配备高精度模拟集成和灵活的低功耗功能。其相关资源可在NXP的官网获得。 PF81/PF82为PMIC系列专为高性能处理应用而设计&#xff0c;如娱乐中控、车载…

阅读完synchronized和ReentrantLock的源码后,我竟发现其完全相似

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…