Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

NiceSeason/My-RPC-FrameWork

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

My-RPC-Framework

GitHub jdk

My-RPC-Framework 是一款基于 Nacos 实现的 RPC 框架。使用 Netty进行网络传输的实现并提供接口用以扩展,并且实现了多种序列化与负载均衡算法。

学习资源

rpc框架

一起写个Dubbo

guide-rpc

动态代理

基于子类和cglib的动态代理

代理模式|静态代理|动态代理

netty

Java I/O模型从BIO到NIO和Reactor模式

【NIO系列】——之Reactor模型

《Netty 实战(精髓)》

《Netty 4.x 用户指南》

【Netty】(8)---理解ChannelPipeline

netty的option和childOption区别

其他

单例模式

java注解

...

架构

系统架构

消费者调用提供者的方式取决于消费者的客户端选择,如选用原生 Socket 则该步调用使用 BIO,如选用 Netty 方式则该步调用使用 NIO。如该调用有返回值,则提供者向消费者发送返回值的方式同理。

特性

  • 实现了基于 Netty 传输网络传输方式
  • 实现了两种序列化算法,Json 方式、Kryo 算法(默认采用 Kryo方式序列化)
  • 实现了两种负载均衡算法:随机算法与轮转算法
  • 使用 Nacos 作为注册中心,管理服务提供者信息
  • 消费端如采用 Netty 方式,会复用 Channel 避免多次连接
  • 如消费端和提供者都采用 Netty 方式,会采用 Netty 的心跳机制,保证连接
  • 接口抽象良好,模块耦合度低,网络传输、序列化器、负载均衡算法可配置
  • 实现自定义的通信协议
  • 服务提供侧自动注册服务

项目模块概览

  • java-demo —— netty、socket等demo
  • roc-api —— 通用接口
  • rpc-common —— 实体对象、工具类等公用类
  • rpc-core —— 框架的核心实现
  • test-client —— 测试用消费侧
  • test-server —— 测试用提供侧

传输协议(MRF协议)

调用参数与返回值的传输采用了如下 MRF 协议( My-RPC-Framework 首字母)以防止粘包:

+---------------+---------------+-----------------+-------------+
|  Magic Number |  Package Type | Serializer Type | Data Length |
|    4 bytes    |    4 bytes    |     4 bytes     |   4 bytes   |
+---------------+---------------+-----------------+-------------+
|                          Data Bytes                           |
|                   Length: ${Data Length}                      |
+---------------------------------------------------------------+
字段 解释
Magic Number 魔数,表识一个 MRF 协议包,0xCAFEBABE
Package Type 包类型,标明这是一个调用请求还是调用响应
Serializer Type 序列化器类型,标明这个包的数据的序列化方式
Data Length 数据字节的长度
Data Bytes 传输的对象,通常是一个RpcRequestRpcClient对象,取决于Package Type字段,对象的序列化方式取决于Serializer Type字段。

使用

定义调用接口

public interface HelloService {
    String hello(String name);
}

在服务提供侧实现该接口

@RpcService
public class HelloServiceImpl implements HelloService {
    private static final Logger logger = LoggerFactory.getLogger(HelloServiceImpl.class);

    @Override
    public String hello(HelloObject object) {
        logger.info("HelloServiceImpl接收到:{}", object.getMessage());
        return object.getId() + "---" + object.getMessage();
    }
}

编写服务提供者

@RpcScan
public class TestNettyServer {
    public static void main(String[] args) {
        RpcServer rpcServer = new NettyServer("127.0.0.1", 7);
        rpcServer.start();
    }
}

在服务消费侧远程调用

public class TestNettyClient {
    public static void main(String[] args) {
        RpcClient client = new NettyClient();
        RpcClientProxy proxy = new RpcClientProxy(client);
        HelloService proxy1 = proxy.getProxy(HelloService.class);
        HelloObject object = new HelloObject(1, "sada");
        System.out.println(proxy1.hello(object));
    }
}

这里客户端也选用了 Netty 的传输方式,序列化方式采用 Kryo 方式,负载均衡策略指定为轮转方式。

启动

在此之前请确保 Nacos 运行在本地 8848 端口。

首先启动服务提供者,再启动消费者。

TODO

  • 使用接口方式自动注册服务
  • 配置文件

LICENSE

My-RPC-Framework is under the MIT license. See the LICENSE file for details.

About

自己实现的类似dubbo的rpc框架

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.