# lagou_3_2_zookeeper **Repository Path**: java-quickstart/lagou_3_2_zookeeper ## Basic Information - **Project Name**: lagou_3_2_zookeeper - **Description**: 第三阶段模块二作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-07 - **Last Updated**: 2023-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 李志勇的作业 #### 阶段三模块二作业 编程题一: 在基于 Netty 的自定义 RPC 的案例基础上,进行改造。基于 Zookeeper 实现简易版服务的注册与发现机制 要求完成改造版本: 1. 启动 2 个服务端,可以将 IP 及端口信息自动注册到 Zookeeper 2. 客户端启动时,从 Zookeeper 中获取所有服务提供端节点信息,客户端与每一个服务端都建立连接 3. 某个服务端下线后,Zookeeper 注册列表会自动剔除下线的服务端节点,客户端与下线的服务端断开连接 4. 服务端重新上线,客户端能感知到,并且与重新上线的服务端重新建立连接 > 作业思路: > 服务端通过启动参数传入端口号,然后启动服务并将服务的 ip 和端口信息保存到 zookeeper > 客户端启动后从 zookeeper 获取提供者的 ip 和端口信息并同时监听该节点的变更,创建 rpcClient(启动 netty 客户端) > 服务端下线之后节点会删除该节点信息,客户端同时会重新获取注册中心的数据更新 rpcClient 编程题二: 基于作业一的基础上,实现基于 Zookeeper 的简易版负载均衡策略 要求完成改造版本: 1. Zookeeper 记录每个服务端的最后一次响应时间,有效时间为 5 秒,5s 内如果该服务端没有新的请求,响应时间清零或失效 2. 当客户端发起调用,每次都选择最后一次响应时间短的服务端进行服务调用,如果时间一致,随机选取一个服务端进行调用,从而实现负载均衡 > 作业思路: > 客户端 rpcClient 发起请求时记录发起请求时间,获取到数据之后记录响应时间并计算出请求耗时; > 客户端在选择 rpcClient 发起调用的时候,先根据请求耗时对 rpcClient 进行排序,取时间最短的发起请求(超过 5s 失效); > 创建 rpcConsumer 时,启动定时任务,每 5s 将 rpcClient 中的请求响应时间注册到 zookeeper; [视频讲解: 编程题一和二.mp4](./编程题一和二.mp4) 编程题三: 基于 Zookeeper 实现简易版配置中心 要求实现以下功能: 1. 创建一个 Web 项目,将数据库连接信息交给 Zookeeper 配置中心管理,即:当项目 Web 项目启动时,从 Zookeeper 进行 MySQL 配置参数的拉取 2. 要求项目通过数据库连接池访问 MySQL(连接池可以自由选择熟悉的) 3. 当 Zookeeper 配置信息变化后 Web 项目自动感知,正确释放之前连接池,创建新的连接池 > 作业思路: > 首先自定义一个 ZKBasedDataSource 作为 DataSource 的代理类,然后从注册中心监听节点变更并获取数据创建 DruidDataSource,ZKBasedDataSource 代理 DruidDataSource; > 当注册中心节点变更后,从 ioc 容器中取出 ZKBasedDataSource,然后再重新设置一个新的 DruidDataSource; [视频讲解: 编程题三.mp4](./编程题三.mp4)