Corda是什么?
- Corda is an open-source blockchain platform.
- 节点与节点之间通过RPC调用,最终完成一个分布式账本。
Corda使用Netty概况
-
总览
说明1,采用主从模式。
2,使用NioServerSocketChannel::class.java反射方式创建channel实例。创建channel实例过程理解
3,为workerGroup添加handler,也就是添加业务handler。
4,绑定ip和port,启动服务。
-
pipeline
说明
1, 继承Netty的ChannelInitializer < SocketChannel>()
2, 重写initChannel()这个方法,这是一个中介,当它把handler添加到pipeline中,会把自己给移除掉。这里添加Netty自带的SslHandler到pipeline中。
3,添加AMQPChannelHandler()到pipeline中。
sslHandler说明
A:TLS的版本(TLSV1.2)
B: 签名套件
C:SslHandler是Netty提供的Handler,开箱即用。
AMQPChannelHandler说明
重写userEventTriggered方法
createAMQPEngine(ctx)
A:EventProcessor类继承了开源工具proton-j提供的BashHandler类。并重写相应的核心方法。gradle构建:compile “org.apache.qpid:proton-j:0.21.0”
B:先传播,然后异步处理事件(这里处理的方式是交给proton-j去处理执行的,线程池是channel.eventLoop(),也就是workerGroup那个线程池执行业务逻辑的)
channelRead0()
A: 交给proton-j处理消息,比如粘包和拆包问题的解决。
B: 防止Netty的内存泄漏。
C:使用Netty的workerGroup提供的线程池执行业务逻辑handler()
-
线程模型
主从模式,bossGroup一个线程,workerGroup程序写死4个线程。
Corda使用Netty的一些技巧
-
使用Proton-j开源工具(移除handler,而不是在事件触发或者channalRead0()方法中移除)
从上面的 AMQPChannelHandler说明 ,我们了解到,当Corda判断事件类型是SslHandshakeCompletionEvent,并且执行成功后,无论是在userEventTriggered方法还是channelRead方法,我们都没有看见Corda移除该handler。 -
如何解决TCP的粘包和拆包问题。
在pipeline中,我们没有看见Corda使用一次编解码和二次编解码,那它又是怎么处理这些问题的呢?
数据的序列化,(编码)完全交接Proton-j来进行。
处理输入数据
处理输出数据
Corda使用Netty可以优化的地方
- 执行Corda业务逻辑的线程池,是workerGroup中的线程池。这里完全可以使用一个新的线程池来执行业务逻辑。
- Corda的最大等待连接数是100。 可以设置得更大,比如1024。
- 没有设置读写空闲。