# danran-rpc-debug
**Repository Path**: lengdanran/danran-rpc-debug
## Basic Information
- **Project Name**: danran-rpc-debug
- **Description**: Java基于Netty/Zookeeper实现的RPC框架——调试仓库
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2021-08-25
- **Last Updated**: 2022-08-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Java基于Netty/Zookeeper实现的RPC框架
> 基于Spring Boot Starter的小型RPC框架。编写这个RPC框架并不是为了重复造轮子,而是出于学习的目的,通过手写一款RPC框架来达到知识的学习和应用目的。简易的`RPC`框架(`danran-rpc`),底层使用`Netty`进行网络通信,使用`Zookeeper`为注册中心。该项目可以Maven打包直接加入其他项目运行。另外一个仓库:
>
> - `https://gitee.com/lengdanran/danran-rpc-debug`
> - `https://github.com/lengdanran/danran-rpc-debug`
>
> 为该项目的整合调试仓库,在里面可调试`danran-rpc`的源码
## 快速上手
> 示例代码:https://gitee.com/lengdanran/danran-rpc-example
- `https://gitee.com/lengdanran/danran-rpc.git`
- `https://github.com/lengdanran/danran-rpc.git`
### 生成本地Maven依赖包
从以上的git仓库地址clone代码到本地,然后进入到项目pom目录中,执行maven安装命令:
``` shell
mvn clean install
```
### 服务提供者-消费者同时引入该maven依赖
引入打包安装好的maven依赖,因为该RPC框架内部使用了和Springboot本身冲突的日志框架,引入依赖时,最好将`danran-rpc`的日志依赖移除,避免程序无法启动。

``` xml
danran.rpc
danran-rpc-spring-boot-starter
1.0.1
log4j
log4j
org.slf4j
slf4j-log4j12
```
### 服务提供者、消费者同时配置注册中心(请更换为自己的ZK地址)
在项目的`application.properties`添加如下配置
``` properties
danran.rpc.register-address=121.4.195.203:2181 # zk的地址
danran.rpc.protocol=danran
danran.rpc.server-port=6666
```
### 服务提供者使用示例
``` java
package provider.service;
import common.api.BookService;
import common.entity.Book;
import danran.rpc.annotation.RPCService;
import org.springframework.beans.factory.annotation.Autowired;
import provider.mapper.BookMapper;
import java.util.List;
/**
* @Classname BookServiceImpl
* @Description TODO
* @Date 2021/8/24 15:50
* @Created by ASUS
*/
@RPCService
public class BookServiceImpl implements BookService {
@Autowired
private BookMapper bookMapper;
/**
* @return 所有的书籍信息
*/
@Override
public List getAllBooks() {
return bookMapper.getAllBooks();
}
}
```
在具体的服务实现类上添加`@RPCService`注解,即可将该类作为服务提供者注册到`zookeeper`中,消费端可以发现该服务,添加该注解之后,将会作为Spring的Component注入到Spring的容器中。(不再需要添加@Component注解)
### 服务消费者示例
``` java
package consumer.controller;
import common.api.BookService;
import common.entity.Book;
import danran.rpc.annotation.InjectService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @Classname ConsumerController
* @Description TODO
* @Date 2021/8/24 19:04
* @Created by ASUS
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@InjectService
private BookService bookService;
@GetMapping("/get_all_books")
public List getAllBooks() {
return bookService.getAllBooks();
}
}
```
使用`@InjectService`注解,可以启动服务发现,然后自动注入远程服务的代理对象。
### 示例运行结果
启动两个Springboot的web服务,provider提供查询数据库的具体实现,consumer远程调用该服务。
- provider启动日志

- consumer启动日志

启动postman接口调试工具,访问服务接口:

接口成功返回数据,查看程序日志:

