Solon rpc 之 SocketD 協議 - 單連接雙向RPC模式

Solon rpc 之 SocketD 協議系列
Solon rpc 之 SocketD 協議 - 概述
Solon rpc 之 SocketD 協議 - 消息上報模式
Solon rpc 之 SocketD 協議 - 消息應答模式
Solon rpc 之 SocketD 協議 - 消息訂閱模式
Solon rpc 之 SocketD 協議 - RPC調用模式
Solon rpc 之 SocketD 協議 - 單連接雙向RPC模式
Solon rpc 之 SocketD 協議 - 消息加密模式html

SocketD 是一種二進制的點對點通訊協議,是一種新的網絡通訊第七層協議。旨在用於分佈式應用程序中。從這個意義上講,SocketD能夠是RSocket等其餘相似協議的替代方案。它的消息協議規範具備異步,背壓的雙向,多路複用,斷線重連,基於消息等特性。暫時只提供Java實現,目前作爲Solon rpc的sockte通道協議。java

本案以單連接雙向RPC模式爲例演示:(在RPC調用模式基礎上,增長服務端反向接口調用)git

包依賴

<parent>
    <groupId>org.noear</groupId>
    <artifactId>solon-parent</artifactId>
    <version>1.2.18</version>
</parent>
    
<dependencies>
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>solon.boot.socketd.smartsocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>solon.serialization.snack3</artifactId>
    </dependency>

    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>nami.channel.socketd.smartsocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.noear</groupId>
        <artifactId>nami.coder.snack3</artifactId>
    </dependency>
</dependencies>

接口定義

Rpc 模式借用了 Nami 作客戶端定義(Nami 是 Solon 伴生框架,定位爲 Rpc 通用客戶端)網絡

@NamiClient("demo:/demoe/rpc")
public interface HelloService {
    String hello(String name);
}

@NamiClient("demo:/demoe/rpc/name")
public interface NameService {
    String name(String name);
}

服務端

//啓動服務端
public class ServerApp {
    public static void main(String[] args) {
        //啓動Solon容器(SocketD bean&plugin 由solon容器管理)
        Solon.start(ServerApp.class, args, app -> app.enableSocketD(true));
    }
}

//定義遠程服務組件(供客戶端調用)
@Mapping(value = "/demoe/rpc", method = MethodType.SOCKET)
@Component(remoting = true)
public class HelloServiceImpl implements HelloService {
    public String hello(String name) {
        //[服務端] 反向調用 [客戶端] 的遠程服務組件***
        NameService rpc = SocketD.create(Context.current(), NameService.class);
        name = rpc.name(name);
    
        return "name=" + name;
    }
}

客戶端

//啓動客戶端
public class ClientApp {
    public static void main(String[] args) throws Throwable {
        //啓動Solon容器(SocketD bean&plugin 由solon容器管理)
        Solon.start(ClientApp.class, args);
        
        //[客戶端] 調用 [服務端] 的 rpc
        //
        HelloService rpc = SocketD.create("tcp://localhost:28080", HelloService.class);

        System.out.println("RPC result: " + rpc.hello("noear"));
    }
}

//定義遠程服務組件(供服務端調用)
@Mapping(value = "/demoe/rpc/name", method = MethodType.SOCKET)
@Component(remoting = true)
public class NameServiceImpl implements NameService {
    @Override
    public String name(String name) {
        return name + "2";
    }
}

附:源碼

https://gitee.com/noear/solon_demo/tree/master/demo28.solon_socketd_rpcapp

相關文章
相關標籤/搜索