十五、Gateway网关

news2024/10/6 8:31:28

目录

Zuul网关和gateway网关的区别:

Gateway路由配置

1、新建服务网关项目,并在项目pom文件中引入gateway网关依赖

2、在application.yml配置gateway

3、如果不用配置的方式配置gateway路由,还可以通过代码的形式配置

4、启动网关服务,访问localhost:8081/api/goods/goodsInfo

5、服务提供者server-goods

Gateway熔断降级

1、在网关服务项目中引入Hystrix依赖

2、在网关服务项目application.yml中配置以下内容

3、在网关服务项目resource下添加application-hystrix.yml文件配置hystrix信息

4、在网关服务项目中新增一个Controller,配置fallbackUri中的降级方法

5、启动网关服务,再次访问localhost:8081/api/goods/goodsInfo

 6、服务提供者server-goods

Gateway限流

1、在网关服务项目中引入redis-reactive依赖

2、在服务网关项目中修改application.yml激活application-limit.yml的配置

3、在服务网关项目中添加application-limit.yml配置限流条件

4、在网关服务项目中添加名为userKeyResolver的Bean

5、本地启动redis服务,访问localhost:8081/api/goods/goodsInfo?user="张三"


Zuul网关和gateway网关的区别:

Zuul是netflix在2013年开源的网关组件,大规模应用在Netflix的生产环境中,经受了实践考验。它可以与Eureka、Ribbon、Hystrix等组件搭配使用,实现路由转发、负载均衡、熔断等功能。Zuul的核心是一系列过滤器,过滤器简单易于扩展。Zuul基于Servlet构建,使用的是阻塞的IO,引入了线程池来处理请求。每个请求都需要独立的线程来处理,从线程池中取出一个工作线程执行,下游微服务返回响应之前这个工作线程之前一直是阻塞的。

SpringCloud Gateway是SpringCloud的一个全新项目,该项目是基于Spring5.0,SpringBoot2.0和Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。

SpringCloud Gateway作为SpringCloud生态系统的网关,目标是代替Zuul,它是基于Webflux框架实现的,而Webflux框架底层则是使用了高性能的Reactor模式通信框架Netty。

SpringCloud Gateway目标不仅提供统一的路由方式,而且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/指标,限流等。

Gateway路由配置

1、新建服务网关项目,并在项目pom文件中引入gateway网关依赖

<!-- 引入gateway网关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2、在application.yml配置gateway

Gateway配置各字段含义:

id : 我们自定义的路由ID,保持唯一(“-”与id之间有空格)

