存证服务API Client与区块链节点使用自定义的rpc协议连接,本文介绍Java SDK实现的API Client的原理与配置。
Client
Client类是antblockchain-gl API通讯协议的实现,Client是线程安全的,多线程可以显著提高SDK的性能,但不是越多越好,用户需要根据实际需求测试最合理的线程数。
Client采用延迟连接,Client创建后并不会立即与server连接,当发生接口调用时才会尝试连接server。默认的尝试次数是3次,每次都会先尝试连接主节点,接着尝试所有的备份节点。一旦主节点连接失败则会每隔固定时间(默认10秒)进行1次主连接尝试,如果此时正处于跟备份节点连接中则会断开跟备份节点的连接,重新选择主节点连接。总之,由于联盟链网络一般都是跨机构,只有机构自己的节点(主节点)有最好的网络环境,其它备份节点(一般是别的机构的节点)的网络延迟都较大,所以Client会尽可能选择主节点连接。
Client没有请求失败重发机制,比如请求发送过程中连接断开导致请求发送失败,接口返回的Reponse会携带errorMsg,是否重发请求由调用方决定。
Client中的netty只有1个io线程,与server的channel连接也只有1个。io线程只处理读写,所有的业务逻辑都在业务线程池中处理。Client使用的ssl provider是netty-tcnative-boringssl-static,会比Java自带的provider性能高。
Config
创建Client需要ClientConfig,ClientConfig是一个接口,SDK提供默认的实现ClientPropertyConfig。ClientPropertyConfig通过读取properties文件获取配置。
ClientPropertyConfig | 说明 | 必须 | 值 |
---|---|---|---|
biz.sdk.primary | 主节点API地址,主节点必须且只能配置1个 | 是 | 127.0.XXX.XXX:8080 |
biz.sdk.backups | 备份节点API地址,备份节点可以配置0个或多个 | 否 | 127.0.XXX.XXX:8080;127.0.XXX.XXX:8081 |
biz.sdk.primary_auto_reconnect_interval | 主节点失效后,自动尝试重连的间隔时间(秒为单位) | 否 | 默认是10秒 |
biz.sdk.ssl_key | pkcs8格式的SSL私钥文件绝对路径 | 否 | 默认是空 |
biz.sdk.ssl_cert | x509格式的SSL证书文件绝对路径 | 否 | 默认是空 |
biz.sdk.ssl_key_password | SSL私钥密码 | 否 | 默认是空 |
biz.sdk.trust_store | trust store文件绝对路径 | 否 | 默认是空 |
biz.sdk.trust_store_password | trust store密码 | 否 | 默认是空 |
biz.sdk.protocol | 通信协议名字,如果为null,则使用默认的Protocol名字 | 否 | 默认是1.0 |
biz.sdk.biz_thread_pool_size | 业务线程池大小,如果为非正数,则使用默认的业务线程池大小 | 否 | 默认是CPU核数*2 |
biz.sdk.read_idle_time | 读空闲时间(秒为单位),超过该时间SDK会向Server发送Ping消息 | 否 | 默认是60秒 |
biz.sdk.send_one_way_message_timeout | 单向消息发送超时时间(毫秒为单位),超过该时间就认为发送失败 | 否 | 默认15000 |
biz.sdk.wait_response_timeout | 双向消息应答超时时间(毫秒为单位),超过该时间就认为应答失败 | 否 | 默认30000 |
biz.sdk.socket_send_buffer_size | socket发送缓冲区大小,如果为非正数则使用Java默认的缓冲区大小 | 否v | 默认0 |
biz.sdk.socket_recv_buffer_size | socket接收缓冲区大小,如果为非正数则使用Java默认的缓冲区大小 | 否 | 默认0 |
biz.sdk.tcp_no_delay | 是否开启Nagle算法 | 否 | 默认false |
biz.sdk.explicit_flush_after_flushes | netty的flush合并策略阈值,如果为正数则开启flush合并 | 否 | 默认0 |
所有的API地址都可以有两种形式:127.0.XXX.XXX:8080或者127.0.XXX.XXX 8081
目前的测试网络中server没有开启SSL,所以client无需配置SSL参数。如果发送的请求比较大可以适当将socket发送缓冲区设置的大点。设置tcp_no_delay需要慎重,如果是单线程使用client且发送的包较小,则容易遇到40ms延迟问题。如果发送的包比较小且高频,可以尝试开启flush合并,对性能提升有帮助。