Skip to content

channel

maggie edited this page Sep 27, 2020 · 2 revisions

Channel模块重构

  • 模块介绍

  • 重构任务

  • 重构方案

1. 模块介绍

已经满足职能:

  • 消息分发
    • 接收到RPC/AOMP/Event Push/心跳等消息后触发回调
    • 消息回调
  • 消息发送
    • 周期性心跳
    • 握手协议
    • RPC/AOMP/Event Push
    • 其他消息
  • 节点状态维护
    • 维护节点信息(版本、是否国密)
    • 维护握手成功的状态信息

缺陷:

  • 强耦合
    • Channel模块与Network、AOMP、EventPush等模块强耦合。
    • Network模块处理所有模块的业务消息反应。
  • 代码膨胀
    • Channel模块使用大量的If else进行消息转发。

新需求:

  • 允许同时连接多个组。

2 重构任务

重构任务 类型 解决方法
网络层的配置功能不合理 缺陷 重构点1: 重新规定网络配置的方法
Channel与其它模块强耦合。 缺陷 见Network模块重构点1,2,3,4
Channel层代码膨胀 缺陷 该转发工作已经交给Network模块做,见Network模块重构点2
消息发送(指定节点发送/其他策略注册) 新需求 重构点5: 新增两种的消息传输方式
允许同时连接多个组 新需求 重构点2: 新增群组管理功能

3 重构方案

重构点1: 修改配置方式

重构前问题在于:

  • 组名配错,不会报错;执行某些与组名相关的交易时,若获取了错误的组名则会报错。
  • 不允许同时连接多个组。

应用部门还希望:

  • 添加一个“指定节点发送”。
  • 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>

重构方案:

  1. 新增使用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);
  2. 允许连接不同组的节点,允许指定发送对象

    在节点配置时不设置组别,方便AMOP等不关心组的功能的使用。指定节点发送见Client模块设计。

    // 初始化Channel
    ConfigOpts config = Config.FromFile("./bcos_config.yaml");
    Channel channel = channel.New(config);
    
    // 初始化AMOP模块
    AMOP amop = Amop.build(channel, config);
Clone this wiki locally