十五、Gateway网关

目录

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="张三"

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

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

 

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

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

相关文章

Reed-Muller序列

Reed-Muller函数的由来 我们知道对于连续信号&#xff0c;时间和频率是对偶域(duality)&#xff0c;其中正弦函数是时移的特征函数&#xff08;where sinusoids are eigenfunctions of time shifts&#xff09;。而在汉明空间(Hamming space)中&#xff0c;there are discrete…

【软考|软件设计师】某计算机系统的CPU主频为2.8GHz

目录 题&#xff1a; CPI MIPS 题&#xff1a; 某计算机系统的CPU主频为2.8GHz。某应用程序包括3类指令&#xff0c;各类指令的CPI &#xff08;执行每条指令所需要的时钟周期&#xff09;及指令比例如下表所示。执行该应用程序时 的平均CPI为______&#xff1b; 运算速度…

ASP.NET Core 8 中身份验证的改进

ASP.NET Core 团队正在改进 .NET 8 中的身份验证、授权和身份管理(统称为“身份验证”)。新的 APIs 将使自定义用户登录和身份管理体验变得更加容易。新的端点将在没有外部依赖的单页应用程序(SPA)中启用基于令牌的身份验证和授权。我们还将改进我们的指引和文档&#xff0c;使…

基于SSM+JSP的人体健康信息管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

JMeter入门配置

目录 场景&#xff1a; 环境及工具 &#xff1a; JMeter中文配置&#xff1a; 配置登录接口&#xff1a; 配置响应结果&#xff1a; 配置json提取器 测试json提取器 配置Beanshell后置处理器&#xff1a; http请求右键-->添加---->后置处理器--->Beanshell后置处理…

第五章 面向对象-7.hashCode()和toString()

hashCode()和toString() hashCode() hashCoed 的特性&#xff1a; &#xff08;1&#xff09;HashCode的存在主要是用于查找的快捷性&#xff0c;如Hashtable&#xff0c;HashMap等&#xff0c;HashCode经常用于确定对象的存储地址&#xff1b; &#xff08;2&#xff09;如果…

MySQL基础(二十九)数据库的设计规范

1 范式 1.1 范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。可以理解为&#xff0c;一张数据表的设计结 构需要满足的某种设计标准的 级别 。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 1.2 范式都包括哪些 目…

医院内导航及智能导医,医院导诊图怎么制作?

在大型综合性医院&#xff0c;由于专业分工精细&#xff0c;一个诊疗过程涉及的功能单元往往分布在不同的楼宇、不同楼层的不同位置&#xff0c;再加上多数患者对医院环境不熟悉&#xff0c;导致滞院的时间长、诊疗效率低、患者对服务的满意度下降。为解决这一问题&#xff0c;…

空中下载技术(OTA)电控信息安全

随着汽车电子控制系统功能复杂度和数据颗粒度呈阶梯式增加&#xff0c;其发展速度逐渐超越网络安全防护方法、技术和标准的发展&#xff0c;现阶段汽车电子正面临巨大的网络信息安全风险&#xff0c;对功能安全的潜在影响也仍在探索和解决中&#xff0c;信息安全问题已经成为影…

C++ 中到底是应该include .h文件还是应该include .cpp文件

在阅读一个较大的解决方案中&#xff0c;对于其他文件夹下的.h和.cpp文件&#xff0c;有时候#include“XXX.h”文件&#xff0c;有时候是#include“XXX.cpp”文件&#xff0c;而且二者还不能更换。下面就好好分析一下他们二者的区别。 测试 测试&#xff1a;XXX.h和XXX.cpp…

Linux内核(十四)Input 子系统详解 IV —— 配对的input设备与input事件处理器 input_register_handle

文章目录 input_handle结构体详解配对的input设备与input事件处理器实例input核心层对驱动层和事件层之间的框架建立流程图 本文章中与input子系统相关的结构体可参考input子系统结构体解析 input函数路径&#xff1a;drivers/input/input.c input_handle结构体详解 input_ha…

(转)雪花算法(SnowFlake)

简介 现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&#xff0c;多…

第八章结构型模式—装饰者模式

文章目录 装饰者模式解决的问题概念结构 案例使用装配者进行改进 使用场景JDK源码分析 静态代理和装饰者的区别 结构型模式描述如何将类或对象按某种布局组成更大的结构&#xff0c;有以下两种&#xff1a; 类结构型模式&#xff1a;采用继承机制来组织接口和类。对象结构型模式…

【Wi-Fi】802.11/802.11b/802.11g/802.11n/802.11a/802.11ac/802.11ax/802.11be

WiFi发展历史 IEEE 802.11 Protocol Release Date Frequency Band Bandwidth Max Throughput 802.11-1997 1997 2.4GHz 22MHz 2Mbps 802.11b 1999 2.4GHz 22MHz 11Mbps 802.11a 1999 5GHz 20MHz 54Mbps 802.11g 2003 2.4GHz 20MHz 54Mbps 802.11n (W…

计算机组成原理基础练习题第一章

有些计算机将一部分软件永恒地存于只读存储器中&#xff0c;称之为&#xff08;&#xff09; A.硬件    B.软件C.固件    D.辅助存储器输入、输出装置以及外界的辅助存储器称为&#xff08;&#xff09; A.操作系统    B.存储器 C.主机      D.外围设备完整的计算机系…

OpenCL编程指南-4.1OpenCL C编程

使用OpenCL C编写数据并行内核 OpenCL中的数据并行性表述为一个N维计算域&#xff0c;其中N1、2或3。N-D域定义了可以并行执行的工作项的总数。下面通过一个简单的例子来了解如何用OpenCL C编写一个数据并行内核&#xff0c;将两个浮点数数组相加。这个代码的串行版本求和时需…

力扣19删除链表的倒数第 N 个结点:思路分析+图文全解+方法总结(快慢指针法递归法)+深入思考

文章目录 第一部分&#xff1a;题目描述第二部分&#xff1a;代码实现2.1 快慢指针法2.2 递归 第一部分&#xff1a;题目描述 &#x1f3e0; 链接&#xff1a;19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; ⭐ 难度&#xff1a;中等 第二部分&#…

lol由于找不到vcruntine140_1.dll文件,vcruntime140_1.dll修复方法

家人们有没有遇到过打开游戏或者软件提示由于找不到vcruntime140_1.dll&#xff0c;无法继续执行此代码的情况&#xff0c;是不是不知道怎么修复呢&#xff1f;Vcruntime140_1.dll是一个Windows系统文件&#xff0c;它是Microsoft Visual C Redistributable for Visual Studio …

【嵌入式环境下linux内核及驱动学习笔记-(11-设备树)】

目录 1、设备树体系1.1 DTS /DTSI / DTC / DTB 2、基础语法2.1 节点语法2.1.1 通用名称建议 2.2 属性语法2.2.1 属性值 2.3 关于label2.4 节点的[unit-address] 与reg属性2.5 根节点 /2.6 标准属性compatible2.6.1 of_machine_is_compatible函数 2.7 地址编码2.7.1 标准属性#ad…

RabbitMQ养成记 (3.MQ的简单工作模式 和 Pub/sub 订阅模式)

上一篇是一个简单的helloworld。 我们直接发直接收 这种是最简单的。 下面我们再来接触更加复杂一点&#xff1a; 简单工作模式 work queues 工作队列模式&#xff1a; 这里注意 这里的消息 对两个消费者 c1 c2来说是竞争关系 而不是等份分发关系&#xff0c; 就像两个线程…