uri: 目标服务地址,(lb://服务名)lb为load balance负载均衡的意思

predicates: 路由条件,Predicates接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将Predicates组合成其他复杂的逻辑(如:与、或、非)

server:
  port: 8081

spring:
  application:
    name: server-gateway
#配置gateway路由规则
  cloud:
    gateway:
      routes:
        - id: route1 #route ID 自定义
          uri: lb://server-goods #目标服务地址  lb://服务名称
#          uri: http://localhost:8041 #直接指定服务地址
          predicates:  #路由条件
            - Path=/api/goods/**

eureka:
  instance:
  # 使用ip地址作为host,而不是机器号/电脑名称
    prefer-ip-address: true
#    Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
#    超时将剔出该微服务,也可以在Eureka服务端进行设置
    lease-expiration-duration-in-seconds: 2
  client:
    service-url:
      defaultZone: http://localhost:8060/eureka/

3、如果不用配置的方式配置gateway路由,还可以通过代码的形式配置

代码方式项目中用得比较少

 @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder){
        //使用分布的形式创建返回RouteLocator
        RouteLocatorBuilder.Builder routes = builder.routes();
        //指定具体的服务地址
        routes.route("route2",r->{
            return r.path("/api/goods/**").uri("http://localhost:8041");
        });
        //使用lb负载均衡配置服务地址
//        routes.route("route3",r->{
//            return r.path("/api/goods/**").uri("lb://server-goods");
//        });

        return routes.build();

          //使用链式编程一步到位
//        return builder.routes()
//                .route("route2",r->r.path("/api/goods/**")
//                        .uri("lb://server-goods"))
//                .build();
    }

4、启动网关服务,访问localhost:8081/api/goods/goodsInfo

 

在访问网关服务时,由于/api/goods/goodsInfo匹配到了gateway里配置的路由规则/api/goods/**,所以gateway会将请求转发到server-goods服务上去处理,然后在server-goods服务中匹配/api/goods/goodsInfo接口,匹配成功后调用处理逻辑,完成后将结果返回。

如果我们配置路由规则时直接指定了具体的服务器,如上述http://localhost:8041则不需要搭配注册中心使用gateway;相反,如果我们使用lb://server-goods来配置服务地址,则需要搭配注册中心来使用gateway,这样才能将请求负载均衡到server-goods集群的节点中,否则将会无法路由到对应的服务。

5、服务提供者server-goods

@RestController
@RequestMapping("/api/goods")
public class GoodsController {

    @Value("${server.port}")
    private  String port;

    @GetMapping("/goodsInfo")
    public String goodsInfo(){
        return "goodsInfo"+port;
    }
}

Gateway熔断降级

1、在网关服务项目中引入Hystrix依赖

<!-- Hystrix服务保护 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、在网关服务项目application.yml中配置以下内容

使用spring.profiles.active激活application-hystrix.yml配置

server:
  port: 8081

spring:
  application:
    name: server-gateway
  profiles:
    active: hystrix

eureka:
  instance:
  # 使用ip地址作为host,而不是机器号/电脑名称
    prefer-ip-address: true
#    Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
#    超时将剔出该微服务,也可以在Eureka服务端进行设置
    lease-expiration-duration-in-seconds: 2
  client:
    service-url:
      defaultZone: http://localhost:8060/eureka/

3、在网关服务项目resource下添加application-hystrix.yml文件配置hystrix信息

spring:
  cloud:
    gateway:
      routes:
        - id: route1 #route ID 自定义
          uri: lb://server-goods #目标服务地址  lb://服务名称
          predicates:  #路由条件
            - Path=/api/goods/**
          filters:
            -name: Hystrix
             args:
               #指定一个command命令名称
               name: fallbackCmd
               #指定一个降级方法
               fallbackUri: forward:/fallbackMethod

#Hystrix配置
hystrix:
  commond:
    fallbackCmd:
      execution:
        isolation:
          thread:
            timeoutInMillseconds: 2000  #超时2000ms后进入降级服务

配置解释:

过滤器Hystrix,作用是通过Hystrix进行熔断降级。

当上游的请求进入了Hystrix熔断降级机制时,就会调用fallbackUri配置的降级地址,需要注意的是,还需要单独设置Hystrix的CommanKey的超时时间。

4、在网关服务项目中新增一个Controller,配置fallbackUri中的降级方法

@RestController
public class FallbackController {
    
    @GetMapping("/fallbackMethod")
    public Map<String,String> fallbackMethod(){
        HashMap<String, String> response = new HashMap<>(2);
        response.put("code","100");
        response.put("msg","服务暂时不可用");
        return response;
    }  
}

5、启动网关服务,再次访问localhost:8081/api/goods/goodsInfo

 

 6、服务提供者server-goods

@RestController
@RequestMapping("/api/goods")
public class GoodsController {

    @Value("${server.port}")
    private  String port;

    @GetMapping("/goodsInfo")
    public String goodsInfo() throws InterruptedException {
        Thread.sleep(3000);
        return "goodsInfo"+port;
    }
}

修改服务提供者,是其线程休眠3秒,达到hystrix的超时条件,触发fallbackCmd的降级方法。

Gateway限流

限流是高并发场景下比较常用的手段之一,可以有效的保障服务的整体稳定性,Spring Cloud Gateway提供了基于Redis的限流方案

1、在网关服务项目中引入redis-reactive依赖

<!-- Reactive -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

2、在服务网关项目中修改application.yml激活application-limit.yml的配置

server:
  port: 8081

spring:
  application:
    name: server-gateway
  profiles:
    active: limit

eureka:
  instance:
  # 使用ip地址作为host,而不是机器号/电脑名称
    prefer-ip-address: true
#    Eureka客户端向注册中心发送心跳的时间间隔是1s,默认是30s
    lease-renewal-interval-in-seconds: 1
#    Eureka服务端在收到一次心跳后等待时间上限是2s,默认是90s
#    超时将剔出该微服务,也可以在Eureka服务端进行设置
    lease-expiration-duration-in-seconds: 2
  client:
    service-url:
      defaultZone: http://localhost:8060/eureka/

3、在服务网关项目中添加application-limit.yml配置限流条件

spring:
  redis:
    host: 127.0.0.1
    port: 6379
  cloud:
    gateway:
      routes:
        - id: test_limiter_route #route ID 自定义
          uri: lb://server-goods #目标服务地址  lb://服务名称
          predicates:  #路由条件
            - Path=/api/goods/**
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 1
                redis-rate-limiter.burstCapacity: 2
                key-resolver: "#{@userKeyResolver}"

Filter参数说明

name: 名称必须是RequestRateLimiter

redis-rate-limiter.replenishRate: 允许用户每秒处理多少个请求

redis-rate-limiter.burstCapacity: 令牌桶容量,允许在一秒钟内完成的最大请求数
key-resolver: 使用SpEL按名称引用bean

4、在网关服务项目中添加名为userKeyResolver的Bean

@Bean
KeyResolver userKeyResolver(){
    //根据请求参数中的user字段来限流
    return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}

5、本地启动redis服务,访问localhost:8081/api/goods/goodsInfo?user="张三"

快速点击刷新按钮,由于拿不到令牌,所以会导致进不去服务。

而如果访问速度不快的情况下是可以正常访问页面的

 

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

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

相关文章

达梦:创建用户并授予用户只读权限

需求描述&#xff1a; 1.想创建一个用户&#xff0c;这用户能访问其他3个用户的资源&#xff0c;权限是只读&#xff0c;这种创用户的sql怎么写&#xff1f; 2.怎么修改用户密码呢&#xff1f; 环境&#xff1a; 通用机 一、创建用户并授权 1.创建业务用户步骤 step1:创建用户使…

短期光伏发电量短期预测(Python代码,基于LSTM模型)

一.代码流程&#xff08;运行视频&#xff1a;短期光伏发电量短期预测&#xff08;Python代码&#xff0c;基于LSTM模型&#xff09;_哔哩哔哩_bilibili&#xff09; 数据预处理&#xff1a; 读取CSV文件&#xff0c;并使用Pandas库将数据加载到DataFrame中。将时间列转换为日期…

PoseiSwap缘何成DEX赛道新宠?POSE价值分析

区块链技术以去中心化、伪匿名以及公开透明作为主要特点&#xff0c;虽然这种意识形态是具备先进性的&#xff0c;但以此为基础所带来的加密原生特性&#xff0c;也正在阻碍着链上世界的发展。作为一种透明、非许可的分布式网络&#xff0c;隐私与合规始终是现阶段&#xff0c;…

【AWK命令】

目录 一、awk的工作原理&#xff1a;二、命令演示1、按行输出文本2、按字段输出文本1、使用三元运算符 三、通过管道&#xff0c;双引号调用shell命令1、查看时间的命令2、getline 获取内容3、OFS输出分割符4、awk来排序数组 一、awk的工作原理&#xff1a; 1、逐行读取文本&a…

华为OD机试真题 Java 实现【日志采集系统】【2023Q1 100分】

一、题目描述 日志采集是运维系统的的核心组件。日志是按行生成&#xff0c;每行记做一条&#xff0c;由采集系统分批上报。 如果上报太频繁&#xff0c;会对服务端造成压力&#xff1b;如果上报太晚&#xff0c;会降低用户的体验&#xff1b;如果一次上报的条数太多&#xf…

MSQL系列(一) Mysql实战-索引结构 二叉树/平衡二叉树/红黑树/BTree/B+Tree

Mysql实战-索引结构 二叉树/平衡二叉树/红黑树/BTree/BTree 我们在项目中都会使用索引&#xff0c;所以我们要了解索引的存储结构&#xff0c;今天我们就着重讲解下Mysql的索引结构存储模型&#xff0c;并且看下 二叉树&#xff0c;平衡二叉树&#xff0c;红黑树&#xff0c;B…

沉浸式翻译 – 沉浸式的阅读与学习双语的翻译工具

为何称为沉浸式呢 智能识别网页主内容区进行翻译&#xff0c;与同类插件翻译整个网页不同&#xff0c;降低对原网页的“侵入性”&#xff0c;提升阅读体验&#xff0c;因此得名“沉浸式翻译”。 受宠的缘由 自从谷歌翻译不再对大陆用户提供服务后。内心是一阵酸痛的&#xf…

ML之LoR:基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用案例

ML之LoR&#xff1a;基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用案例 目录 基于泰坦尼克号数据集分别利用Platt校准和等距回归校准算法实现概率校准进而提高二元分类模型的预测准确性(模型提效)应用…

网络安全35岁是新时代挑战?

前言 对于一个工作不下于4年的人来说&#xff0c;我觉得我有一定的思考沉淀来回答这个问题。 说说我的一些经历吧。 普通一本毕业&#xff0c;专业是自动化&#xff0c;大学由于挂科太多没拿到学位证到上海找实习&#xff0c;一开始做的是开发&#xff0c;从16年到19年都是做…

如何在线安装Axure插件?

当我们需要进行原型设计时&#xff0c;Axure 成为了专门为此而生的专业级设计产品&#xff0c;也是产品经理必备的工具之一。通过使用 Axure&#xff0c;设计人员可以更好地了解实际项目的实施方式&#xff0c;并与产品经理进行更有效的合作&#xff0c;以评估范围和技术可行性…

HTTP1.1(五)URI编码

一 URI编码 ① ASCII wiki 说明&#xff1a; man ascii 观察 ② 为什么要进行URI编码 RFC3986规定&#xff1a;uri中只允许包含a-zA-Z、0-9、-_.~4个特殊字符以及所有保留字符 URI特殊字符 ③ 保留字符与非保留字符 ④ URI百分号%编码方式 说明&#xff1a; 一般是非…

自学网络安全必经的三个阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

【pytest】html报告修改和汉化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…

算法 DAY59 单调栈2 503.下一个更大元素II 42. 接雨水 84.柱状图中最大的矩形

503.下一个更大元素II 难点在于如何是实现数组的循环 但使用模拟遍历两次的时候注意始终使用index&#xff0c;别出现越界 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;st.push(0);vector<int>…

图和简单图

图的定义 一个图G定义为一个有序对&#xff08;V,E&#xff09;&#xff0c;记为V&#xff08;V,E&#xff09;&#xff0c;其中 V是一个非空集合&#xff0c;称为顶点集或点集&#xff0c;其元素称为顶点或点。E是由V中的点组成的无序点对构成的集合&#xff0c;称为边集&am…

.NET开发问题记录——TransactionScope出错:“与基础事务管理器的通信失败”的解决方法

文章目录 前言问题产生使用TransactionScope进行事务控制 分布式事务&#xff08;Distributed Transaction Coordinator&#xff09;未开启原因该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 System.Transactions.TransactionManagerCommunicationException: 与基础事务…

Reference Doc

场景&#xff1a; reference doc 是springboot官方文档

【C++入门编程常见问题】(小白必看)

常见问题 vsstudio快捷键 快速注释组合键 ctrlk ctrlc 取消注释快捷键 ctrlk ctrl u 支持垃圾回收机制 大多数面向对象编程语言具有垃圾回收机制。早期的C语言不具备垃圾回收机制&#xff0c;这意味着申请的内存资源在使用完成后&#xff0c;需要程序员自己释放。直到C11标…

springcloud-alibaba (01)linux下Nacos单节点安装和部署

Nacos 一&#xff0c;下载解压 Nacos二&#xff0c;使用外部存储器&#xff08;可选&#xff09;三&#xff0c;Nacos配置四&#xff0c;防火墙配置五&#xff0c;启动nacos 一&#xff0c;下载解压 Nacos 首先确保你的系统上已经安装了 Java&#xff0c;可以运行以下命令检查&…

B站C语言学习,颠覆谭浩强C语言,可能是最好的C语言视频 【自用笔记】

文章目录 数据类型字符&#xff0c;整型&#xff0c;浮点型sizeof 展示字节大小 变量 常量变量变量&#xff1a;全局变量 /局部变量变量的使用变量的作用域和生命周期 常量const修饰的常变量#define定义的标识符常量枚举常量 数据类型字符&#xff0c;整型&#xff0c;浮点型si…