Solon v3.0.5

solon-serialization-abc

</> markdown

此插件,由社区成员(rainbing)贡献

<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-serialization-abc</artifactId>
</dependency>

1、描述

序列化扩展插件,为 Solon Serialization 提供基于 abc (基于定制的序列化方案)的框架适配。此插件,要求交互的数据为实体类!(实体类内部,可以有 Map 或 List 或 泛型)

这插件主要用作 Solon Rpc 的服务端序列化方案(v3.0.4 后支持),使用时,需要添加可选框架:

org.agrona:agrona:${agrona-sbe.version} # 提供 sbe 序列化支持
net.openhft:chronicle-bytes:${chronicle-bytes.version} # 提供 chronicle-bytes 序列化支持

solon-serialization-abc 是个开放的序列化插件,可以自由扩展与定制。

2、主要接口实现类

实现接口备注
AbcBytesSerializerSerializerabc 序列化器
AbcRenderRender用于处理 abc 渲染输出
AbcActionExecutorActionExecuteHandler用于执行 abc 内容的请求

何时会被时用?当 Content-Type 为 application/abc 时会执行。

3、应用示例

  • 公用包(以 sbe 为例)
@ToString
@Setter
@Getter
public class MessageDo implements SbeSerializable { //定制时,只需要定义自己的序列化接口即可!
    private long id;
    private String title = "";

    @Override
    public void serializeRead(SbeInput in) {
        id = in.readLong();
        title = in.readString();
    }

    @Override
    public void serializeWrite(SbeOutput out) {
        out.writeLong(id);
        out.writeString(title);
    }
}
  • 服务端(只支持 @Body 数据接收,只支持实体类)
@Mapping("/rpc/demo")
@Remoting
public class HelloServiceImpl {
    @Override
    public MessageDo hello(@Body MessageDo message) { //还可接收路径变量,与请求上下文
        return message;
    }
}
  • 客户端应用 for HttpUtils(只支持 body 数据提交,只支持实体类)
#添加插件
org.noear:solon-net-httputils
//应用代码
@Component
public class DemoCom {
    public MessageDo hello() {
        MessageDo message = new MessageDo();
        message.setId(3);
        
        //指明请求数据为 PROTOBUF,要求数据为 PROTOBUF
        return HttpUtils.http("http://localhost:8080/rpc/demo/hello")
                .serializer(AbcBytesSerializer.getInstance())
                .header(ContentTypes.HEADER_CONTENT_TYPE, ContentTypes.PROTOBUF_VALUE)
                .header(ContentTypes.HEADER_ACCEPT, ContentTypes.PROTOBUF_VALUE)
                .bodyOfBean(message)
                .postAs(MessageDo.class);
    }
}

  • 客户端应用 for Nami(只支持 body 数据提交,只支持实体类)
#添加插件
org.noear:nami-coder-abc
org.noear:nami-channel-http
//应用代码
public interface HelloService {
    MessageDo hello(@NamiBody MessageDo message);
}

@Component
public class DemoCom {
    @NamiClient(url = "http://localhost:8080/rpc/demo", headers = {ContentTypes.ABC, ContentTypes.ABC_ACCEPT})
    HelloService helloService;
  
    public MessageDo hello() {
         MessageDo message = new MessageDo();
         message.setId(3);
        
         rerturn helloService.hello(message);
    }
}

4、示例代码

https://gitee.com/opensolon/solon-examples/tree/main/7.Solon-Remoting-Rpc/demo7031-nami-coder-abc