# my-rpc
**Repository Path**: KimmingLau/my-rpc
## Basic Information
- **Project Name**: my-rpc
- **Description**: 毕业设计rpc
华南农业大学2018级信息管理与信息系统
基于netty通信, protobuff序列化
实现starter拥抱springboot
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: dev
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2021-11-07
- **Last Updated**: 2026-03-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# my-rpc
## 前端地址
https://gitee.com/KimmingLau/my-rpc-ui
## 设计目的
辅助本科毕业论文编写, 华南农业大学2018级信息管理与信息系统专业
## Rpc简介
**rpc地位**
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。**从java开发者角度通俗地说, 就是一个service上的方法调用另一个service上的方法, 只是这两个service部署在不同的机器上.**
rpc是实现微服务架构中不同服务之间相互调用的基本技术
**架构演变**

**常见rpc框架**
- dubbo
- Thrift
- gRpc
- SpringCloud OpenFeign
## Rpc构成组件
### 基本模型

常见动态代理技术和框架
- JDK
- Cglib
- javassist
常见网络通信技术和框架
- 原生Java
- Java nio
- netty
- Mina
- Grizzly
常见序列化协议
- JDK
- Protobuf
- Kyro
- Hessian
- Thrift
### 注册中心

常见注册中心框架
- zookeeper
- Eureka
- Nacos
### 配置中心
### 元数据
### 熔断器
## 框架构想
1. 使用开源, 基于nio的网络通信框架进行传输,适合应对高并发场景
2. 使用高效的序列化协议, 减轻网络传输负担
3. 以注解方式使用服务发布和订阅, 简单易用
4. 与Spring高度集成, 通过starter方式拥抱SpringBoot, 降低接入成本
5. 要求使用强一致性的注册中心维护服务列表, 出现网络分区时放弃可用性(CP)
## 技术选型
- 编程语言: Java
- 网络通信: netty
- 序列化: protobuf, 暂时使用protostuff简化实现Java端与端之间调用
- 代理技术: JDK动态代理
- 注册中心: zookeeper
- 集成方式: SpringBoot
## 设计方案
### 阶段目标
- 阶段一: 网络通信实现
- 学习netty, 实现端与端通信
- 学习protobuf协议, 接入protostuff序列化, 实现netty自定义codec解耦编解码与业务逻辑
- 阶段二: 远程调用实现
- 学习传输协议设计, 定制自己的rpc协议, 定义请求, 响应实体字段
- 实现client-server之间的请求响应
- 通过动态代理技术屏蔽网络调用细节
- 阶段三: 降低接入成本
- 定义注解, 用于服务发布和订阅
- 学习SpringBoot原理, 通过自动配置方式创建Listener, BeanPostPprocessor等在springboot启动阶段无感知启动rpc-server
- 阶段四: 服务治理化
- 集成注册中心, 实现client-server在之间的ip列表解耦, 服务健康检查
- 服务调用负载均衡
- 服务路由
- 集成配置中心, 实现配置下发
- 高可用(熔断器)
待完善
### 接入说明(根据功能完成持续更新)
**应用模块规范**
服务提供方
- xxx-service: 存放服务实现类
- xxx-service-api: 存在服务接口, 暴露给消费端
服务消费方
无要求
**请保证zookeeper已经启动!**
### 服务提供方
1. 在service-api模块中提供服务接口
```java
package com.example.demo.service;
public interface HelloService {
String hello(String name);
}
```
2. 在service模块中引入rpc starter(请注意在SpringBoot场景下使用)
```xml
cn.kimming.rpc
my-rpc-spring-boot-starter
1.0-SNAPSHOT
```
3. 在application.properties中启用服务端(默认为消费端不启动)
```properties
# 启动服务端
my.rpc.server.enabled=true
# 服务端端口
my.rpc.server.port=8888
# zk
my.rpc.zk.url=127.0.0.1:2181
```
4. 提供服务实现
```java
package com.example.demo.service.impl;
import cn.kimming.rpc.common.annotation.RpcService;
import com.example.demo.service.HelloService;
@RpcService(HelloService.class) // 重点: 该注解会发布服务, 同时将其以bean方式注入到Spring容器中
public class HelloServiceImpl implements HelloService{
@Override
public String hello(String name) {
System.out.println("name = " + name);
return "hello, " + name;
}
}
```
5. 通过SpringBoot方式直接启动
### 服务消费方
1. 导入依赖
```xml
com.example.demo
demo-my-rpc-service-api
1.0-SNAPSHOT
cn.kimming.rpc
my-rpc-spring-boot-starter
1.0-SNAPSHOT
```
2. application.properties
```properties
# zk
my.rpc.zk.url=127.0.0.1:2181
```
3. 注入服务并调用
```java
@Service
public class OtherService {
@RpcReference
private HelloService helloService;
public void test() {
try {
String msg = helloService.hello("张三");
System.out.println("msg = " + msg);
} catch (RpcException e) {
// 远程调用异常处理
}
}
}
```