SpringCloud微服务组件之网关gateway(跨域配置、路径过滤,限流,负载均衡)

2022-07-04 13:48:26

一、什么是微服务网关?

网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过 网关这一层。也就是说,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_routeuri: http://localhost:8081predicates:- Path=/user/**
  1. PrefixPath过滤配置

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

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

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

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

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

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

routes:-id: changgou_goods_routeuri: 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")publicKeyResolveruserKeyResolver(){returnnewKeyResolver(){@OverridepublicMono<String>resolve(ServerWebExchange exchange){//获取远程客户端IPString hostName= exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();System.out.println("hostName:"+hostName);returnMono.just(hostName);}};}
  • 6.3 指定限制流量的配置
routes:-id: changgou_goods_routeuri: lb://userpredicates:- Path=/api/user**filters:- StripPrefix=1-name: RequestRateLimiter#请求数限流 名字不能随便写 ,使用默认的facatoryargs:#指定使用哪一个KeyResolverkey-resolver:"#{@ipKeyResolver}"#这是令牌桶填充的速率redis-rate-limiter.replenishRate:1#指令牌桶的容量redis-rate-limiter.burstCapacity:1#表示一秒内,允许一个请求通过,#令牌桶的填充速率也是一秒钟添加一个令牌。#最大突发状况 也只允许 一秒内有一次请求,可以根据业务来调整 。
  • 作者:IT学习小镇
  • 原文链接:https://blog.csdn.net/weixin_44045828/article/details/117958321
    更新时间:2022-07-04 13:48:26