spring cloud Gateway网关

news2024/11/17 12:37:24

        网关是将所有面向用户的服务接口统一管理的代理服务器,所有内部服务的远程调用都是在局域网内部,而网关是在公网中。

一、依赖

        通过访问网关调用项目中的服务,需要使用Eureka,网关服务器需要在Eureka服务注册它自己,本身也就是一个Eureka Client。

        远程调用服务自然也离不开熔断降级的保护机制,使用Hystrix

        网关是对所有访问的统一入口,面对恶意攻击,大量并发的情况,通常使用令牌桶机制来处理,令牌储存在redis中。

        

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>


 


二、基本配置

gateway解析自己配置时,- 代表了创建一个对象: 

        id: 路由名称

        uri:  调用的服务主机名

        predicates:代理地址 

                  代理本身只解析主机名ip端口号,和代理地址做拼接,需要手动将/abc去除。

                  Vue3中代理配置也一样:      

        Filter:

                因为所有Filter都以GatewayFilterFactory结尾,所有该结尾省略不写。

                - StripPrefix=1

                          //简写形式  name =StripPrefixGatewayFilterFactory,参数为1

                - name: RequestRateLimiter  //通用的写法

                  args:...

server:
  port: 9999
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
spring:
  redis:
    host: localhost
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false
          lower-case-service-id: true
      routes:
        - id: rateLimiter
          uri: lb://application-service
          predicates:
            - Path=/abc/**
          filters:
            - StripPrefix=1

 



三、令牌桶过滤器

        实现KeyResolver接口的resolve()方法

@Component
public class MyKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        String ip = exchange.getRequest()
                .getRemoteAddress()
                .getAddress()
                .getHostAddress();
        return Mono.just(ip);
    }
}
          filters:
            - StripPrefix=1

            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' # 表达式, #{} 从容器找对象, @beanId
                redis-rate-limiter.replenishRate: 1 # 每秒令牌生成速率
                redis-rate-limiter.burstCapacity: 2 # 令牌桶容量上限


四、熔断降级过滤器

                配置HystrixGatewayFilterFactory对象,自定义降级的uri

          filters:
            - StripPrefix=1

            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' # 表达式, #{} 从容器找对象, @beanId
                redis-rate-limiter.replenishRate: 1 # 每秒令牌生成速率
                redis-rate-limiter.burstCapacity: 2 # 令牌桶容量上限

            - name: Hystrix
              args:
                name: fallback # 随意定义的名称。相当于@HystrixCommand注解中的commandKey属性。
                fallbackUri: forward:/fallback # 如果转发


五、全局过滤器和自定义过滤器:

        全局过滤器:

                实现GlobalFilter的filter()方法

@Component
public class MyGlobalFilter implements GlobalFilter {
    /**
     * 过滤方法。
     * 实现上,只有唯一的要求。必须调用方法chain.filter(exchange),并把方法的返回值,返回。
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("前置全局过滤");
        Mono<Void> result = chain.filter(exchange);
        System.out.println("后置全局过滤");
        return result;
    }
}

         自定义过滤器:

                1.仿照其他Gateway提供的过滤器,创建一个LoggerFilterGatewayFilterFactory继承AbstractGatewayFilterFactory<LoggerFilterGatewayFilterFactory.Config>

@Component
public class LoggerFilterGatewayFilterFactory
        extends AbstractGatewayFilterFactory<LoggerFilterGatewayFilterFactory.Config> {

    /**
     * 建议提供2个构造方法。一个无参数。一个有参数,参数类型就是当前类型中的Config静态内部类的类对象类型。
     * 父类型,可以帮助解析配置文件,并创建Config对象。
     */
    public LoggerFilterGatewayFilterFactory(){
        this(Config.class);
    }

    public LoggerFilterGatewayFilterFactory(Class<Config> configClass){
        super(configClass);
    }

    /**
     * 如果需要简化配置方案。提供方法shortcutFieldOrder
     * 有当前方法,配置文件使用,可以简化配置为    LoggerFilter=abc
     * 没有当前方法,配置文件完整编写,内容是:
     *   name: LoggerFilter
     *   args:
     *     remark: abc
     */
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("remark");
    }

    /**
     * 创建网关过滤器的方法。
     * @param config 就是配置文件中的内容,就是当前类型中的静态内部类对象。
     * @return 一般使用匿名内部类,创建GatewayFilter接口的实现对象。
     */
    @Override
    public GatewayFilter apply(Config config) {

        return new GatewayFilter() {
            /**
             * 过滤方法。要求必须调用chain.filter(exchange),并返回方法的返回结果
             * @param exchange
             * @param chain
             * @return
             */
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                System.out.println("前置 - 日志过滤器 - config.remark = " + config.getRemark());
                Mono<Void> result = chain.filter(exchange);
                System.out.println("后置 - 日志过滤器 - config.remark = " + config.getRemark());

                return result;
            }
        };
    }

    /**
     * 定义静态内部类,作为配置对象
     * 定义的每个属性,都是用于在配置文件中配置的对应属性。
     * 必须提供getter和setter方法。
     */
    public static class Config{
        private String remark;

        public String getRemark() {
            return remark;
        }

        public void setRemark(String remark) {
            this.remark = remark;
        }
    }
}

        2.配置文件编写该自定义过滤器对象配置信息

          filters:
            - StripPrefix=1

            - name: RequestRateLimiter
              args:
                keyResolver: '#{@myKeyResolver}' # 表达式, #{} 从容器找对象, @beanId
                redis-rate-limiter.replenishRate: 1 # 每秒令牌生成速率
                redis-rate-limiter.burstCapacity: 2 # 令牌桶容量上限

            - name: Hystrix
              args:
                name: fallback # 随意定义的名称。相当于@HystrixCommand注解中的commandKey属性。
                fallbackUri: forward:/fallback # 如果转发

            - name: LoggerFilter
              args:
                remark: fullyTestGatewayFilter

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

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

