当前位置: 首页 > 后端技术 > Java

Spring Cloud Gateway 整合Sentinel实现流量控制

时间:2023-04-02 01:54:51 Java

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