Apache BookKeeper 是一个可以方便扩展,高可用,低延迟的存储系统。BookKeeper 专门为 append-only 的工作模式提供了优化,在以下的应用场景中非常适用:
WAL (Write-Ahead-Logging), 例如 HDFS 的 NameNode
消息存储系统,例如 Apache Pulsar
Offset/Cursor 存储系统,例如在 Apache Pulsar 中用来存储消息消费位置
Object/Blob Store 对象存储系统,例如存储状态机的 snapshots
1 | public static void main(String[] args) { |
注释很清晰,可以看到启动bookie服务主要做这三步:
- 解析system property
- 构建bookie服务所需的组件
- 启动各个组件
解析system property
1 | BasicParser parser = new BasicParser(); |
system property是java应用程序自身指定的变量,通常我们可以在启动应用的时候指定的,格式是:-DsystemPropertyKey=systemPropertyValue(楼主在本地启动bookie服务在idea设置的Program rguments:–conf /Volumes/longmao/bookkeeper-confg/b1.conf),解析system property使用了apache开源工具commons-cli(自己写应用或框架可以借鉴下其写法,用来加载应用自定义的配置)。
1 | static { |
含义:
- -c/–conf:使用的配置文件
- -r/–readOnly:是否只读
构建bookie服务所需的组件
1 | public static LifecycleComponentStack buildBookieServer(BookieConfiguration conf) throws Exception { |
利用第一步解析配置生成的BookieConfiguration对象构造bookie服务依赖的组件,bookie启动过程中需要启动的服务组件:
- StatsProviderService 指标服务
- BookieService bookie服务
- AutoRecoveryService 自动恢复服务
- HttpService http rest服务
- 其它服务
利用了LifecycleComponentStack这各类保存了需要启动的组件并规定了组件生命周期内执行的方法:
1 | @Override |
有没有觉得很熟悉,tomcat源码里也有类似的设计,tomcat中的接口:org.apache.catalina.Lifecycle 定义了容器生命周期、容器状态转换及容器状态迁移事件的监听器和移除等主要接口,tomcat里的组件StandardHost等实现了这个接口,维护自身生命周期运转过程中要执行的逻辑。只能说优秀的源码套路都是差不多^_^
启动服务
遍历LifecycleComponentStack中的
ImmutableList