Gateway网关

2023-09-18 21:17:49

网关GateWay

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/3.1.2/reference/html/#gateway-how-it-works

核心概念

  • 路由: 网关的核心数据结构,定义了网关如何处理请求. 一条路由信息包含路由的唯一标识ID,目的地URI, 一组断言(用于判断当前请求是否匹配这条路由信息), 以及一组过滤器组成. 当网关收到一个请求时,如果某条路由信息的所有断言都为真,那么改请求匹配这条路由,会被发往改路由的目的uri。
  • 断言: 可以根据Http请求的路径,请求头或者请求参数对于一个请求进行路由匹配判断。
  • 过滤器: 当请求匹配上某个路由信息时,由配置的过滤器依次处理。

网关节点搭建

引入依赖

<dependencies>
        <!--   引入nacos 注册中心依赖  注册服务   -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
<!--    gateway网关的依赖,注意,不要引用 starter-web依赖,否则启动报错    -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
<!--     这个依赖可以查看网关的路由信息   -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

启动类

package com.qf.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

配置文件

server:
  port: 80
spring:
  application:             #这是注册在注册中心的服务名
    name: service-gateway
  cloud:
    nacos:
      discovery:   #注册中心的地址
        server-addr: 127.0.0.1:8848
    gateway:
      # 打开如下配置,自动发现 Nacos 注册中心的服务,并自动生成路由信息
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true  # 让网关自动生成的服务名为小写
      routes:
        - id: aa
          # 断言的作用,判断网关收到的请求是否匹配当前的路由信息
          predicates:
            - Path=/pro/**
          filters:  # 重写Url 去掉pro
            - RewritePath=/pro/?(?<segment>.*), /$\{segment}
          uri: lb://service-provide  #lb代表 负载均衡  写服务名
        - id: ss
          # 断言的作用,判断网关收到的请求是否匹配当前的路由信息
          predicates:
            - Path=/sss/**
          filters:
            - RewritePath=/sss/?(?<segment>.*), /$\{segment}
          uri: http://localhost:8081/
        - id: baidu
          # 断言的作用,判断网关收到的请求是否匹配当前的路由信息
          predicates:
            - Path=/baidu/jmj/lll/**
          filters:
            # 去掉前缀几个 /**
            - StripPrefix=3
          uri: http://www.baidu.com


#开启 监控功能#开启 监控功能  http://localhost/actuator/gateway/routes
management:
  endpoints:
    enabled-by-default: true #暴露所有端点信息
    web:
      exposure:
        include: '*'  #以web方式暴露

查看路由信息

http://localhost/actuator/gateway/routes

手动添加路由信息

spring:
  cloud:
    gateway:
      routes:
        - id: baidu
        	# 断言的作用,判断网关收到的请求是否匹配当前的路由信息 
          predicates:
            - Path=/**
          uri: http://www.baidu.com

尝试发送如下请求,并观察响应结果

http://localhost/s?wd=onepiece

添加路由信息到内部微服务

将路径/sss的请求发送给micro1微服务处理

spring:
  cloud:
    gateway:
      routes:
        - id: micro1
          predicates:
            - Path=/sss/**
          uri: http://localhost:9100/
        - id: baidu
          predicates:
            - Path=/**
          uri: http://www.baidu.com

在这里插入图片描述

错误原因分析,在micro1节点观察日志,请求路径为 /sss/test1。

在这里插入图片描述

解决办法:使用gateway提供的URL重写功能。配置url重写过滤器。

URL重写

当断言为true时,gateway会把当前请求路径完整的发送给后端uri,因此需要特别注意后端实际的接口地址是否匹配。

例如,后端真实接口地址为:http://localhost:8900/test1

那么,gateway真正转发给后端的请求为http://localhost:8900/sss/test1。

如果需要,可以重写发送给后端接口的真实uri路径。代码如下:

当匹配sss路径的请求发送给网关时,真正转发的路径去掉了sss,仅仅保留后面的路径信息

spring:
  cloud:
    gateway:
      routes:
        - id: micro1
          predicates:
            - Path=/sss/**
          filters:
            - RewritePath=/sss/?(?<segment>.*), /$\{segment}
          uri: http://localhost:9100/
        - id: baidu
          predicates:
            - Path=/**
          uri: http://www.baidu.com

或者使用内置过滤器实现URL重写

spring:
  cloud:
    gateway:
      routes:
        - id: baidu
          predicates:
            - Path=/baidu/**
          # 内置过滤器 StripPrefix,可以去掉Path中的前n个前缀(n为StripPrefix配置的值) 
          filters:
            - StripPrefix=1
          uri: http://www.baidu.com

负载均衡调用内部微服务

uri: lb://micro1 , 双斜线后面写微服务的名称

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: micro1
          predicates:
            - Path=/sss/**
          filters:
            - RewritePath=/sss/?(?<segment>.*), /$\{segment}
          uri: lb://micro1

整合Nacos自动生成微服务路由信息

注意:如果gateway想要自动生成eureka中注册服务的路由信息,需要开启如下配置:

spring:
  cloud:
    gateway:
      # 打开如下配置,自动发现eureka注册中心的服务,并自动生成路由信息      
      discovery:
        locator:
          enabled: true 
          lower-case-service-id: true  # 让网关自动生成的服务名为小写

http://localhost/actuator/gateway/routes

断言配置

spring:
  cloud:
    gateway:
      routes:
        - id: search
          uri: lb://micro1  #服务名
          predicates:
            - Path=/sss/**
            - After=2022-01-20T17:42:47.789-07:00[America/Denver] # 还有一个Before 
            - Cookie=chocolate, ch.p   #cookie  chocolate=chop
            - Header=X-Request-Id, \d+  # 请求头里   X-Request-Id= 1-任意个(0-9)的整数
          filters:
            - RewritePath=/sss/?(?<segment>.*), /$\{segment}
更多推荐

怎么设置IP白名单

IP白名单是一种网络安全机制,用于限制只允许特定的IP地址或IP地址范围通过访问控制。在本文中,我将详细解释IP白名单的概念、用途以及如何设置IP白名单。**1.什么是IP白名单?**IP白名单是一种访问控制列表,它允许或阻止特定的IP地址或IP地址范围对系统、应用程序或网络进行访问。只有在白名单中的IP地址被授权通过

C++ std::unique_lock 用法

文章目录1.创建std::unique_lock对象2.自动加锁和解锁3.延迟加锁与手动加解锁4.尝试加锁5.配合条件变量使用6.小结参考文献std::unique_lock是C++11提供的一个用于管理互斥锁的类,它提供了更灵活的锁管理功能,适用于各种多线程场景。1.创建std::unique_lock对象std::

【面试刷题】——Qt事件处理器级别的划分

在Qt中,事件处理器(EventHandler)可以分为不同的级别,以适应不同的需求和场景。以下是Qt事件处理器级别的划分:应用程序级别事件处理器:这是最高级别的事件处理器,通常用于处理应用程序范围内的事件,如全局快捷键、自定义应用程序级别的事件等。应用程序级别事件处理器可以通过继承QCoreApplication或使

浅谈电气防火保护器在地下商场的应用 安科瑞 缪阳扬

摘要:近年来,我国城市发展速度加速。很多城市大力建造地下建筑设施,比如地铁、地下停车场和地下商场等。地下商场属于人员密集型建筑,其防火设计一直令相关的专家头疼。由于人员密集,防火处理不好将酿成灾难性的后果。因此,防火十分重要。防火设计可以着重于疏散和火灾探查报警系统两个方面,而电气火灾监控系统在实际预警和报警过程中有着

vector的扩容机制—为何是1.5倍或者是2倍

文章目录前言一、Vector扩容过程二、为什么是1.5倍或者2倍?前言在C++编程中,Vector是一种常用的动态数组容器。其大小是可以动态调整的,而在扩容操作中,Vector通常会将容量增加为原来的两倍。本篇博客将详细介绍Vector扩容的原理、扩容过程,并解释为何选择两倍进行扩容。一、Vector扩容过程当向vec

QT用户登录注册,数据库实现

登录窗口头文件#ifndefLOGINUI_H#defineLOGINUI_H#include<QWidget>#include<QLineEdit>#include<QPushButton>#include<QLabel>#include<QMessageBox>#include<QSqlDatabase>//数据库

智能配电监控管理系统:高效、安全、绿色的电力管理

随着科技的快速发展,电力行业正在逐步实现智能化、数字化转型。其中,智能配电监控管理系统在优化电力资源配置、提升运营效率、保障用电安全等方面发挥着至关重要的作用。系统架构:力安科技电易云智能配电监控管理系统是在配电室(含高压柜、变压器、低压柜)、箱式变电站、配电箱及动力柜(箱)、智能终端箱实现智能化、网络化、数字化的基础

虹科CiA演讲回顾 | CAN(FD)总线协议转换原理及其在汽车行业的应用

2023年9月14日,CiA中国技术日直播活动在线上举行,该活动致力于开展与CAN总线相关领域的技术工作,演讲者都是CAN领域的专家。虹科首席工程师陈皓受邀参与活动,并带来以“CAN和CANFD总线协议转换”为主题的演讲。本次演讲内容主要分为三个部分:首先介绍了CAN和CANFD总线的区别,并以此为切入点讲解了两种总线

在已知的二维坐标里找到最接近的点

一、业务场景最近在研发的项目,在做可视化层,在全球地图上,对我们的国家的陆地地图经纬度按照步长为1的间隔做了二维处理。在得到一组整数的点位信息后,需要将我们已有的数据库数据(业务项目)按照地址的经纬度,映射到这些点位上,找到对应的id建立联系。简化后的处理逻辑如下:参考上图:纬度为y轴,跨度为35,间距为1经度为x轴,

李沐深度学习记录1:零碎知识记录、08线性回归

简要记录,以便查阅~一、零碎知识x.numel():看向量或矩阵里元素个数A.sum():向量或矩阵求和,axis参数可对某维度求和,keepdims参数设置是否保持维度不变A.cumsum:axis参数设置沿某一维度计算矩阵累计和x*y:向量的按元素乘法torch.dot(x,y):向量的点乘(点积or内积),结果是

【python绘图—colorbar操作学习】

文章目录Colorbar的作用Colorbar的操作截取cmap拼接cmap双刻度列colorbar引用Colorbar的作用Colorbar(颜色条)在绘图中的作用非常重要,它主要用于以下几个方面:表示数据范围:Colorbar可以显示图中的颜色映射范围,帮助理解图中不同颜色所代表的数据范围。例如,在热力图中,不同的

热文推荐