基于springBoot,手写一个简单的RPC框架(三)
继续上一章,在实现了服务端注册和调用之后,需要来实现客户端的功能,其中主要包括负载均衡,限流,请求发送和服务发现上。接下来将从一个RPC调用流程的顺序来实现接下来的功能
远程过程调用(Remote Procedure Call)是一种通信机制,允许不同的服务之间通过网络进行通信和交互。
通过RPC,一个服务可以向另一个服务发起请求并获取响应,就像本地调用一样,而无需开发者手动处理底层的网络通信细节。RPC框架会封装底层的网络传输,并提供了远程服务接口的定义、序列化和反序列化数据等功能。
HTTP是一种用于传输超文本的应用层协议,它在客户端和服务器之间进行通信。它基于请求-响应模型,客户端发送HTTP请求到服务器,服务器处理请求并返回相应的HTTP响应。RPC更类似一种架构思想,RPC可以用HTTP实现,TCP实现。
QA:
假设存在一个整数序列input,例如intput = [1,2,7,4,3]
,要求前K个数的和。
Sulotion:
一般我们会求一个前缀和数组preSumArray
,其中preSumArray[i]
代表前i
个数的和,这样我们求前N个数的和只需要返回preSumArray[N]
, 时间复杂度为O(1),如果需要查询K次,则复杂度为O(K).
QA:
假设存在一个整数序列input,例如intput = [1,2,7,4,3]
,现在在我们获取前N个数的和时,可能会先将i
位置的数增加/减少value
。
Sulotion:
一般我们会求一个前缀和数组preSumArray
,其中preSumArray[i]
代表前i
个数的和,如上一个问题所示,我们依旧可以在O(1)的时间得到前缀和。但是如果我们需要在第i
位置插入一个数x
,在进行更新时需要更新i
之后的所有preSumArray
,此时单次的更新时间为O(N),K次查询的复杂度为O(KN)。如果我们不使用preSumArray
,那么更新复杂度为O(1),查询复杂度会变为O(N)。
这时树桩数组可以帮助我们快速解决这个问题
RandomizedCollection
是一种包含数字集合(可能是重复的)的数据结构。它应该支持插入和删除特定元素,以及删除随机元素。
实现 RandomizedCollection
类:
RandomizedCollection()
初始化空的 RandomizedCollection
对象。bool insert(int val)
将一个 val
项插入到集合中,即使该项已经存在。如果该项不存在,则返回 true
,否则返回 false
。bool remove(int val)
如果存在,从集合中移除一个 val
项。如果该项存在,则返回 true
,否则返回 false
。注意,如果 val
在集合中出现多次,我们只删除其中一个。int getRandom()
从当前的多个元素集合中返回一个随机元素。每个元素被返回的概率与集合中包含的相同值的数量 线性相关 。您必须实现类的函数,使每个函数的 平均 时间复杂度为 O(1)
。
注意:生成测试用例时,只有在 RandomizedCollection
中 至少有一项 时,才会调用 getRandom
。