# 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是实现微服务架构中不同服务之间相互调用的基本技术 **架构演变** ![image-20211110201209998](README.assets/image-20211110201209998.png) **常见rpc框架** - dubbo - Thrift - gRpc - SpringCloud OpenFeign ## Rpc构成组件 ### 基本模型 ![image-20211110200123231](README.assets/image-20211110200123231.png) 常见动态代理技术和框架 - JDK - Cglib - javassist 常见网络通信技术和框架 - 原生Java - Java nio - netty - Mina - Grizzly 常见序列化协议 - JDK - Protobuf - Kyro - Hessian - Thrift ### 注册中心 ![image-20211110200229537](README.assets/image-20211110200229537.png) 常见注册中心框架 - 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) { // 远程调用异常处理 } } } ```