supine - 轻量级去中心化 RPC 框架


Apache
跨平台
Java

软件简介

supine是一个轻量级去中心的RPC框架

  • 使用AIO通讯
  • 采用Multicast进行服务注册发现

快速开始

创建Maven项目

<dependency>
    <groupId>vip.justlive</groupId>
    <artifactId>supine</artifactId>
    <version>${lastVersion}</version>
</dependency>

Gradle

compile 'vip.justlive:supine:$lastVersion'

服务端

  • 直连方式

    ServiceConfig config = new ServiceConfig(10086);
    ServiceFactory factory = new ServiceFactory(config);

    // 注册服务
    factory.register(new SayImpl());
    factory.register(new SayImpl2(), “2”);

    factory.start();
    // 服务端常驻
    factory.sync();

  • multicast注册

    ServiceConfig config = new ServiceConfig(10086);

    // 设置注册类型
    config.setRegistryType(1);

    // 设置注册地址,不设置时使用默认值(234.69.69.69:56969)
    config.setRegistryAddress(“234.69.69.69:56969”);
    ServiceFactory factory = new ServiceFactory(config);

    // 注册服务
    factory.register(new SayImpl());
    // 指定服务版本
    factory.register(new SayImpl2(), “2”);

    factory.start();
    // 服务端常驻
    factory.sync();

客户端

  • 直连方式

    ClientConfig config = new ClientConfig();

    // 设置长连接空闲超时时间,默认120秒
    config.setIdleTimeout(120);

    // 直连时设置服务端地址
    config.setRegistryAddress(“localhost:10086”);

    // 是否异步调用,默认为同步
    config.setAsync(false);
    ReferenceFactory factory = new ReferenceFactory(config);

    // 创建接口代理
    Say say = factory.create(Say.class);
    // 调用接口
    String result = say.hello(msg);

  • multicast方式

    ClientConfig config = new ClientConfig();

    // 开启异步调用
    config.setAsync(true);

    // 指定注册地址,不填则使用默认值(234.69.69.69:56969)
    config.setRegistryAddress(“234.69.69.69:56969”);
    ReferenceFactory factory = new ReferenceFactory(config);

    // 创建指定版本的接口代理
    Say say = factory.create(Say.class, “2”);
    // 调用接口,注意异步方式返回值为null
    say.hello(msg);

    // 异步方式下需要调用如下方法获取Future
    ResultFuture future = ResultFuture.future();

    // 设置回调
    future.setOnSuccess(System.out::println);
    future.setOnFailure(System.out::println);

    // 获取结果
    future.get();
    // 获取结果,有等待超时时间
    future.get(1, TimeUnit.SECONDS);