浅谈Spring Cloud Gateway

网关:用户和微服务的桥梁

网关的核心是一组过滤器,按照先后顺序执行过滤操作。

Spring Cloud Gateway是基于webFlux框架实现,而webFlux框架底层则使用了高性能的Reactor模式通信框架的Netty

Spring Cloud Gateway是Spring Cloud生态系统中的一个API网关,它基于Spring Framework 5,Spring Boot 2和Project Reactor等技术栈构建。它提供了一种简单而有效的方式来路由请求,以及对请求进行过滤和转换。

Spring Cloud Gateway的主要特点包括:

轻量级:Spring Cloud Gateway是一个轻量级的API网关,它可以快速启动和部署。

动态路由:Spring Cloud Gateway支持动态路由,可以根据请求的路径和参数将请求路由到不同的服务实例。

过滤器:Spring Cloud Gateway提供了一系列的过滤器,可以对请求进行过滤和转换,例如添加请求头、修改请求路径等。

集成性:Spring Cloud Gateway可以与Spring Cloud Config、Spring Cloud Discovery等组件集成,可以实现动态配置和服务发现。

响应式编程:Spring Cloud Gateway基于Project Reactor实现,可以实现响应式编程,提高系统的吞吐量和性能。

Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

Gateway Filter针对某一个路由filter对某一个接口做限流

Global Filter 针对全局的filter token ip黑名单

Spring Cloud Gateway快速入门

login-service

 

application.yml

server:
  port: 8081
spring:
  application:
    name: login-service

eureka:
  client:
    service-url: #指定server注册地址
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true
    fetch-registry: true
    registry-fetch-interval-seconds: 5
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名+应用名+端口号

gateway-service

application.yml

server:
  port: 8089 #网关
spring:
  application:
    name: gateway-service
  cloud:
      inetutils:
        ignored-interfaces: 'VMware Virtual Ethernet Adapter for VMnet1,VMware Virtual Ethernet Adapter for VMnet8'
      gateway:
        enabled: true #默认ture
        routes:
            - id: login_service_route
              uri: http://localhost:8081
              predicates:
                - Path=/doLogin  #匹配规则
eureka:
  client:
    service-url: #指定server注册地址
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true
    fetch-registry: true
    registry-fetch-interval-seconds: 5
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port} #主机名+应用名+端口号

 

Gateway路由配置方式

eureka、gateway、configserver auth-server

静态路由

配置文件路由

官方提供代码配置

https://spring.io/projects/spring-cloud-gateway

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("login", r -> r.path("/doLogin").uri("http://localhost:8081"))
                .route("bili", r -> r.path("/guochuang").uri("https://www.bilibili.com/"))
                .build();

    }

}

动态路由

需要添加eureka-client依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

application.yml添加如下内容

discovery:
  locator:
    enabled: true #开启动态路由  通过应用名称 找到服务功能
    lower-case-service-id: true #开启服务名小写

login-service添加eureka-client

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

 

Gateway过滤器

过滤器生命周期分类

Pre在业务逻辑之前

Post在业务逻辑之后

过滤器种类分类

GatewayFilter 需要配置路由,才能过滤。如果需要使用全局路由,需要配置Default Filters

作用:1、记录接口访问次数 2.限流操作

globalFilter 针对全局 针对每个路由

作用:1、黑名单校验 2、全局token校验 3、参数校验

@Component
public class MGlobalFilter implements GlobalFilter, Ordered {

