golang uber fx 在 ipfs 中使用的学习笔记

2020-07-20  本文已影响0人  一眼万年04

fx是 go.uber.org/fx 依赖注入包,目前ipfs的启动过程采用了fx的方式

附上学习总结:

1.fx.New(...)是fx初始化的地方,启动时主要里面包含[]Option,启动后生成根对象app

2.Option的设计思路是让参数传递更加优雅,libp2p也是采用这种方式,原作者文章:https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html

3.目前的Option主要包含:provide start/stopTimeout supply validate invoke annotated等, ipfs只使用了provide和invoke

4.provide是将多个构造函数放到fx中,支持组合放入,放入之后fx会对每个option展开,然后一一放入fx中,效果和单个放入每个option一样,但是方便了option过多时的管理,如:

```

app :=fx.New(

node.IPFS(ctx,cfg),

//fx.NopLogger,

  fx.Extract(n),

)

```

5.invoke是触发调用option中构造函数的地方,只有invoke中依赖的provide才会执行,完成这个依赖才执行效果的是uber的另外一个库:go.uber.org/dig, fx像是dig的一个壳,(时间关系,未能再去研究)

6.fx中还有一个lifecycle的概念,直接隶属于根对象app,用于完成对象启动和停止时的Hook(钩子)操作,主要包含OnStart和OnStop两个方法,用户可以在要初始化的对象中定义自己的OnStart/OnStop方法,然后append到app.lifecycle.Hooks中

7.app的启动主要包含start stop run,其中run就是将start和stop组合起来,调用一次相当于两个都调用了,ipfs是直接用的start/stop

8.fx.New步骤:

  1.按添加顺序加载provide

  2.加载lifecycle

  3.加载dotGraph,用于构建对象引用图,在dig中实现

  4.按照添加顺序加载invoke中的方法,都加载之后,再执行invoke中的方法

9.app.start:按照hook append的顺序依次执行每个对象初始化时添加进lifecycle的Onstart,默认若15s内未执行完,视为出错,app.start失败,程序退出。所以不要在hook中做监听类的事情

10.app.stop:按照hook append的相反顺序依次执行每个对象初始化时添加进lifecycle的Onstop,默认若15s内未执行完,视为出错,app.stop失败,程序退出。所以不要在hook中做监听类的事情

11.总流程:

上一篇 下一篇

猜你喜欢

热点阅读