还不会SpringCloud的gateway网关?保姆级教程呈上(跨域配置、路径过滤,限流,负载均衡)

一、什么是微服务网关?

网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,API 的实现方面更多的考虑业务逻辑,而安全、性能、监控可以交由 网关来做。

微服务网关是一个系统,通过暴露该微服务网关系统,方便我们进行相关的鉴权,安全控制,日志统一处理,易于监控的相关功能。

二、关于gateway的一些操作。

  1. 跨域配置
spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有请求
              allowedOrigins: "*" #跨域处理 允许所有的域
              allowedMethods: # 支持的方法
                - GET
                - POST
                - PUT
                - DELETE
  1. 路径匹配过滤配置

假如请求以/user/路径开始的请求都直接交由http://localhost:8081(用户微服务)处理,则当请求为http://localhost:8001/user时,会转发到用户微服务上进行处理。

routes:
            - id: changgou_goods_route
              uri: http://localhost:8081
              predicates:
              - Path=/user/**
  1. PrefixPath过滤配置

加上前缀/user,比如请求http://localhost:8001,实际是请求http://localhost:8081/user的结果。

routes:
            - id: changgou_goods_route
              uri: http://localhost:8081
              predicates:
              - Path=/**
              filters:
              - PrefixPath=/user
  1. StripPrefix过滤配置

请求路径为/api/user,而真实的路径是/user。即去掉api,才是真实路径,可以使用StripPrefix来过滤。

routes:
            - id: changgou_goods_route
              uri: http://localhost:8081
              predicates:
              - Path=/**
              filters:
              - StripPrefix=1
  1. LoadBalancerClient路由过滤器(负载均衡)

路由配置每次都会将请求给指定的URL处理,若在生产环境中,并发量较大的时候,则需要根据服务的名称判断来做负载均衡操作,可以使用LoadBalancerClientFilter来实现负载均衡调用。

LoadBalancerClientFilter会作用在url以lb开头的路由,然后利用loadBalancer来获取服务实例,构造目标requestUrl,设置到GATEWAY_REQUEST_URL_ATTR属性中,供NettyRoutingFilter使用。

routes:
            - id: changgou_goods_route
              uri: lb://user #微服务服务名
 
  1. 网关限流(令牌桶算法)

(1)所有请求前需要先拿到一个可用的令牌才会被处理。
(2)根据限流大小,按照一定速率往桶里添加令牌。
(3)桶设置最大令牌数,当桶满时,新添加的令牌则被丢弃或拒绝。
(4)请求达到后首先获取令牌桶里的令牌,拿着令牌才可进行其他业务逻辑处理,处理完成之后,将令牌直接删除。
(5)令牌桶有最低限额,当令牌达到最低限额时,请求处理之后不会删除令牌,以保证足够的限流。
在这里插入图片描述

spring cloud gateway 默认使用redis的RateLimter限流算法来实现。

  • 6.1 引入redis依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
  • 6.2 定义KeyResolver

(在引导类中添加代码,KeyResolver用于计算某一个类型的限流的KEY也就是说,可以通过KeyResolver来指定限流的Key。比如:可以根据IP来限流,每个IP每秒钟只能请求一次,在GatewayWebApplication定义key的获取,获取客户端IP,将IP作为key。)

/***
 * IP限流
 * @return
 */
@Bean(name="ipKeyResolver")
public KeyResolver userKeyResolver() {
    return new KeyResolver() {
        @Override
        public Mono<String> resolve(ServerWebExchange exchange) {
            //获取远程客户端IP
            String hostName = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
            System.out.println("hostName:"+hostName);
            return Mono.just(hostName);
        }
    };
}
  • 6.3 指定限制流量的配置
routes:
            - id: changgou_goods_route
              uri: lb://user
              predicates:
              - Path=/api/user**
              filters:
              - StripPrefix=1
              - name: RequestRateLimiter #请求数限流 名字不能随便写 ,使用默认的facatory
                args:
                  #指定使用哪一个KeyResolver
                  key-resolver: "#{@ipKeyResolver}"
                  #这是令牌桶填充的速率
                  redis-rate-limiter.replenishRate: 1
                  #指令牌桶的容量
                  redis-rate-limiter.burstCapacity: 1
                  #表示一秒内,允许一个请求通过,
                  #令牌桶的填充速率也是一秒钟添加一个令牌。
                  #最大突发状况 也只允许 一秒内有一次请求,可以根据业务来调整 。
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT学习小镇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值