Getway介绍和使用

Getway

入门简介

网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖

  2. 配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一标示

  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡

  3. 路由断言(predicates):判断路由的规则,

  4. 路由过滤器(filters):对请求或响应做处理

引入相关依赖

<!--网关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置文件

predicates这个一定不能重复,是唯一的!!!

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.31.140:8848 # nacos 地址
    gateway:
      routes:
        - id: user-service #  路由标识,必须唯一
          uri: lb://user-service # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**

在这里插入图片描述

启动项目

测试下是否正确,将user-sevice和order-service代理成10010端口

在这里插入图片描述

路由断言

像这样的断言工厂在SpringCloudGateway还有十几个,我们只需要掌握Path这种路由工程就可以了。

名称说明示例
After是某个时间点后的请求- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before是某个时间点之前的请求- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between是某两个时间点之前的请求- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie请求必须包含某些cookie- Cookie=chocolate, ch.p
Header请求必须包含某些header- Header=X-Request-Id, \d+
Host请求必须是访问某个host(域名)- Host=.somehost.org,.anotherhost.org
Method请求方式必须是指定方式- Method=GET,POST
Path请求路径必须符合指定规则- Path=/red/{segment},/blue/**
Query请求参数必须包含指定参数- Query=name, Jack或者- Query=name
RemoteAddr请求者的ip必须是指定范围- RemoteAddr=192.168.1.1/24
Weight权重处理

示例

After

要想在亚洲/上海,2031-12-06T15:14:47.433之前访问

只需要加上请求头即可

- After=2031-12-06T15:14:47.433+08:00[Asia/Shanghai] # 添加请求头
完善配置
server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.31.140:8848 # nacos 地址
    gateway:
      routes:
        - id: user-service #  路由标识,必须唯一
          uri: lb://user-service # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
            - After=2031-12-06T15:14:47.433+08:00[Asia/Shanghai] # 添加请求头

会有404错误

在这里插入图片描述

Before

要想在亚洲/上海,2031-12-06T15:14:47.433之后访问

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.31.140:8848 # nacos 地址
    gateway:
      routes:
        - id: user-service #  路由标识,必须唯一
          uri: lb://user-service # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
            - Before=2031-12-06T15:14:47.433+08:00[Asia/Shanghai] # 添加请求头

访问是成功的在这里插入图片描述

过滤器

路由过滤器的种类

Spring提供了31种不同的路由过滤器工厂。

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果中移除有一个响应头
RequestRateLimiter限制请求的流量

请求头过滤器

只需要在配置文件中加上

filters:
  - AddRequestHeader=Truth, Bunny-cli # 添加请求头

完善配置,为所有请求头统一加上

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.31.140:8848 # nacos 地址
    gateway:
      routes:
        - id: user-service #  路由标识,必须唯一
          uri: lb://user-service # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
            - Before=2031-12-06T15:14:47.433+08:00[Asia/Shanghai] # 添加请求头
          filters:
            - AddRequestHeader=Truth, Bunny-cli # 添加请求头

并在order-serve中打印

@GetMapping("{orderId}")
public Order queryOrderByUserId(@PathVariable("orderId") Long orderId,
                                @RequestHeader(value = "Truth",required = false) String truth) {
    log.info("------------truth------------:{}", truth);
    return orderService.queryOrderById(orderId);
}

在这里插入图片描述

效果展示

在这里插入图片描述

在配置文件中加上过滤器,如果设置中文的话会有乱码。

在这里插入图片描述

默认过滤器

为所有配置都加上:

如果要对所有的路由都生效,则可以将过滤器工厂写到default下

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.31.140:8848 # nacos 地址
    gateway:
      routes:
        - id: user-service #  路由标识,必须唯一
          uri: lb://user-service # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
            - Before=2031-12-06T15:14:47.433+08:00[Asia/Shanghai] # 添加请求头
#          filters:
#            - AddRequestHeader=Truth, Bunny-cli # 添加请求头
      default-filters:
        - AddRequestHeader=Truth, Bunny-cli # 添加全局请求头

在这里插入图片描述

在所有请求都输出下

在这里插入图片描述

过滤器的作用是什么?

  1. 对路由的请求或响应做加工处理,比如添加请求头
  2. 配置在路由下的过滤器只对当前路由的请求生效

defaultFilters的作用是什么?

  1. 对所有路由都生效的过滤器

全局过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口。

定义过滤器

在gateway中定义一个过滤器

  • 判断当前用户是否为admin如果是的放行
    • 判断请求的params中是否包含adminparams.getFirst("authorization")
      • 通过paramsauthorization字段判断
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Order(-1)// 值越小权重越高
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1. 获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2. 获取参数中的 authorization
        String authorization = params.getFirst("authorization");
        // 3. 判断参数是否等于admin
        if ("admin".equals(authorization)) {
            return chain.filter(exchange); // 4. 是,放行
        }
        // 5. 否,放行
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }
}

在这里插入图片描述

如果存在,可以正常获取到结果,如果当前不是admin则返回 401

在这里插入图片描述

如果当前不是admin,返回401。不通过。

exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED)HttpStatus枚举

在这里插入图片描述

过滤器执行顺序
Order注解

Order:可以使用注解中的Order,数值越小权重越高。或者使用继承Ordered实现同样的效果。

在这里插入图片描述

Ordered继承实现

通过返回getOrder数值,效果同样,值越小权重越高

// 也可以使用 Ordered 修改权重
@Override
public int getOrder() {
    return -1;
}

排序的规则是什么呢?

  • 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

跨域问题

跨域问题在服务端是不存在的,就比如之前调用的接口,user访问Order它们之间没有跨域问题,包括在gateway中也没有。

浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题。

解决方式

需要再配置中加上globalcors

spring:
  cloud:
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "http://127.0.0.1:5500"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

完善代码

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 192.168.31.140:8848 # nacos 地址
    gateway:
      routes:
        - id: user-service #  路由标识,必须唯一
          uri: lb://user-service # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言
        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
            - Before=2031-12-06T15:14:47.433+08:00[Asia/Shanghai] # 添加请求头
      default-filters:
        - AddRequestHeader=Truth, Bunny-cli # 添加请求头
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:5500"
              - "http://127.0.0.1:5500"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

未设置时

在这里插入图片描述

设置完成后效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-180 openGauss 数据库运维-升级-升级前必读

文章目录 openGauss学习笔记-180 openGauss 数据库运维-升级-升级前必读180.1 升级方案180.2 升级前的版本要求180.3 升级影响和升级约束 openGauss学习笔记-180 openGauss 数据库运维-升级-升级前必读 180.1 升级方案 本节为指导用户选择升级方式。 用户根据openGauss提供的…

按摩上门预约小程序源码系统 开发组合:PHP+MySQL 附带完整的搭建教程

现代生活节奏的加快&#xff0c;人们越来越注重健康与放松。按摩作为传统的舒缓方式&#xff0c;市场需求逐年上升。然而&#xff0c;传统的按摩服务预约方式较为繁琐&#xff0c;用户需拨打热线电话或前往实体店进行预约&#xff0c;这无疑增加了用户的操作成本。因此&#xf…

redhat 8 安装openstack

redhat 8 安装openstack 1、安装文档2、redhat 8 安装openstack3、使用openstack 1、安装文档 openstack官方安装文档 https://docs.openstack.org/install-guide/ 2、redhat 8 安装openstack 3、使用openstack

人工智能——移动摄影技术

目录 封面 1 .移动计算摄影简介 2.手机相机的硬件限制 2.1 传感器尺寸和镜头孔径 2.2 噪声和动态范围 2.3 景深 2.4 变焦 2.5 色彩欠采样 3 .相机图像处理流水线 3.1 相机传感器 3.2 相机流水线 5.拓展 1 .移动计算摄影简介 现代数字摄影的进度始终伴随着图像传感器…

云计算IaaS、PaaS和SaaS之

提供的服务来比较如下两图 示例图 示例图

前端优化 - 防抖和节流

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

提升爬虫IP时效:解决被封IP的难题

在进行数据采集时&#xff0c;经常会遇到被目标网站封禁IP的情况&#xff0c;这给爬虫系统带来了困扰。本文将介绍如何提升爬虫IP的时效&#xff0c;解决被封IP的难题&#xff0c;帮助您顺利进行数据采集&#xff0c;不再受限于IP封禁。 第一步&#xff1a;使用爬虫IP 使用爬虫…

【MySQL】数据库之存储过程(“SQL语句的脚本“)

目录 一、什么是存储过程&#xff1f; 二、存储过程的作用 三、如何创建、调用、查看、删除、修改存储过程 四、存储过程的参数&#xff08;输入参数&#xff0c;输出参数&#xff0c;输入输出参数&#xff09; 第一种&#xff1a;输入参数 第二种&#xff1a;输出参数 …

车牌识别技术,如何用python识别车牌号

目录 一.前言 二.运行环境 三.代码 四.识别效果 五.参考 一.前言 车牌识别技术&#xff08;License Plate Recognition, LPR&#xff09;在交通计算机视觉&#xff08;Computer Vision, CV&#xff09;领域具有非常重要的研究意义。以下是该技术的一些扩展说明&#xff1…

如何解决msvcp110.dll丢失问题,多种解决方法分享

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp110.dll丢失”&#xff0c;msvcp110.dll是Microsoft Visual C 2012 Redistributable的一个组件&#xff0c;它提供了许多用于运行程序的函数和类库。当这个文件丢失或损坏时&#xff…

oracle-存储结构

文件包括 控制文件.ctl、数据文件.dbf、日志文件.log这三类放在存储上。 参数文件&#xff1a;空间的划分&#xff0c;进程的选用&#xff08;.ora&#xff09; oracle启动的时候需要读一下&#xff0c;数据库启动后&#xff0c;参数文件并不关闭&#xff0c;但即使文件丢了&a…

域用户信息查询

域环境基本知识 本地账户 本地账户 命令行查询本地账户 net user来宾账户默认来宾组&#xff1a; net localgroup Guests 查询guest账号SID wmic group get name,sid | findstr Guestspowershell 查询本地用户和 SID Get-WmiObject -Class Win32_UserAccount -Filter &q…

visual studio + intel Fortran 错误解决

版本&#xff1a;VS2022 intel Fortran 2024.0.2 Package ID: w_oneAPI_2024.0.2.49896 共遇到三个问题。 1.rc.exe not found 2.kernel32.lib 无法打开 3.winres.h 无法打开 我安装时参考的教程&#xff1a;visual studio和intel oneAPI安装与编写fortran程序_visual st…

私有部署ELK,搭建自己的日志中心(六)-- 引入kafka对采集日志进行削峰填谷

一、背景 首先&#xff0c;要说明一点&#xff0c;elk日志中心&#xff0c;是可以缺少kafka组件的。 其次&#xff0c;如果是研发环境下&#xff0c;机器资源紧张的情况下&#xff0c;也是可不部署kafka。 最后&#xff0c;因为kafka的部署是可以独立的&#xff0c;所以本文将…

IP地理位置定位技术基本原理

IP地理位置定位技术的基本原理是基于IP地址的特性。每个IP地址在网络中都有一个与之对应的地理位置信息&#xff0c;这是通过IP地址数据库来确定的。这个数据库由ISP&#xff08;Internet Service Provider&#xff09;或其它一些机构维护&#xff0c;其中包含了每个IP地址的地…

凸包算法--物体表面积/体积计算--python版

文章目录 环境&#xff1a;1.1 凸包法介绍&#xff1a;2.1 python代码3.1 可视化4.1 体积/表面积Calculation 环境&#xff1a; Open3D 1.1 凸包法介绍&#xff1a; 用于找到包围给定点集的最小凸多边形或凸多面体 常用的凸包算法&#xff1a; Grabam扫描法&#xff08;适用…

iptables 防火墙(二)

目录 1. SNAT 策略及应用 1.1 SNAT策略概述 1. 只开启路由转发&#xff0c;未设置地址转换的情况 2. 开启路由转发&#xff0c;并设置SNAT转换的情况 1.2 SNAT策略的应用 1. 2.1 共享固定IP上网 &#xff08;1&#xff09;打开网关的路由转发 &#xff08;2&#xff09;…

LLaVA-v1.5-7B:实现先进多模态学习的开源AI

引言 LLaVA-v1.5-7B是一个开源大型多模态模型&#xff08;LMM&#xff09;&#xff0c;它通过结合视觉指令调整&#xff08;Visual Instruction Tuning&#xff09;技术&#xff0c;展示了在多模态理解和生成任务上的卓越性能。该模型特别注重简洁性和数据效率&#xff0c;利用…

MySQL:索引

MySQL官方对索引的定义为: 索引 (Index) 是帮助MySQL高效获取数据的数据结构。 提取句子主干&#xff0c;就可以得到索引的本质:索引是数据结构。 1. 什么是索引&#xff0c;索引的作用 索引是一种用于快速查询和检索数据的数据结构&#xff0c;帮助mysql提高查询效率的数据…

在Linux运行LaTeX

共有三个步骤1. 装LaTexTeX Live - TeX Users Group 下载对应版本安装包安装 文件比较大&#xff0c;这步花的时间多一点&#xff0c;不过也不会太多&#xff0c;感觉5分钟十分钟的样子吧 2. 装TexStidio 这一步是安装一个类似在windows系统下的TaTeX GUI软件 图标是这样3. 配置…