手动实现一款轻量 高效的分布式RPC框架

一、概述

手动实现一款轻量,高效的RPC框架,基于TCP的二进制协议实现

github源码:https://github.com/wosn00/srpc
欢迎fork项目持续开发改进,性能优化

二、特征

  • 基于netty的主从Reactor模型,NIO通信
  • 支持同步,异步,携带回调等调用方式
  • 支持spring项目下引入starter包开箱即用,整合spring,实现服务接口透明使用
  • 支持非spring项目下单独使用,可不依赖spring环境
  • 支持多种序列化类型,Protostuff,Kryo,Json,Jdk等
  • 支持多种压缩算法,Snappy,Lz4,gzip,bzip2,Deflate,Lzo等
  • 支持注册中心,自动服务注册和发现,默认实现zookpeer,也可不使用注册中心,手动指定服务端节点地址列表
  • 支持多种负载均衡策略,随机,轮询,一致性hash等
  • 支持服务容错,连接/调用异常情况下自动排除服务端故障节点
  • 支持SPI扩展点,可扩展负载均衡策略,压缩算法,序列化类型,线程池,注册中心等
  • 支持TLS双向认证加密
  • 支持流量整形,请求异常重试,服务端请求去重等功能

三、设计

请添加图片描述
可能对RPC框架性能产生影响的几个因素:

  • 网络IO线程模型
  • 通信协议设计
  • 序列化性能
  • 服务调用管理方式
  • 连接池的维护
3.1 RPC协议

请添加图片描述
协议上设计尽量紧凑,4位bit用于标识序列化类型,压缩类型和指令类型,方法映射上不需要像dubbo那样传输完整的类 方法 参数信息导致的无用流量增大,而是自行生成对应rpc调用方法的唯一标识字符串

3.2 同步线程模型

请添加图片描述

3.3 异步线程模型

请添加图片描述

四、使用示例

4.1、spring环境下

maven依赖

项目目前暂时还未上传到maven中央仓库,需clone项目到本地maven选择srpc(root)下install后使用

<dependency>
    <groupId>com.hex</groupId>
    <artifactId>srpc-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

若需使用zookeeper作为注册中心则引入

<dependency>
    <groupId>com.hex</groupId>
    <artifactId>srpc-registry-zookeeper</artifactId>
    <version>1.1.0</version>
</dependency>

server端使用

1.定义服务接口

@SRpcClient(serviceName = "testService")
public interface HelloService {
   
   
    
    String hello(String name);
}

接口添加@SRpcClient注解,serviceName属性为rpc服务都在注册中心的服务名称,若不使用注册中心,则注解nodes属性需手动指定服务端节点集群地址,将根据负载均衡策略自动选取节点调用

@SRpcClient(nodes = {
   
   "127.0.0.1:9955","127.0.0.1:9956","127.0.0.1:9957"})
public interface HelloService {
   
   
    
    String hello(String name);
}

nodes属性有两种配置方式:

  • 直接指定节点地址列表,以分号隔开的字符串,例如 @SRpcClient(nodes = “127.0.0.1:9955;127.0.0.1:9956;127.0.0.1:9957”)
  • 以$符号开头支持从yml或properties配置文件获取节点配置,例如 @SRpcClient(nodes = “${srpc.helloService}”) 方式,需保证服务消费方的yml或properties配置文件有对应的集群地址配置,同样以分号隔开

2.服务接口实现

@SRpcRoute
public class HelloServiceImpl implements HelloService {
   
   
    @Override
    public String hello(String name) {
   
   
        return name + " Hey bro, it's a good day";
    }
}

实现类添加@SRpcRoute注解,便会自动注册为spring的单例bean,可视为等同@Comphonent使用,内部可用@Autowired等spring相关注解,也可被其他bean注入。

3.配置yml

因同时包含了rpc客户端和服务端,所以客户端和服务端都需要配置,如需个性化配置的地方在yml或properties文件按需配置即可,以srpc.server或srpc.client为前缀。所有可自由配置的选项如下

服务端默认配置:

@ConfigurationProperties(prefix = "srpc.server")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值