环境准备

  • 注册中心Nacos,也可以其他
  • springboot 2.6.8
  • spring-cloud-dependencies 2021.0.3

1.pom依赖

parent包

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.6.8</version>
</parent>

gateway依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--服务注册与发现-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<version>2021.0.1.0</version>
</dependency>
<!--远程服务路由-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

springcloud版本管理

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>2021.0.3</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

2.yaml配置

spring:
  application:
    name: gatewayservice
  cloud:
    #找对应网段的网卡 不配置内部服务就走外网
    inetutils:
      preferred-networks: 192.168.0
    nacos:
      discovery:
          #nacos注册地址
        server-addr: 192.168.0.221:8848
    gateway:
      routes:
      - id: user
          #根据服务名转发 只需要名称 不用端口
        uri: lb://userservice
        #ip的形式转发
#        uri: http://127.0.0.1:7540
        predicates:
        #路由规则
        - Path=/user/**
        filters:
        #1/去掉前缀 0/保持原路径
        - StripPrefix=1
      #跨域配置 
      globalcors:
        cors-configurations:
          '[/**]':
            # 允许携带认证信息
            allowCredentials: true
            # 允许跨域的源(网站域名/ip),设置*为全部
            allowedOriginPatterns: "*"
            # 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
            allowedMethods: "*"
            # 允许跨域请求里的head字段,设置*为全部
            allowedHeaders: "*"

#本地静态路由配置 jar包依赖不一样
#my-load-balanced-service:
#  ribbon:
#    listOfServers: http://127.0.0.1:7540,http://127.0.0.1:7541
    #轮询
#    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

3.路由转发和负载均衡测试

启动不同端口的user服务,然后通过gateway调用

user服务暴露接口

访问地址http://127.0.0.1:7500/user/test

@Value("${server.port}")
String port;
@GetMapping("/test")
public String test() {
    return new Date().getTime()   ":"   port;
}

返回结果输出

1657261506117:7540
1657261509785:7541
1657261513874:7540
1657261517464:7541

可以正常路由转发和负载均衡,默认策略是轮询

4.gateway熔断实现

熔断:就是通过在转发过程中失败的,从而采取的降级策略。良好的返回提示给前端。

4.1 熔断代码

@Component
public class FallbackHandler implements ErrorWebExceptionHandler {
    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        String message = "服务正在维护,请稍后再试!";
        byte[] bytes = String.format("{\"code\":-1,\"message\":\"%s\",\"data\":null}",
                message).getBytes(StandardCharsets.UTF_8);
        DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(bytes);
        exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);
        return exchange.getResponse().writeWith(Flux.just(buffer));
    }
}

本来是想通过Hystrix直接配置重定向的,奈何spring-cloud-starter-netflix-hystrix已经不更新了,没法兼容。直接采用一刀切算了。

4.2 测试

开启gateway和user服务访问后,然后停掉user。结果如下

{"code":-1,"message":"服务正在维护,请稍后再试!","data":null}

在这里需要注意的两个点

  • 如果配置的是服务名,gateway先注册转发服务还没注册到Nacos时,访问就不会走熔断,会提示No servers available for service: userservice
  • 如果配置的是http地址,无对应的服务存在时则可以正常走熔断

5.gateway限流

用的是自带的令牌桶算法,例如总共十个令牌,每秒恢复一个,那么一秒内最大只能获取10个令牌,超过的则直接控制掉返回429 Too Many Requests

5.1 需要集成redis

pom依赖如下

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

5.2 yaml配置

#引入数据库
redis:
  database: 0
  host: 192.168.0.100
  port: 6379

//限流策略
gateway:
  routes:
  - id: user
    uri: lb://userservice
    predicates:
    - Path=/user/**
    filters:
    #名称不可修改
    - name: RequestRateLimiter
      args:
          #限流策略名 通过代码注入到spring容器中去
        key-resolver: "#{@ipKeyResolver}"
        #令牌桶每秒填充平均速率
        redis‐rate‐limiter.replenishRate: 1
        #令牌桶总容量
        redis‐rate‐limiter.burstCapacity: 2
        # 每次请求获取的令牌数
        redis-rate-limiter.requestedTokens: 1

上述配置含义:针对ip限流,总令牌数2,没秒恢复一个,每次获取一个。也就是说一秒内超过2次则会被限流。

注意上述限流配置缺一不可,不然启动也不会报错,也不会生效,重点是转发也不成功了

5.3 注入到spring容器

//针对ip限流
@Primary
@Bean(value = "ipKeyResolver")
public KeyResolver ipKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
//针对路径限流
//    @Bean(name = "apiKeyResolver")
public KeyResolver apiKeyResolver() {
    return exchange -> Mono.just(exchange.getRequest().getPath().value());
}

5.4 测试

访问http://127.0.0.1:7500/user/test,一秒内访问三次

redis截图

网页端截图

限流生效!

到此这篇关于SpringCloud Gateway详细分析实现负载均衡与熔断和限流的文章就介绍到这了,更多相关SpringCloud Gateway负载均衡内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringCloud Gateway详细分析实现负载均衡与熔断和限流的更多相关文章

  1. SpringCloud超详细讲解微服务网关Zuul基础

    这篇文章主要介绍了SpringCloud Zuul微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. SpringCloud gateway+zookeeper实现网关路由的详细搭建

    这篇文章主要介绍了SpringCloud gateway+zookeeper实现网关路由,本文通过图文实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. SpringCloud OpenFeign 服务调用传递 token的场景分析

    这篇文章主要介绍了SpringCloud OpenFeign 服务调用传递 token的场景分析,本篇文章简单介绍 OpenFeign 调用传递 header ,以及多线程环境下可能会出现的问题,其中涉及到 ThreadLocal 的相关知识,需要的朋友可以参考下

  4. Springcloud Stream消息驱动工具使用介绍

    SpringCloud Stream由一个中间件中立的核组成,应用通过SpringCloud Stream插入的input(相当于消费者consumer,它是从队列中接收消息的)和output(相当于生产者producer,它是发送消息到队列中的)通道与外界交流

  5. SpringCloud中Gateway的使用教程详解

    SpringCloud Gateway是Spring体系内的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。本文就来为大家详细讲讲Gateway的使用教程,需要的可以参考一下

  6. Spring Cloud Alibaba Nacos服务治理平台服务注册、RestTemplate实现微服务之间访问负载均衡访问的问题

    这篇文章主要介绍了Spring Cloud Alibaba:Nacos服务治理平台,服务注册、RestTemplate实现微服务之间访问,负载均衡访问,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. SpringCloud 客户端Ribbon负载均衡的实现方法

    Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负载均衡工具,且已集成在 Eureka 依赖中,这篇文章主要介绍了SpringCloud 客户端Ribbon负载均衡的实现方法,需要的朋友可以参考下

  8. SpringCloud服务网关Gateway的使用教程详解

    SpringCloud Gateway是Spring体系内的一个全新项目,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。本文就来为大家详细讲讲Gateway的使用教程,需要的可以参考一下

  9. Ribbon负载均衡算法原理与使用介绍

    在微服务中,对服务进行拆分之后,必然会带来微服务之间的通信需求,而每个微服务为了保证高可用性,又会去部署集群,那么面对一个集群微服务进行通信的时候,如何进行负载均衡也是必然需要考虑的问题

  10. SpringCloud 分布式微服务架构操作步骤

    SpringCloud是一种微服务的框架,利用它我们可以去做分布式服务开发,这篇文章主要介绍了SpringCloud 分布式微服务架构,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部