-
Notifications
You must be signed in to change notification settings - Fork 59
channel
maggie edited this page Sep 27, 2020
·
2 revisions
-
模块介绍
-
重构任务
-
重构方案
已经满足职能:
- 消息分发
- 接收到RPC/AOMP/Event Push/心跳等消息后触发回调
- 消息回调
- 消息发送
- 周期性心跳
- 握手协议
- RPC/AOMP/Event Push
- 其他消息
- 节点状态维护
- 维护节点信息(版本、是否国密)
- 维护握手成功的状态信息
缺陷:
- 强耦合
- Channel模块与Network、AOMP、EventPush等模块强耦合。
- Network模块处理所有模块的业务消息反应。
- 代码膨胀
- Channel模块使用大量的If else进行消息转发。
新需求:
- 允许同时连接多个组。
重构任务 | 类型 | 解决方法 |
---|---|---|
网络层的配置功能不合理 | 缺陷 | 重构点1: 重新规定网络配置的方法 |
Channel与其它模块强耦合。 | 缺陷 | 见Network模块重构点1,2,3,4 |
Channel层代码膨胀 | 缺陷 | 该转发工作已经交给Network模块做,见Network模块重构点2 |
消息发送(指定节点发送/其他策略注册) | 新需求 | 重构点5: 新增两种的消息传输方式 |
允许同时连接多个组 | 新需求 | 重构点2: 新增群组管理功能 |
重构前问题在于:
- 组名配错,不会报错;执行某些与组名相关的交易时,若获取了错误的组名则会报错。
- 不允许同时连接多个组。
应用部门还希望:
- 添加一个“指定节点发送”。
- SDK内置一个群组管理的功能,在配置时只配置节点,SDK自动识别节点所在的组,提供给应用参考。
- 这个暂时没有办法满足,先记入需求列表。原因是:节点的群组是会变动的,节点目前不会推送群组信息。因此,SDK需要轮询查询节点所在组别,才能满足需要,这个方法不太友好。
<bean id="groupChannelConnectionsConfig"
class="org.fisco.bcos.channel.handler.GroupChannelConnectionsConfig">
<property name="caCert" value="ca.crt" />
<property name="sslCert" value="sdk.crt" />
<property name="sslKey" value="sdk.key" />
<property name="allChannelConnections">
<list>
<bean id="group1"
class="org.fisco.bcos.channel.handler.ChannelConnections">
<property name="groupId" value="1" />
<property name="connectionsStr">
<list>
<value>127.0.0.1:20200</value>
<value>127.0.0.1:20201</value>
</list>
</property>
</bean>
<bean id="group2"
class="org.fisco.bcos.channel.handler.ChannelConnections">
<property name="groupId" value="2" />
<property name="connectionsStr">
<list>
<value>127.0.0.1:20202</value>
<value>127.0.0.1:20203</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
<bean id="channelService"
class="org.fisco.bcos.channel.client.Service"
depends-on="groupChannelConnectionsConfig">
<property name="groupId" value="1" />
<property name="agencyName" value="fisco" />
<property name="allChannelConnections"
ref="groupChannelConnectionsConfig"></property>
</bean>
重构方案:
-
新增使用toml文件配置
同时支持toml和Spring,新建config模块用于解读配置。
优势:
- 减少依赖。用户不需要额外引用Spring的包,创建一个文本文件即可配置好SDK
- 容易移植。多种SDK都可以使用yaml文件配置,一套配置文件可以用在python-sdk, go-sdk等多个SDK
- 写法舒适。yaml比起JSON、xml少很多标签如“< key > </ key>”和“[{},{}]"
配置格式:
[cryptoMaterial] certPath = "conf" # The certification path # The following configurations take the certPath by default: # caCert = "conf/ca.crt" # CA cert file path # sslCert = "conf/sdk.crt" # SSL cert file path # sslKey = "conf/sdk.key" # SSL key file path # enSslCert = "conf/gm/gmensdk.crt" # GM encryption cert file path # enSslKey = "conf/gm/gmensdk.key" # GM ssl cert file path [network] peers=["127.0.0.1:20200", "127.0.0.1:20201"] # The peer list to connect
使用方法:
ConfigOption configOption = Config.load("config-example.toml"); Channel channel = Channel.build(configOption);
-
允许连接不同组的节点,允许指定发送对象
在节点配置时不设置组别,方便AMOP等不关心组的功能的使用。指定节点发送见Client模块设计。
// 初始化Channel ConfigOpts config = Config.FromFile("./bcos_config.yaml"); Channel channel = channel.New(config); // 初始化AMOP模块 AMOP amop = Amop.build(channel, config);