# 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());
}
}
```
**版本更新日志:**