1 Star 0 Fork 0

flowers-bloom / srpc

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

SRPC

build oraclejdk version

SRPC 是一个基于 Netty 实现网络通信,Zookeeper 实现服务暴露和发现,并实现了序列化、负载均衡、重连机制的远程调用框架。其中部分设计思路借鉴于 Dubbo 框架。

特性

  1. 自定义声明报文长度的通信协议,解决粘包黏包问题
  2. 基于 Netty 实现高性能网络通信,并增加了客户端重连的容错机制
  3. 使用 Zookeeper 实现服务暴露和发现
  4. 实现的序列化方式:fastjson、hessian、kryo
  5. 实现的负载均衡算法:随机负载均衡、加权随机负载均衡、一致性哈希负载均衡
  6. RPC 提供直连方式和注册中心方式
  7. 自定义 SPI 注解,实现 ExtensionLoader 代替 JDK ServiceLoader 方式来加载实现类,并实现依赖注入
  8. 接口抽象良好,模块耦合度低

模块

  • srpc-common 公用模块
  • srpc-serialization 序列化模块
  • srpc-transport 网络通信模块
  • srpc-core 核心模块
  • srpc-api 接口模块
  • srpc-demo 示例模块

日志

项目开始于2020.11.01,以下是目前已实现的功能点

功能点 完成时间 备注
实现基本的 RPC 通信 2020.11.10 网络通信接口,使用 Netty 进行实现,并借助 CompletableFuture 实现线程间通信;序列化接口,使用 FastJson 进行实现;远程方法调用,使用 JDK Proxy 类实现动态代理
实现 Netty 心跳检测及处理;实现 zookeeper 服务注册和发现,以及客户端随机负载均衡 2020.11.11 使用 Netty 自带心跳检测实现方式;在结点上注册 watcher 实现服务列表的动态更新
实现 Netty 断线重连 2020.11.13 实现自定义有限次数重连策略;实现重连 handler ,采用异步方式连接远程主机,但会造成初始时客户端无法主动发送消息,因为 channel 虽然实例化了,但还未连接上远程主机
项目拆分成多个模块,实现解耦 2020.11.27
新增 hessian、kryo 序列化方式;新增加权随机、一致性哈希负载均衡算法;provider 和 consumer 使用建造者方式创建 2020.11.28
新增 SPI 注解声明默认实现类,采用 ExtensionLoader 的方式加载实现类 2020.12.2 借鉴 Dubbo SPI 设计
新增加载扩展类时依赖注入和对类进行包装 2020.12.4

使用

服务提供者

1. 定义服务接口

public interface HelloService {
    String sayHello(String s);
}

2. 在服务提供方实现接口

public class HelloServiceImpl implements HelloService {
    @Override
    public String sayHello(String s) {
        return "hello, " + s;
    }
}

3. 实现类声明
在 resource 目录下创建 META-INF/services 目录,并创建以接口全限定类名为文件名的文件,文件内声明标识和实现类名的映射

eg:文件名 xjh.rpc.api.GreetService
hello = xjh.rpc.api.impl.HelloServiceImpl
hi = xjh.rpc.api.impl.HiServiceImpl

4. 启动服务提供者

public class Server {
    public static void main(String[] args) {
        /*
        1. api 直接调用(注册中心方式)
         */
        Endpoint endpoint = new Endpoint("127.0.0.1:9002");
        
        Provider provider = new Provider();
        provider.address(endpoint)
                .serviceName("test2")
                .weight(6)
                .registry("127.0.0.1:2181")
                .build();

        /*
        2. xml 配置文件调用
         */

//        ClassPathXmlApplicationContext context =
//                new ClassPathXmlApplicationContext("META-INF/spring/provider.xml");
//        context.start();
    }
}

服务消费者

1. 调用远程服务

public class Client {

    public static void main(String[] args) {
        /*
        1. api 直接调用(注册中心方式)
         */
        Consumer consumer = new Consumer();
        Endpoint remoteAddress = new Endpoint("127.0.0.1:9004");
        
        consumer.registry("127.0.0.1:2181")
                //.remoteAddress(remoteAddress)
                .name("test1")
                .loadBalance(new ConsistentHashLoadBalance())
                .build();

        HelloService greetService = consumer.getProxy(HelloService.class);
        String hello = greetService.sayHello("i am consumer.");
        System.out.println(hello);

        /*
        2. xml 配置文件调用 暂无法使用
         */
//        ClassPathXmlApplicationContext context =
//                new ClassPathXmlApplicationContext("consumer.xml");
//        context.start();
//
//        HelloService greetService = (HelloService) context.getBean("greetService");
//        String hello = greetService.sayHello("i am consumer");
//        System.out.println(hello);
    }
}

空文件

简介

学习时开发的一个 rpc 框架。 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/hui_net/srpc.git
git@gitee.com:hui_net/srpc.git
hui_net
srpc
srpc
master

搜索帮助

14c37bed 8189591 565d56ea 8189591