# rpc代码 **Repository Path**: l1yzh1/rpc-code ## Basic Information - **Project Name**: rpc代码 - **Description**: rpc项目,简介需要十个字 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-12-23 - **Last Updated**: 2023-01-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #客户端 ##代理 代理会完成以下事情 1 解析方法参数,将值和类型分别装入两个数组。 2 调用AOP的before方法 3 解析这个service的包名和方法名,以此在zookeeper当中寻找ip地址 4 远程调用 5 调用AOP的after方法 6 如果是同步,卡在get方法,如果是异步,直接返回null。 ##AOP AOP采用的是织入代理对象,每次代理对象的创建,都会把AOP加入,所以可以在AOP中加入逻辑,这样在代理对象被调用时,就会调用这个方法。 ##clientTerminal 这是客户端的“总闸”,同时包含着着注册中心的发现类,netty的客户端类,分布式Id的生成类和策略类。以上四个都只有一个对象,所以我们只需要保证clientTerminal的唯一,然后在新建clientTerminal的时候创建以上四个类就行。 对于clientTerminal的创建我们使用经典的并发单例模式。volatile+非空判断+synchronized+非空判断。 ##remoteCall() 1 初始化future类,并将callback放入 2 使用分布式Id的生成类,生成雪花Id 3 将Id放入request和future 4 根据服务名,使用注册中心的发现类获得注册中心的这个服务的所有cache 5 根据策略,选择cache中的某一个ip 6 使用netty的客户端类发送请求 ##clientBuilder 这是netty的客户端类 里面有两个map 一个是channelMap,一个是 responseMap。 调用send时,会先尝试取出或和放入channelMap,然后将response放入responseMap。 ##RpcEncoder 这是netty的出栈处理器,负责将request赋予魔数,然后将request序列化成protobuf属性,再完成粘包处理。 ##RpcDecoder 进行魔数校验和反序列化,如果包不够大会重新等待读取,直到读取指定大小包。 ##Register 里面放着一个cacheMap,如果map中没有这个点 ##clientHandler 处理返回的response,如果失败了,会重试,超过三次,会删除channel和节点。 #服务端 ##serverBuilder 新建一个register类 注册的内容是ip地址和netty服务器通信的端口,也就是6666 这样每次通过方法返回的就是服务端的连接ip和端口。 ##build(),用于创建一个服务 创建只需要读锁,这是因为创建时如果没有父目录,那么它会自动创建父目录。而创建的过程是完全单线程的。 ##delete(),用于删除一个服务。 删除的时候使用了写锁。