加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
题目分析及思路.txt 1.76 KB
一键复制 编辑 原始数据 按行查看 历史
雷厉风行 提交于 2021-07-05 17:31 . 提交作业
编程题一:
实现思路:
实现基于zookeeper的服务注册与发现,分为服务端和客户端两部分;
1.服务端 服务端主要在项目启动的时候将自己的ip和端口注册到zookeeper上,供客户端获取。
因为要实现zookeeper注册列表自动剔除下线的方便下线的时候可以自动将节点删除服务端节点,所以需要通过临时节点实现,可以实现会话结束删除临时节点。
2.客户端
客户端要在启动的时候通过zookeeper发现服务,需要根据指定的路径查找临时子节点,并将查到的节点数据进行解析然后和每个服务器建立RpcClient连接。需要将每个建立好连接的RpcClient放到统一的集合中,供消费者使用。
客户端要实现自动剔除下线的服务端,就需要在启动的时候发现服务之后设置监听器,当服务端节点出现变动的时候会通知并调用通知方法,这时候可以进行客户端连接的剔除。
同样要实现服务端上线也是基于监听器监听父节点,如果节点发现变动,可以基于事件类型和变更的节点数据新增客户端连接。
编程题二:
实现思路:
根据题目要求要在客户端实现基于zookeeper的负载均衡,并要在zookeeper上记录每个服务端的响应时间,数据有效期为5s;
1.首先,客户端要存储每个服务的最后一次调用耗时,可以使用Map存储,key为ip+port,value为响应时间。
要实现耗时统计就需要记录下每次客户端调用的时候的请求时间、服务端ip和端口、唯一id,响应的时候进行计算并存储在Map中。
2.客户在启动的时候创建定时线程池,根据Map里存储的数据每5秒更新一次zookeeper节点的值。上报的时候需要判断当前时间举例最后一次请求是否超过5秒,所以需要记录每个服务器最后一次请求的时间戳,这里将Map中的value改为时间戳+“#”+耗时,这样可以在上报的时候判断是否需要删除节点。
3.实现负载均衡:从Map中获取到每个服务器的耗时,如果时间距现在超过5s则耗时按0处理,对服务器节点按耗时进行排序,如果只有一个服务器节点则直接返回,如果有两个以上节点,则判断前两个节点耗时是否相同,相同的话随机返回一个。
4.服务端上线和下线客户端负载均衡也要跟着变动,上线的时候根据监听事件需要增加服务端节点统计数据,
下线的时候也需要清除掉服务端节点数据;
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化