相关文章

【C++报错已解决】std::ios_base::floatfield

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

The 2024 CCPC Online Contest (C I J三题思路)

写在前面 因为学弟已经问了几个题了&#xff0c;于是乎这场没有vp&#xff0c;准备直接开写了 题目 C. 种树&#xff08;树形dp&#xff09; 题解 只有两种情况&#xff0c; 一种是1-2-3&#xff0c;1是2的父亲&#xff0c;2是3的父亲 另一种是1-2-3&#xff0c;2同时是1…

新手如何使用Qt——方法使用

前言 那么这篇文章其实是我在使用Qt的过程当中呢&#xff0c;我发现在Qt使用过程中&#xff0c;在我理解信号和槽这个概念后&#xff0c;在编写槽函数数的时候&#xff0c;发现了自身存在的问题&#xff0c;我的难点是在于当我在编写槽函数的时候&#xff0c;我知道这个槽函数是…

GD32片内flash读写数据

如有技术问题及技术需求请加作者微信! GD32片内Flash的读写数据是微控制器编程中的常见任务,主要用于存储程序代码、配置参数或用户数据等。以下将详细介绍GD32片内Flash的读写数据方法和程序。 一、GD32 Flash的基本特性 存储空间划分:GD32的Flash存储空间通常分为主存储块…

W39-02-jmeter中如何实现:下一个请求是需要根据前一个请求返回值进行循环请求

业务压测需求&#xff1a; 查询和上报接口&#xff0c; 1.查询接口返回的数据有好几条需要上报的数据 2.查询接口中返回的每条数据中&#xff0c;有两个字段需要传递到上报接口 3.查询接口中&#xff0c;这两个字段一个为int型&#xff0c;一个为数组[1,2,3,4] 实现方式 …

大模型算法岗常见面试题100道(非常详细)零基础入门到精通,收藏这一篇就够了

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等等&#xff0c;正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个&#xff0c;在大模型纵横的时代&#xff0c;不…

2条件欧几里得聚类

条件欧几里得聚类 本教程介绍如何使用类&#xff1a; 一种分割算法&#xff0c;根据欧几里得距离和需要保持的用户可自定义条件对点进行聚类。pcl::ConditionalEuclideanClustering 此类使用与 Euclidean Cluster Extraction、Region growing segmentation 和 Color-based …

以太网交换安全:端口隔离

一、端口隔离 以太交换网络中为了实现报文之间的二层广播域的隔离&#xff0c;用户通常将不同的端口加人不同的 VLAN大型网络中&#xff0c;业务需求种类繁多&#xff0c;只通过 VLAN实现报文的二层隔离&#xff0c;会浪费有限的VLAN资源。而采用端口隔离功能&#xff0c;则可…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL66

