SpringCloudGateWay个人笔记

news2025/1/20 5:53:48

核心概念:

Route(路由):
路由是构建⽹关的基本模块,它由 ID ,⽬标 URI ,⼀系列的断⾔和过滤器组成,如果断⾔为 true就  匹配该路由。
Predicate(断⾔、谓词): 开发⼈员可以匹配 HTTP 请求中的所有内容(例如请求头或请求参数),如果请求与断⾔相匹配则进 ⾏路由。
Filter(过滤): 指的是 Spring 框架中 GatewayFilter 的实例,使⽤过滤器,可以在请求被路由前或者之后对请求 进⾏修改。
⼯作流程:
1: 客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由
2: 将其发送到 Gateway Web Handler
3:Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执⾏业务逻辑,然后返回。过滤器之间⽤虚线分开是因为过滤器可能会在发送代理请求之前(“pre” )或之后( “post” )执⾏业务逻辑。
依赖:
<dependencies>
     <!-- spring-cloud gateway,底层基于netty -->
     <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>
     <!-- nacos注册中⼼ -->
     <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacosdiscovery</artifactId>
     </dependency>
</dependencies>

配置文件(动态路由)例子:

server:
  #gateway的端⼝
  port: 8888
spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: service-user
          uri: lb://service-user
          predicates:
            - Path=/user/**

谓词工厂:

spring:
  cloud:
    gateway:
      routes:
        - id: wfx-jifen
         uri: lb://wfx-goods
         predicates:
           - Path=/goods/detail/100
           - After=2022-11-28T15:26:40.626+08:00[Asia/Shanghai]
           - Cookie=name,jack
           - Header=token
           - Host=**.baidu.com,**.taobao.com
           - Query=name,tom
           - RemoteAddr=192.168.56.10,192.168.56.11

过滤器:

分成了全局和局部过滤器。局部只针对某一路由,全局针对所有路由。

使用内置过滤器:

spring:
  cloud:
    gateway:
      routes:
        - id: add_request_header_route
         uri: https://example.org
         filters:
         - AddRequestHeader=Foo, Bar

一般内置过滤器无法满足需求,所以经常使用自定义过滤器。自定义全局过滤器(请求是否带token的例子):

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.Map;

@Component
public class AuthFilter implements GlobalFilter, Ordered {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    //针对所有的路由进⾏过滤
    @Override
    public Mono<Void> filter(ServerWebExchange exchange,
                             GatewayFilterChain chain) {
        //过滤器的前处理
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();

        //获取当前的请求连接
        String path = request.getURI().getPath();
        if(path.contains("api/ucenter/login")||path.contains("api/ucenter/register")){
            return chain.filter(exchange);
        }

        String token = request.getHeaders().getFirst("token");

        if(StringUtils.isEmpty(token)){
            Map res = new HashMap(){{
                put("msg", "没有登录!!");
            }};
            return response(response,res);
        }else{
            String tokenRedis = redisTemplate.opsForValue().get("token");
            if(!tokenRedis.equals(token)){
                Map res = new HashMap(){{
                    put("msg", "令牌⽆效!!");
                }};
                return response(response,res);
            }else{
                return chain.filter(exchange); //放⾏
            }
        }
    }
    private Mono<Void> response(ServerHttpResponse response,Object msg){
        response.getHeaders().add("Content-Type",
                "application/json;charset=UTF-8");
        String resJson = JSON.toJSONString(msg);
        DataBuffer dataBuffer =
                response.bufferFactory().wrap(resJson.getBytes());
        return response.writeWith(Flux.just(dataBuffer));//响应json数据
    }

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

跨域:

由于 gateway 使⽤的是 webflux ,⽽不是 springmvc ,所以需要先关闭 springmvc cors ,再从gateway filter ⾥边设置 cors 就⾏了。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

@Configuration
public class CorsConfig {
    //处理跨域
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

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

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

相关文章

D-018 LED硬件电路设计

LED硬件电路设计1 简介2 LED的参数3 驱动方式3.1 定电压驱动3.2 定电流驱动4 应用场景5 设计要点1 简介 发光二极管&#xff08;简称LED&#xff09;,是一种发光的电子器件&#xff0c;能将电能转换为光能。这种器件不仅发光效率高&#xff0c;而且节能、寿命长。LED会议波长来…

SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)

代码资源位置&#xff1a;F:\workspace\SpringMVC代码\springMVC-demo4 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c;即&#xff0c;将服务器看作是由很多离散的资源组…

C语言 指针与数组

C语言 指针与数组引言1. 指针与数组之间的联系2. 指针与字符串之间的联系一、指针与数组1. 对比两者的区别2. 指针数组的用法3. 数组指针的用法二、数组参数、指针参数1. 一维数组传参2. 二维数组传参三、指针与函数 (了解)1. 其实函数也有地址2. 函数指针3. 函数指针数组4. qs…

03_SpringBoot项目配置

文章目录SpringBoot项目配置0x01_properties格式配置文件0x02_yml格式配置文件配置对象类型数据配置集合类型配置数组类型0x03_properties和yml的区别优先级区别0x04_配置文件在项目中的位置0x05_bootstrap配置文件0x06_springboot项目结构SpringBoot项目配置 SpringBoot默认读…

Mysql数据库和SQL语句

一、数据库介绍&安装 1. 什么数据库软件 在前期学习的过程中&#xff0c;对于数据的保存方式有两种体现&#xff1a; 一种是将数据保存到本地的文件中&#xff0c;优点是可以持久保存&#xff0c;但是数据管理查询等相当麻烦。 一种是将数据保存到本地的内存中&#xff0c…

Linux学习记录——삼 基本指令(3)及了解权限

接着上一篇把一些基本命令写完 unzip解压默认解压到当前目录&#xff0c;加上-d后面跟路径就可以解压到指定目的地 tar指令 不同文件格式的压缩指令&#xff0c;可以直接看内容&#xff0c;不需要打开。tar后面有几个指令选项。-c表示创建压缩文件&#xff0c;-z打包并压缩&am…

E. Matrix and Shifts(思维+遍历正对角线)

Problem - 1660E - Codeforces 你会得到一个大小为nn的二进制矩阵A。行从上到下从1到n编号&#xff0c;列从左到右从1到n编号&#xff0c;位于第i行和第j列交点的元素称为Aij。考虑一组4个操作。 循环地将所有行向上移动。索引为i的行将被写在i-1行的位置上&#xff08;2≤i≤…

文件权限概念,相关操作

一&#xff0c;文件权限的基本概念 权限&#xff1a;操作系统限制对资源访问的一种机制。 文件权限的信息展示&#xff0c;使用ls -l 命令即可查看&#xff1a; 整个文件信息可以分为以下几部分&#xff1a; &#xff08;一&#xff09;第一个字段表示文件类型 和 文件权限。…

Socket套接字编程

文章目录1、网络字节序列2、socket编程接口<1>socket常见ARI<2>sockaddr结构 VS sockaddr_in结构3、UDP套接字4、TCP套接字5、总结1、网络字节序列 内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏 移地址也有大端小端…

腾讯T9纯手写基于Mycat中间件的分布式数据库架构笔记

随着移动互联网的兴起和大数据的蓬勃发展&#xff0c;系统的数据量正呈几何倍数增长&#xff0c;系统的压力也越来越大&#xff0c;这时最容易出现的问题就是服务器繁忙&#xff0c;我们可以通过增加服务器及改造系统来缓解压力&#xff0c;然后采用负载均衡、动静分离、缓存系…

流媒体传输 - RTSP Over HTTP

RTSP 的标准端口是 554&#xff0c;但是由于各种不同的防火墙等安全策略配置的原因&#xff0c;客户端在访问 554 端口时可能存在限制&#xff0c;从而无法正常传输 RTSP 报文。 但是 HTTP 端口&#xff08;80 端口&#xff09;是普遍开放的&#xff0c;于是就有了让 RTSP 报文…

【Android App】给三维的地球仪贴上动物贴纸实战(附源码和演示 超详细必看)

需要源码和图片集请点赞关注收藏后评论区留言~~~ 一、纹理贴图 给三维物体穿衣服的动作&#xff0c;通常叫做给三维图形贴图&#xff0c;更专业地说叫纹理渲染。 渲染纹理的过程主要由三大项操作组成&#xff0c;分别说明如下&#xff1a; &#xff08;1&#xff09;启用纹理…

STL的常用遍历算法(20221128)

STL的常用算法 概述&#xff1a; 算法主要是由头文件<algorithm> <functional> <numeric> 组成。 <algorithm>是所有STL头文件中最大的一个&#xff0c;涉及比较、交换、查找、遍历等等&#xff1b; <functional>定义了一些模板类&#xff0…

2022VR高级研修班总结

本人有幸参加2022VR高级研修班&#xff0c;此次高级研修班由赵沁平院士和丁文华院士领衔&#xff0c;全国知名专家及长期在相关领域从事产业、管理、科研工作的专家参与&#xff0c;带来了18个专题讲座&#xff0c;内容涵盖虚拟现实技术与系统现状与发展、产学研合作与产业协同…

都什么年代了,你居然还连不上GitHub?

前言 众所周知&#xff0c;GitHub是我们程序员在上班或者学习的时候经常会逛的一个地方[手动狗头]&#xff0c;而且如果我们想参与开源项目的话&#xff0c;GitHub也是一个很好的平台。 可问题是&#xff0c;GitHub网页总是进不去&#xff0c;提交代码到GitHub也总是超时&…

在Navicat上如何停止正在运行的MYSQL语句

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;正文 1. 图形化停止SQL 2. 用SQL方式停止运行的SQL &#xff08;1&#xff09;找到运行的SQL的ID &#xff08;2&#xff09;运行kill命令杀掉SQL &#xff08;一&#xff09;前言 众所周知&#xff0c;…

BI数据分析软件有哪些?为什么说奥威BI很特别?

经过十几年的发展&#xff0c;以及近几年国家的大力鼓励发展大数据智能产业等原因&#xff0c;BI数据分析软件开始越来越被大家所熟知&#xff0c;那么BI数据分析软件都有哪些&#xff0c;为什么说奥威BI数据分析软件很特别&#xff1f;它对企业的大数据智能数据可视化分析起到…

什么样的人最适合做软件测试---喜欢找人帮忙办事的人

今天和大家说下什么样类型的人适合做软件测试。 经验干货&#xff0c;可仔细品 很多测试工程师面试中也可能会遇到问题&#xff0c;说怎么做一名优秀合格的测试工程师&#xff0c;需要有哪些品质&#xff0c;很多人会回答说要仔细&#xff0c;要承受压力&#xff0c;要有责任感…

2013-2020年全国31省数字经济数据集

1、时间&#xff1a;2013-2020年 2、来源&#xff1a;整理自国家统计J和统计NJ 3、指标包括&#xff1a; 信息化基础&#xff1a;"光缆线路长度(公里)、移动电话基站&#xff08;万个&#xff09;、信息传输、软件和信息技术服务业城镇单位就业人员(万人)、年末常住人口…

Android-P夜间模式

0 前言 Android-P可通过“Developer options > Night mode”打开夜间模式&#xff0c;本文研究其配置和效果。 验证环境&#xff1a;Pixel 3a、模拟器 1 设置 图1.1 Night mode上图对应XML配置如下&#xff1a; <ListPreferenceandroid:key"dark_ui_mode"and…