    /**
     * 过滤方法
     *
     * @param exchange
     * @param chain 放行
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        
        //获取请求响应,header url 参数
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
        HttpHeaders headers = request.getHeaders();
        System.out.println("路径:"+path+" 请求头:"+headers);
        String name = request.getMethod().name();
        System.out.println(name);
        request.getRemoteAddress().getAddress();
        request.getRemoteAddress().getHostName();
        ServerHttpResponse response = exchange.getResponse();

        response.getHeaders().set("content-type","application/json;charset=utf-8");
        HashMap<String,Object> map =new HashMap<>(4);
        map.put("code", HttpStatus.UNAUTHORIZED.value());
        map.put("msg", "未授权登入");
        ObjectMapper objectMapper =new ObjectMapper();
        //把map转成字节
        byte[] bytes = new byte[0];
        try {
            bytes = objectMapper.writeValueAsBytes(map);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //通过buffer工资将字节数组包装成一个数据包
        DataBuffer wrap = response.bufferFactory().wrap(bytes);
        return  response.writeWith(Mono.just(wrap));

        //放行到下一个过滤器
        //return chain.filter(exchange);
    }

    /**
     * 指定顺序的方法
     * 越小优先级越大
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

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

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

相关文章

图解transformer中的自注意力机制

本文将将介绍注意力的概念从何而来&#xff0c;它是如何工作的以及它的简单的实现。 注意力机制 在整个注意力过程中&#xff0c;模型会学习了三个权重:查询、键和值。查询、键和值的思想来源于信息检索系统。所以我们先理解数据库查询的思想。 假设有一个数据库&#xff0c…

使用Servlet完成单表的增删改查功能以及使用模板方法设计模式解决类爆炸问题(重写service模板方法)

使用Servlet做一个单表的CRUD操作 开发前的准备 导入sql脚本创建一张部门表 drop table if exists dept; create table dept(deptno int primary key,dname varchar(255),loc varchar(255) ); insert into dept(deptno, dname, loc) values(10, XiaoShouBu, BeiJing); inser…

Python小游戏集合(开源、开源、免费下载)

Python小游戏集合 0. 前言1. 为什么用Python做游戏2. 小游戏集合及源代码&#xff08;整理不易&#xff0c;一键三连&#xff09;2.1 外星人小游戏2.2 塔防小游戏2.3 三国小游戏2.4 打飞机游戏2.5 飞机大战小游戏2.6 玛丽快跑小游戏2.7 涂鸦跳跃小游戏2.8 猜数字小游戏2.9 坦克…

吃透JAVA的Stream流操作,多年实践总结

在JAVA中&#xff0c;涉及到对数组、Collection等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的方式进行逐个处理&#xff0c;或者使用Stream的方式进行处理。 例如&#xff0c;现在有这么一个需求&#xff1a; 从给定句子中返回单词长度大于5的单词列表&#xf…

求解矩阵行列式因子、不变因子、初等因子、Jordan标准形

首先&#xff0c;我们先来简要了解一下行列式因子、不变因子和初等因子的概念。 下面举例说明。 例1 首先&#xff0c;我们要求 λ I − A λI-A λI−A 然后&#xff0c;我们先求行列式因子。 D 2 ( λ ) D_2(λ) D2​(λ)的求法如下&#xff1a; 然后&#xff0c;我们再求…

Linux文件系统论述

目录 前言 一.磁盘 1.1定义 1.2结构 1.3磁盘的寻找方式 1.4磁盘的逻辑/线性结构 1.5磁盘访问的基本单位 1.6磁盘的管理 二.Linux文件系统 2.1系统结构 2.2属性解析&#xff1a; 2.3inode相关块的解析&#xff1a; 2.4数据块的解析&#xff1a; 前言 学了一段时间的Linux操…

基于Python垃圾短信识别程序(KNN、逻辑回归、随机森林、决策树和多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯等算法进行融合)—含python工程全源码

目录 前言总体设计系统整体结构图请求流程图系统流程图 运行环境Python 环境jieba分词库Scikit-learn 库nginxphp 模块实现1. 前端模块2. 后端模块 系统测试1. 测试结果2. 结果对比3. 可视化部分 工程源代码下载其它资料下载 前言 本项目以Python为基础&#xff0c;旨在开发一…

Docker 安全及日志管理

目录 前言一、Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二、Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三、Docker 架构缺陷与安全机制四、Docker 安全基线标准五、容器相关的常用安全配置方法六、限制流量流向七、镜像安全八、避免Docker 容器中…

rust 集合、错误处理、泛型、Trait、生命周期、包

集合组织特性相同的数据&#xff1b;泛型可以定义任何抽象数据类型&#xff1b;生命周期限制所有权的作用域范围&#xff1b;错误处理使程序更健壮。 集合 一组特性相同的数据集合&#xff0c;除了基本数据类型的元组、数组。rust 标准库提供了一些非常有用的数据结构。 Vec…

短视频seo源码开发部署技术解析

短视频seo开发需要哪些技术 应用程序优化技术&#xff1a;包括应用程序的各种元素&#xff08;如标题、描述、关键字、图标等&#xff09;的优化和设置&#xff0c;以及应用程序内部链接和导航的合理布局和设置。 视频内容优化技术&#xff1a;包括视频标题、描述、标签、封面…

互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

多线程访问共享资源的时候&#xff0c;避免不了资源竞争而导致数据错乱的问题&#xff0c;所以我们通常为了解决这一问题&#xff0c;都会在访问共享资源之前加锁。 最常用的就是互斥锁&#xff0c;当然还有很多种不同的锁&#xff0c;比如自旋锁、读写锁、乐观锁等&#xff0…

django中发送get post请求并获得数据

django中发送get post请求并获得数据 项目结构如下注册路由 urls.py在处理函数中处理请求 views.py进行 get的请求01浏览器 get请求传参数02服务器django get参数解析获取01浏览器 post的发送浏览器get 请求 获取页面返回的 form 发送post请求 带参数 02服务器django的post请求…

【嵌入式Qt开发入门】在Ubuntu下编写C++

在 Ubuntu 上面编写 C&#xff0c;本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World&#xff01;”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim&#xff0c;也就是要求大…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 七、删除分支 八、合并分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能&#…

【面试题12】HTTP协议三次握手和四次挥手分别是什么

文章目录 一、概览二、三次握手2.1 第一步&#xff1a;客户端向服务端发送 SYN&#xff08;同步&#xff09;包2.2 第二步&#xff1a;服务端返回 ACK&#xff08;确认&#xff09;包和 SYN 包2.3 第三步&#xff1a;客户端返回 ACK&#xff08;确认&#xff09;包 三、四次挥手…

【AudioCaps数据集】windows10下载AudioCaps数据集,附百度网盘下载链接

&#x1f525; AudioCaps是从AudioSet数据集中筛选再加工得到的数据集。 AudioCaps数据集的下载使用python的第三方库 audiocaps-download&#xff0c;根据README.md的提示&#xff0c;先进行配置下载环境&#xff1a; &#x1f4e3; AudioCaps的下载环境配置分为四步&#x…

反AI来了…尼康的Natural Intelligence

a mutant_umbrella tree shaped like a nuclear bomb explosion,a photo-realism photograph, 4k, ultra realistic VS a mutant_umbrella tree shaped like a nuclear bomb explosion 尼康发起了一次名为&#xff1a;Natural Intelligence &#xff0c;“不要放弃现实世界”的…

电商--抢购架构总结

文章目录 背景业务流程业务难点技术难点技术方案技术方向具体落地客户端流控网关流控容器流控后端接口流控数据库流控 流控总结优化读取加速异步化流程处理系统扩容 压测监控 总结参考文献 背景 这是个在做NFT电商项目时遇到的场景&#xff0c;要求运营可以商家某个系列的NFT商…

PHP 文心千帆API接口对接

一&#xff1a;API 调用流程简介 创建一个智能云应用。根据实际需求创建智能云应用。创建成功后&#xff0c;获取AppID、API Key、Secret Key 等信息。API 授权。对应用的 AppID 进行授权。获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key &#xff0c…

2023上半年软考系统分析师科目一整理-04

2023上半年软考系统分析师科目一整理-04 企业信息化 企业信息化 企业信息化工程是将( A )相结合&#xff0c;改善企业的经营、管理、产品开发和生产等各个环节&#xff0c;提高生产效率、产品质量和企业的创新能力&#xff0c;从而实现产品设计制造和企业管理的信息化、生产过…