【RPC】一步一步实现基于netty+zookeeper的RPC框架(五)

上一篇实现了服务的链路追踪,本篇带来限流。

关于服务限流,比较流行的是

1:令牌桶算法:桶算法的升级版,实现简单,应对热点请求效果更理想。

2:动态限流:根据实时的统计当前时间段请求响应时间来动态调整限流数量,实现复杂,但应对各种情况效果更好。

这里还是贴出github代码地址,想直接看代码的可以直接下载运行:https://github.com/whiteBX/wrpc

本篇带来令牌桶实现限流的实现,核心代码很简单,主要就下面一个类:

* 存放限流器

rateLimiterMap

* 限流

appCode

rateLimiter rateLimiterMapappCode

rateLimiter

rateLimiterMapappCode

rateLimiter rateLimiterMapappCode

rateLimiter NANOSECONDS

这里核心就是用到了guava包的RateLimiter,它内部实现了令牌桶,默认情况下RateLimiter.create(1)表示每秒向令牌桶中投放1个令牌,当然它也支持自己传入时间单位。

家下来改造RPCConsumer类的getServer方法:

* 获取服务

appCode

consumerLimiterappCode

out

serverHost urlHolderappCode

serverHost

serverHost

运行我们的代码,客户端日志如下:

zookeeper连接成功

链路追踪,调用远程服务:

调用服务器请求参数响应参数

客户端收到响应

请求被限流

链路追踪,调用远程服务:

远程调用错误当前无服务提供者

客户端收到响应

请求被限流

链路追踪,调用远程服务:

远程调用错误当前无服务提供者

客户端收到响应

链路追踪,调用远程服务:

调用服务器请求参数响应参数

客户端收到响应

请求被限流

可以看到其中的限流日志。

另外说一点,本篇实现的是客户端限流,也有很多是支持服务端限流的,各有各的好处,可以按各位实际场景决定,或者两者都用。

以上是 【RPC】一步一步实现基于netty+zookeeper的RPC框架(五) 的全部内容, 来源链接: www.h5w3.com/php/706282.html

回到顶部