本篇文章给大家谈谈微服务网关限流,以及服务端限流对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享微服务网关限流的知识,其中也会对服务端限流进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
Spring Cloud Zuul微服务网关的API限流
微服务开发中有时需要对API做限流保护,防止网络攻击,比如做一个短信验证码API,限制客户端的请求速率能在一定程度上抵御短信轰炸攻击,降低损失。
微服务网关是每个请求的必经入口,非常适合做一些API限流、认证之类的操作,这里有一个基于zuul微服务网关的API限流库:
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
比如我们要对 user-service 这个服务进行限流,限制每个请求源每分钟最多只能请求10次。
首先在项目中添加 spring-cloud-zuul-ratelimit 依赖:
然后再添加如下配置即可:
对API限流是基于Zuul过滤器完成的,默认情况下限流数据是记录在内存中的,实际上是用ConcurrentHashMap保存,当然也提供了多种存储方式,包括Redis、Consul、Spring Data JPA,使用这三种存储方式要添加相关依赖。
然后再添加存储配置,比如使用Redis的配置:
限流过滤器是在请求被转发之前调用的
限流类型主要包括url、origin、user三种
在过滤器的run方法中判断请求剩余次数,小于0就拦截请求:
可以看到,单位时间内剩余请求次数小于0时抛出ZuulRuntimeException,直接返回客户端TOO_MANY_REQUESTS异常消息,达到拦截请求的效果。
https://github.com/yunTerry/spring-cloud-netflix
又被面试官装到了:Spring Cloud Gateway 网关限流怎么做?
在我们平时开发过程中,一般一个请求都是需要经过多个微服务的, 比如: 请求从A服务流过B服务,如果A服务请求过快,导致B服务响应慢,那么必然会导致系统出现问题。因为,我们就需要有限流操作。
限流的key 生成规则,默认是 PrincipalNameKeyResolver来实现 限流算法,默认是 RedisRateLimiter来实现,是令牌桶算法。
在Spring Cloud Gateway中默认提供了 RequestRateLimiter 过滤器来实现限流操作。
1.引入jar包
2.编写配置文件
3.网关正常响应
4.网关限流响应
1.自定义限流key
配置文件中的写法(部分)
2.自定义限流算法
配置文件中的写法(部分)
注意⚠️: 这个类需要加上 @Primary 注解。
3.配置文件中的写法
微服务网关
1、路由转发:接收一切外界请求,转发到后端的微服务上去;
2、 过滤器 :在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
https://zhuanlan.zhihu.com/p/101341556
https://blog.csdn.net/ztemt_sw2/article/details/106208946
https://studygolang.com/articles/13254
https://blog.csdn.net/micl200110041/article/details/82013032
Spring Cloud Zuul 微服务网关
Zuul is the front door for all requests from devices and web sites to the backend of the Netflix streaming application.
Zuul 是从设备和网站到后端应用程序或服务的所有请求的入口微服务网关限流,为内部服务提供了可配置的对外URL到服务的映射关系。
Zuul 网关提供了如下功能微服务网关限流:
1、路由转发:接收一切外界请求,转发到后端的微服务上去微服务网关限流;
2、过滤器Filter:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
Zuul Server 工程中需要引入的依赖项
如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
在Spring Boot主函数上通过注解 @EnableZuulProxy 来开启网关路由功能,这样可以将请求转发到对应的服务。 按照约定, 一个ID为"client"的服务会收到 /client 请求路径的代理请求(前缀会被剥离)。
Zuul使用Ribbon定位服务注册中的实例, 并且所有的请求都在hystrix的command中执行, 所以失败信息将会展现在Hystrix Dashboard中, 并且一旦断路器打开, 代理请求将不会尝试去链接服务。
如下是Eureka,Zuul,Ribbon 交互图:
Spring Cloud Gateway -- 熔断限流
微服务系统中熔断限流环节,对保护系统的稳定性起到了很大的作用,作为网关,Spring Cloud Gateway也提供了很好的支持。先来理解下熔断限流概念:
下文就网关如何进行超时熔断、异常熔断和访问限流进行示例说明。示例包含两个模块项目,一个为网关项目 gateway ,一个为下游业务项目 downstream 。
pom.xml
application.yml
以上配置的意思是:
先不构建下游服务,直接运行网关,访问地址 gateway/test ,出现如下情况:
构建下游服务项目,该项目为简单的spring boot web项目,具体配置不详述,添加服务类:
可以发现,网关熔断策略是超时3秒就熔断,而下游服务需要用时5秒+。运行下游服务,继续在浏览器内访问地址 gateway/timeout ,如果正确配置,3秒后,仍将显示以上结果:
--------------------------------------小总结------------------------------------------------
可见,通过简单配置,在服务不可达和下游服务超时的情况下,Spring Cloud Gateway成功进行了熔断。
pom.xml
当然网关还需要配置redis地址,以本地redis为例:
通过该键来判断服务用户身份,比如一个客户端IP为一个用户,一个usrid为一个用户,添加配置类:
主要是两个参数 redis-rate-limiter.replenishRate: 10 、 redis-rate-limiter.burstCapacity: 10 ,前者控制往令牌桶丢令牌的速率,后者标识令牌桶的最大容量。
具体令牌桶算法可以参考下图:
当然这个只是概念,具体可以参考 令牌桶算法
修改限流参数:
200次请求,成功返回的大概有14次,异常请求的返回值为:
查看汇总结果,发现正常返回结果的数量明显变多( 100%-26.5%=84% )
限流功能正常!
-------------------------------------------惯例给源码---------------------------------------------
https://gitee.com/BeautifulHao/Spring-Cloud-Gateway-Demo.git
关于微服务网关限流和服务端限流的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
微服务网关限流的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于服务端限流、微服务网关限流的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~