手写RPC框架:从工程搭建到服务注册

需积分: 8 0 下载量 150 浏览量 更新于2024-06-30 收藏 3.1MB PDF 举报
“.arch手写RPC.pdf”是一个关于构建自定义RPC框架的教程,涵盖了从工程搭建到服务端实现和服务注册的关键步骤。 RPC(Remote Procedure Call)是一种进程间通信技术,允许程序调用另一个不在同一地址空间的程序,使得分布式系统间的通信变得简单。在这个教程中,我们将学习如何手写一个简单的RPC框架。 首先,教程从工程搭建开始,引入了基本的项目结构和代码。这通常涉及到创建Maven或Gradle项目,定义模块划分,例如hrpc-server模块,以及设置相关的依赖库,如Zookeeper客户端库(用于服务注册与发现)。 接下来,教程进入RPC服务端的实现。创建`RpcServerBootstrap`作为引导类,它在应用启动时初始化RPC服务器。`@PostConstruct`注解确保`initRpcServer`方法在所有bean初始化完成后执行,调用`RpcServerRunner`的`run`方法来启动服务。 `RpcServerRunner`是服务启动器,负责服务注册和监听。服务注册部分通过实现`RpcRegistry`接口完成,这个接口定义了一个`serviceRegistry`方法。这里使用Zookeeper作为服务注册中心,具体实现为`ZkRegistry`类。`ZkRegistry`使用了Spring的`BeanFactory`来获取其他组件,如`ServerZkKit`用于与Zookeeper交互,以及`RpcServerConfiguration`获取服务器配置信息。 在`ZkRegistry`中,`serviceRegistry`方法执行实际的服务注册操作,将服务信息(如服务名、服务版本、提供者地址等)存储到Zookeeper中。此外,`run`方法还负责启动服务监听,等待接收客户端的请求。这可能涉及到网络编程,例如使用Java的NIO或Netty框架来创建服务器端的Socket监听。 这个RPC框架的核心组件包括: 1. 引导类 (`RpcServerBootstrap`):初始化和启动RPC服务。 2. 服务启动器 (`RpcServerRunner`):负责服务注册和监听客户端请求。 3. 服务注册接口 (`RpcRegistry`):定义服务注册行为。 4. 注册实现 (`ZkRegistry`):使用Zookeeper进行服务注册。 5. 配置类 (`RpcServerConfiguration`):可能包含服务器端的端口、超时时间等配置。 手写RPC框架是一个很好的学习实践,有助于深入理解分布式系统中的服务调用机制,包括服务发现、网络通信、负载均衡等核心概念。通过这个教程,开发者可以逐步掌握如何构建一个基础的RPC框架,为进一步的分布式系统开发打下坚实的基础。

for (img1_file, img2_file) in tqdm(img_pairs): img1 = np.array(imread(img1_file)) img2 = np.array(imread(img2_file)) if args.arch == 'StrainNet_l' and img1.ndim == 3: img1 = img1[:,:,1] img2 = img2[:,:,1] img1 = img1/255 img2 = img2/255 if img1.ndim == 2: img1 = img1[np.newaxis, ...] img2 = img2[np.newaxis, ...] img1 = img1[np.newaxis, ...] img2 = img2[np.newaxis, ...] img1 = torch.from_numpy(img1).float() img2 = torch.from_numpy(img2).float() if args.arch == 'StrainNet_h' or args.arch == 'StrainNet_f': img1 = torch.cat([img1,img1,img1],1) img2 = torch.cat([img2,img2,img2],1) input_var = torch.cat([img1,img2],1) elif img1.ndim == 3: img1 = np.transpose(img1, (2, 0, 1)) img2 = np.transpose(img2, (2, 0, 1)) img1 = torch.from_numpy(img1).float() img2 = torch.from_numpy(img2).float() input_var = torch.cat([img1, img2]).unsqueeze(0) # compute output input_var = input_var.to(device) output = model(input_var) if args.arch == 'StrainNet_h' or args.arch == 'StrainNet_l': output = torch.nn.functional.interpolate(input=output, scale_factor=2, mode='bilinear') output_to_write = output.data.cpu() output_to_write = output_to_write.numpy() disp_x = output_to_write[0,0,:,:] disp_x = - disp_x * args.div_flow + 1 disp_y = output_to_write[0,1,:,:] disp_y = - disp_y * args.div_flow + 1 filenamex = save_path/'{}{}'.format(img1_file.stem[:-1], '_disp_x') filenamey = save_path/'{}{}'.format(img1_file.stem[:-1], '_disp_y') np.savetxt(filenamex + '.csv', disp_x,delimiter=',') np.savetxt(filenamey + '.csv', disp_y,delimiter=',')

2023-07-08 上传