改造官方的SDK,搭建开放服务平台,支持appId调用,支持代理上链。
总述
FISCO官方的SDK,一般使用都是连接一条链,然后通过SDK构造签名交易,jni发送到链上。jni的RPC连接一般项目启动的时候就初始化好,后续直接调用发送交易。
理解了官方的SDK使用后,现在就需要改造这个SDK设计出一个开放服务网关。
这个开放服务网关,支持申请appId,支持appId鉴权,支持appId余额扣费,支持代理上链。
正常的调用是这样的:构造交易 -> rpc请求 -> 上链 -> 获取结果。
那怎么改造呢?
把rpc请求切开,切成两份,在两份中间是不是就可以增加其他业务程序呢?如appId的鉴权扣费等。切开的两份,前一份获取到最终的上链参数,HTTP方式转发到两份中间。在中间,执行appId鉴权扣费,同时接收最终的上链参数。后一份,拿到最终的上链参数,通过jni连接,把交易发送到链上。这样是不是就实现了简单的开放服务网关呢。其中,前一份需要在客户端实现,作为一个项目存在。中间和后一份需要放在网关实现,可以在一个项目里,也可以拆分为两个项目,本文是设计在一个项目里。
然后调用顺序就是这样的:
构造交易 -> HTTP发送交易到网关 -> 网关鉴权扣费 -> rpc请求链 -> 上链 -> 网关获取结果 -> 客户端获取结果。
这里面,
- 构造交易不改变,还是使用SDK进行交易构造。不过这个SDK是经过改造的SDK,非官方原生SDK。但构造交易的方法不改变。
- 改造客户端SDK,实现HTTP转发rpc参数到网关。官方SDK需要注销Jni的初始化连接,禁止直接连接链。同时,把最终发送rpc交易参数的rpc方式修改为HTTP方式,实现直接转发到网关。这样,客户端只需要引入特定的SDK,配置一下网关和appId等,就可以把最终需要上链的rpc参数和网关相关参数转发到网关。
- 网关Nginx代理设计。网关配置Nginx前置代理,设置路由规则,不用的子链使用不同的请求后缀,这个后缀建议为链的群组名。通过路由,转发到不同的SpringBoot单体应用,每个应用单独对接一条链。这种既保证了性能,又方便扩展。如果需要增加一条链,就再启动一个SpringBoot应用,Nginx增加配置规则。
- 网关appId前置业务设计。appId模式是开放服务接口调用基本的设计,通过appId等参数校验请求的合法性,实现余额充值与扣减,实现第三方服务的调用。
- 网关上链后置业务设计。每一条子链对应一个SpringBoot应用,对于上链部分,应用会收到最终的rpc参数,这个参数可以通过rpc方式直接发送到链上的。所以后置业务需要做的就是接受客户端发出的rpc参数,转发到链上即可。
- 返回结果。返回结果到客户端需要两次,一次是网关接受上链的结果,一次是网关把上链结果返回给客户端。
改造SDK
configOption增加网关配置,支持配置文件注入网关信息。
注释jni初始化连接,应用可以不连接链启动,且禁止连接链。
修改callRemoteMethod方法,修改为HTTP请求转发到网关。
1 | public <T extends JsonRpcResponse<?>> T callRemoteHttpMethod( |
参考代码:https://gitee.com/yegetaier/bcos-sdk-3.3.0
网关对接链
- 网关SpringBoot应用接收改造SDK请求的rpc参数。
1 |
|
- SpringBoot应用使用官方SDK初始化项目,直接jni连接到链。
- 转发层实现,直接转发rpc参数上链。
1 |
|