# rpc-framework **Repository Path**: steakliu/lp-rpc ## Basic Information - **Project Name**: rpc-framework - **Description**: 基于netty,zookeeper,spring,kryo的轻量级rpc框架 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2021-08-22 - **Last Updated**: 2022-05-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: rpc, Netty, zookeeper, 远程调用, 序列化 ## README ### Steak-Rpc **版本** :1.0.0 **技术栈** :Netty Zookeeper Kryo Spring **实现思想** :本rpc在服务端启动时候,获取标注有@LpService的类,表示此类是一个服务,需要注册到zk注册中心,此注解有group和version两个属性,group表示组,为了区分存在同名服务,version表示接口的版本,在zk注册中心根节点名称为lpRpc,是一个持久化节点,而子节点则是服务,是临时节点,当服务端关闭以后,相应的服务则会自动删除,服务名格式为,服service:group:version,如: **UserService:business:1.0.0** ,服务节点存储类路径,远程服务地址,格式为:host:port:className,如 **192.168.0.1:8080:com.lp.rpc.service.impl.UserServiceImpl** ,服务端进行服务注册以后,客户端启动去zk注册中心拿到所有服务,然后存在本地缓存中,然后监听服务端服务的变化,实时更新本地缓存,调用服务时首先在本地缓存中查找是否存在服务,存在的话直接发起远程调用,不存在则去注册中心查找服务,客户端通过反射获取到类信息以后发起远程调用,然后经过序列化等一系列操作,最终返回调用结果。 **说明** :此版本是第一个版本,比较简陋,后续会陆续进行更新 :kissing_heart: 调用示例: **server** ``` com.lp Lp-common 1.0-SNAPSHOT com.lp Lp-registry 1.0-SNAPSHOT ``` ``` version和group不是必选,如果指定了,name客户端在发起请求的时候也需要指定,不然找不到服务 @LpService(version = "1.0.0" , group = "business") public class HelloServiceImpl implements HelloService { @Override public String sayHello() { return "business group"; } } ``` ``` public class LpServerBootstrap { public static void main(String[] args) { new ClassPathXmlApplicationContext("spring.xml"); } } ``` client client端必须引入以下几个包,Lp-client客户端代理,Lp-registry服务发现,Lp-common一些依赖。 ``` com.lp Lp-common 1.0-SNAPSHOT com.lp Lp-registry 1.0-SNAPSHOT com.lp Lp-client 1.0-SNAPSHOT ``` ``` public class LpClientBootstrap { public static void main(String[] args) throws NoSuchFieldException { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); HelloService helloService = LpClientProxy.createProxy(HelloService.class, "basic", "1.0.0"); System.out.println(helloService.sayHello()); } } ``` **版本更新日志:**