超前进位加法器 描述 题目描述&#xff1a; 求两个四位的数据编写一个四位的超前进位加法器&#xff0c;建议使用子模块 提示&#xff1a;超前进位加法器的位公式如下 这里‘’ ‘’符号不是‘加’和‘乘’&#xff0c;是‘或’和 ‘与’ 波形示意图&#xff1a; 输入…

履带机器人运动模型分析

履带机器人运动学模型分析 滑动转向 履带机器人单侧履带可等效视为“无穷多个小轮子”&#xff0c;且这单侧的“无穷多个小轮子”的“转速”是一致的。所以&#xff0c;履带式机器人的转向方式和四轮驱动机器人(SSMR)的是一致的&#xff0c;也是滑动转向。 因此&#xff0c;下…

供应链 | 顶刊POMS论文精读:交易成本经济学(TCE)——供应链效率理论

编者按 供应链效率提升指南&#xff1a;不可不知的TCE理论视角 本文为Production and Operations Management 期刊论文&#xff0c;原文信息&#xff1a; Ketokivi, M., & Mahoney, J. T. (2020). Transaction cost economics as a theory of supply chain efficiency. …

CentOS 替换 yum源 经验分享

视频教程在bilibili:CentOS 替换 yum源 经验分享_哔哩哔哩_bilibili问题原因 解决方法 1. 进入镜像目录 [rootlocalhost ~]# cd /etc/yum.repos.d/ 2.备份文件 [rootlocalhost yum.repos.d]# rename repo bak * 3.寻找阿里镜像源复制 https://developer.aliyun.com/mirror/ …

文件操作Tips,一次搞懂Python中open与with open的差异

前几天在群里看到&#xff0c;有小伙伴在问&#xff0c;为什么代码中打开文件有的时候用open&#xff0c;有的时候用with open&#xff0c;一会close&#xff0c;一会又没有close&#xff0c;真让人摸不着头脑。我们来看一看&#xff0c;这究竟是怎么回事。 在Python中&#xf…

前端测试最强教程 - 实现 fake http 和 fake db

因为想要写出完美的测试&#xff0c;我们就需要模拟各种接口状态&#xff0c;各种动态数据&#xff0c;要求再高点甚至需要模拟鉴权&#xff0c;那这就不是简单的覆盖方法可以实现的。 所以我们需要一些第三方依赖&#xff0c;下面介绍一下实现步骤。 实现步骤 step 1: 新增…

JSP 的 request 内置对象

文章目录 前言一、request 内置对象是什么&#xff1f;二、request 对象 1.访问请求参数2.在作用域中管理属性3.获取 cookie4.解决中文乱码5.获取客户端信息6.显示国际化信息总结 前言 我们在学习 JavaScript 的时候有了解过常用对象&#xff0c;这些对象可以在这门脚本语言中全…

java项目之作业管理系统设计与实现源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的作业管理系统设计与实现源码。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 作业管理系统…

怎么选择一款适合自己的蓝牙耳机?2024开放式耳机选购指南

在选择开放式耳机时&#xff0c;可以从以下几个要点着手&#xff1a; 佩戴舒适程度&#xff1a; 耳挂的设计&#xff1a;好的耳挂设计能让耳机稳稳地戴在耳朵上&#xff0c;且不会给耳部造成过多压迫。比如有些耳机配备了可调节的耳挂&#xff0c;能依照不同人的耳型和佩戴习…

WordPress 要求插件开发人员进行双因素身份验证

全球超过40%的网站由 WordPress 提供支持&#xff0c;其庞大的插件和主题生态系统在全球范围内提供了灵活性和定制性。然而&#xff0c;这种受欢迎程度也使其成为网络攻击的主要目标。 WordPress 将为所有插件和主题开发人员引入强制性双因素身份验证 (2FA)&#xff0c;以应对…

Vue3动态导入后端路由

动态获取文件 // modules就是一个map&#xff0c;文件路径作为key&#xff0c;文件对象作为value const modulesimport.meta.glob(../views/**/*.vue)获取到的modules对象如下&#xff1a; 添加动态路由 import {createRouter, createWebHashHistory} from vue-routerconst m…

Vue项目开发注意事项

事项一&#xff1a;项目代码放在本地怎么运行起来 1、首先确定项目对应的node和npm版本 node下载地址 Index of /dist/https://nodejs.org/dist/ node 与 npm版本对应关系 Node.js — Node.js Releases 2、node卸载的时候&#xff0c;会自动把对应的npm卸载掉 情况1&…