浅谈Spring Cloud Gateway

news2024/11/14 11:21:20

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

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

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;
    }
}

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

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

相关文章

leetcode62. 不同路径(动态规划-java)

不同路径 leetcode62. 不同路径题目描述暴力递归代码演示 递归加缓存代码演示 动态规划代码演示 动态规划专题 leetcode62. 不同路径 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/unique-paths 题目描述 一个机器人位…

leetcode863. 二叉树中所有距离为 K 的结点(java)

二叉树中所有距离为 K 的结点 leetcode863. 二叉树中所有距离为 K 的结点题目描述 DFS 深度优先遍历代码演示 二叉树专题 leetcode863. 二叉树中所有距离为 K 的结点 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/all-…

英之剑法——第一境(通达人与物之境)

&#x1f31f;博主&#xff1a;命运之光 ☀️专栏&#xff1a;英之剑法&#x1f5e1; ❤️‍&#x1f525;专栏&#xff1a;英之试炼&#x1f525; ☀️博主的其他文章&#xff1a;点击进入博主的主页 &#x1f433; 开篇想说的话&#xff1a;开学就大三了&#xff0c;命运之光…

永磁同步电机在线参数辨识综述

优点 实时性&#xff1a;在线参数辨识能够在电机实际运行时进行参数估计&#xff0c;可以实时地获取电机的参数信息。这使得在线参数辨识更适用于需要实时调节和优化电机控制策略的应用场景。 动态适应性&#xff1a;在线参数辨识可以根据电机的实时工作状态和环境变化来动态地…

最“赚钱”编程语言出炉,惊到我了.....

Stack Overflow 发布了 2023 年开发者调查报告&#xff0c;据称共计超过 9 万名开发者参与了此次调查。 完整报告包含了受访开发者画像&#xff0c;以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于开发技术和 AI 的部分。 懒人目录&#xff1a; 最流行编程语…

[皮尔逊相关系数corrwith]使用案例:电影推荐系统

协同过滤算法用于发现用户与物品之间的相关性&#xff0c;主要有两种&#xff1a;基于用户的和基于物品的。 基于用户&#xff1a; 用户1购买了物品A、B、C、D&#xff0c;并给了好评&#xff1b;而用户2也买了A、B、C&#xff0c;那么认为用户1和用户2是同类型用户&#xff…

hello算法笔记之堆

堆&#xff1a; 一种满足特定条件的完全二叉树&#xff0c;可分为两种类型&#xff1a; 「大顶堆 Max Heap」&#xff0c;任意节点的值 ≥其子节点的值&#xff1b;「小顶堆 Min Heap」&#xff0c;任意节点的值 ≤ 其子节点的值&#xff1b; 将二叉树的根节点称为「堆顶」&a…

p5模型详解

1.研究动机 推荐系统种类繁多&#xff0c;user、item特征集合可以共享&#xff0c;特定架构特定任务使得各任务间无法迁移。 语言可以描述万物&#xff0c;可以作为推荐系统的中间桥梁&#xff0c;受到prompt学习的影响&#xff0c;本文提出了text-to-text框架&#xff0c;称…

【openGauss数据库配置运行参数】--略有小成

【openGauss数据库配置运行参数】--略有小成 &#x1f53b; 一、查看参数值&#x1f530; 1.1 使用SHOW命令查看&#x1f530; 1.2 使用pg_settings视图查看 &#x1f53b; 二、openGauss的六类GUC参数&#x1f53b; 三、重设运行参数&#x1f530; 1.3 重设参数的几种方式&…

5.0、Java_IO流 - IO流类的基本体系结构

5.0、Java_IO流 - IO流类的基本体系结构 Java 为我们提供了多种多样的 IO 流&#xff0c;我们可以根据不同的功能以及性能要求挑选合适的 IO 流&#xff1b; 下图为 Java 中 IO 流类的基本体系结构&#xff08;这里只列举出一些常用的类&#xff0c;详情可以参考 JDK API 文档&…

闭门造轮(LVGL_1)

参考的课程&#xff1a; 全志韦东山的课程&#xff1a;https://www.100ask.net/p/t_pc/course_pc_detail/column/p_61c5a317e4b0cca4a4e8b6f1?product_idp_61c5a317e4b0cca4a4e8b6f1 例程1_// 基础对象(lv_obj)&#xff0c;"Hello, LVGL!" void lvgl_demo(void) …

用平衡因子实现-AVL树

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…

UE5《Electric Dreams》项目PCG技术解析 之 基于关卡PCGSettings的工作流

程序化内容生成框架(Procedural Content Generation Framework,下文简称PCG)可谓是UE5.2版本中最令人瞩目的新技术之一&#xff0c;老王也是在第一时间就关注了这个技术&#xff0c;以前尝试过用Houdini来实现UE5中的程序化内容生成&#xff0c;感觉还是很蹩脚的&#xff0c;毕…

无线发射功率

无线电发射功率 无线电发射机输出的射频信号&#xff0c;通过馈线&#xff08;电缆&#xff09;输送到天线&#xff0c;由天线以电磁波形式辐射出去。电磁波到达接收地点后&#xff0c;由天线接收下来&#xff08;仅仅接收很小很小一部分功率&#xff09;&#xff0c;并通过馈…

Linux系统编程(再论execve)

文章目录 前言一、execve的第三个参数二、进程空间三、命令行参数规范四、optstring规则的扩展定义总结 前言 本篇文章我们继续来研究一下execve这个系统调用&#xff0c;上篇文章已经讲解了前两个参数的意义了&#xff0c;那么这篇文章就来讲解一下第三个参数的具体含义。 一…

三分钟学习一个python小知识4-----------我的对python中numpy的理解, 我列举了关于numpy常用的10个例子来深入理解numpy

这里写目录标题 1、NumPy是什么2、NumPy的常见应用---必须掌握2.1.创建一个数组2.2.数组的属性2.3.取数组中的元素2.4.数组的运算2.5.数组的转置2.6. 数组的索引和切片2.7. 数组的重塑2.8. 数组的广播2.9. 数组的聚合操作2.10. 数组的排序 总结 1、NumPy是什么 NumPy是专门用于…

vue+elementui实现app布局小米商城,样式美观大方,功能完整

目录 一、项目效果在线预览 二、效果图 1.首页效果图 2.分类&#xff0c;动态分类商品数据根据所属分类动态切换 3.购物车&#xff0c;动态添加购物车&#xff08;增、删、改、查&#xff09; 4.我的 5.登录注册 6.商品详情 7.搜索&#xff08;动态模糊搜索、搜索历史…

12---整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例…

文件上传漏洞-用骗子的角度分析

&#xff08;一&#xff09;文件上传漏洞 文件上传漏洞&#xff0c;发送在用户上传文件功能中&#xff0c;很多网址都对上传的文件格式进行限制&#xff0c;但是被攻击机者找到漏洞&#xff0c;把木马、病毒进行上传&#xff0c;然后控制服务器。对上传的文件格式不是不限制&a…

MySQL实战解析底层---为什么这些SQL语句逻辑相同,性能却差异巨大

目录 前言 案例一&#xff1a;条件字段函数操作 案例二&#xff1a;隐式类型转换 案例三&#xff1a;隐式字符编码转换 前言 在MySQL中&#xff0c;有很多看上去逻辑相同&#xff0c;但性能却差异巨大的SQL语句对这些语句使用不当的话&#xff0c;就会不经意间导致整个数据…