上一篇介绍了SpringCloudGateway的一些基础知识点。今天小陈就来说说在网关层面如何做限流?文章目录如下:如何限制网关流量?SpringCloudGateway本身的限流实现,filter是RequestRateLimiterGatewayFilterFactory,不过这种上不了台面的就不再介绍了,有兴趣的可以自己实现。今天的重点是集成阿里的Sentinel实现网关限流。对Sentinel不了解的可以看看陈老师的文章:阿里限流神器SentinelKilling连载17问?从1.6.0版本开始,Sentinel提供了SpringCloudGateway的适配模块,可以在两个资源维度提供限流:路由维度:即配置文件中配置的路由入口,资源名称为对应的routeId。这种粗粒度的限流一般是针对一个微服务的限流。自定义API维度:用户可以使用Sentinel提供的API自定义一些API组。这种细粒度的限流,针对某一类uri匹配限流,可以跨越多个微服务。Sentinel官方文档:https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81SpringCloudGateway集成Sentinel实现非常简单,这就是阿里的魅力,提供简单易操作的工具,让程序员专注于业务。新建项目新建gateway-sentinel9026模块,添加如下依赖:com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoveryorg.springframework.cloudspring-cloud-starter-gatewaycom.alibaba.cloudspring-cloud-alibaba-sentinel-gateway依赖>com.alibaba.cloudspring-cloud-starter-alibaba-sentinel注意:这里还是一个网关Service,不添加WEB依赖配置文件配置文件主要指定了以下三个配置:nacos地址sentinel控制台地址网关路由配置配置如下:spring:cloud:##integratesentinel,配置sentinel控制台地址sentinel:transport:##指定控制台地址,默认端口8080dashboard:localhost:8080nacos:##注册中心配置discovery:#nacos服务地址,nacos-server中的IP地址:端口号server-addr:127.0.0.1:8848gateway:##routingroutes:##id??As只要是唯一的,名字就是arbitrary-id:gateway-provideruri:lb://gateway-provider##Configurationassertionpredicates:##PathRoutePredicateFactory断言所有满足/gateway/provider/**请求路径的请求会被路由到这个uri中的http://localhost:9024-Path=/gateway/provider/**上面配置中设置了一个路由gateway-provider,只要请求路径满足/gateway/provider/**,会路由到gateway-provider服务限流配置经过上面两步其实已经集成了Sentinel。这个时候访问接口:http://localhost:9026/gateway/provider/port就可以在sentinel控制台看到已经被监听了。被监控的路由是gateway-provider,如下图:这时候我们可以在路由维度上加一个限流,如下图:上图中路由gateway-provider已经被受限,QPS阈值为1,此时快速访问:http://localhost:9026/gateway/provider/port,可以看到限流已经被限流了,如下图:限流以上路由维度已经配置成功,大家可以按照上述步骤自行尝试。API组限流也很简单。首先需要定义一个分组,API管理->添加API分组,如下图:匹配方式选择完全匹配(也有前缀匹配,正则匹配),所以只有这个uri:http://xxxx/gateway/provider/port将受到限制。第二步为该组添加流控规则,流控规则->添加网关流控,如下图:在API名称中选择对应的组即可,添加后限流规则生效.Chen就不测试了,大家自己测试吧...Chen这里只是简单的配置,关于限流规则的持久化可以参考Chen哨兵一文,这里不做过多介绍。如何自定义限流异常信息?从上面的演示我们可以看出,默认的异常返回信息是:“Block……”,这肯定是客户端不能接受的,所以需要自己自定义异常返回信息。下面介绍两种不同的自定义异常返回信息的方式,开发时选择其中一种即可。在直接配置文件中,自定义开发者可以直接修改配置文件中的返回信息。配置如下:spring:cloud:##集成sentinel,配置sentinel控制台地址sentinel:#配置限流后响应内容scg:fallback:##两种模式,一种是response返回文本提示信息,##一个是redirect,重定向跳转,需要同时配置redirect(跳转uri)mode:response##Responsestatusresponse-status:200##Responsebodyresponse-body:'{"code":200"message":"请求失败,稍后再试!"}'上面配置中的模式配置为response,一旦限流,返回json字符串。{"code":200,"message":"请求失败,稍后再试!"}重定向的配置如下:spring:cloud:##集成sentinel,配置sentinel的地址consolesentinel:#配置后目前限制,响应内容scg:fallback:##两种模式,一种是响应返回文本提示信息,另一种是redirect,重定向跳转,需要同时配置redirect(跳转uri)模式:redirect##jumpURL重定向:http://www.baidu.com一旦被限制,会直接跳转到:http://www.baidu.com编码定制不是很灵活,通过硬编码,完整代码如下:@ConfigurationpublicclassGatewayConfig{/***自定义限流处理器*/@PostConstructpublicvoidinitBlockHandlers(){BlockRequestHandlerblockHandler=(serverWebExchange,throwable)->{Mapmap=newHashMap();map.put("code",200);map.put("message","请求失败,请稍后再试!");returnServerResponse.status(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON_UTF8).body(BodyInserters.fromObject(map));};GatewayCallbackManager.setBlockHandler(blockHandler);}}两个方法介绍完后,大家可以根据自己的业务需求选择合适的方法。当然,陈更喜欢第一种方法。原因是:约定>配置>编码。网关限流服务安全吗?很多人认为只要在网关层面限流,隐藏在后面的服务就高枕无忧了。你是否也有这样的想法?显然这个想法是错误的,而且很复杂。在微服务架构中,一个独立的服务不仅被一方调用,还经常被多方调用,如下图:商品服务不仅被网关层调用,内部订单服务也被调用.安全吗?一旦有大量的订单服务请求,比如大促期间的闪购,商品和服务会瞬间被压垮,不限流。所以根据公司的业务场景,需要对自己负责的服务进行限流。最常见的方案是:网关层集群限流+内部服务单机限流,保证不会被流量压垮。总结文章介绍了SpringCloudGateway集成Sentinel在网关层限流,以及限流的一些思考。