Minio源码解析

启动流程

  • 检查Go运行版本是否大于1.9
  • 绑定command参数 重点是server gateway
    • server
    • gateway
    • update
    • version
  • 初始化cli.NewApp()
    • 就是实例化了一个type App的对象
  • 运行app实例
    • setup
      • 将各个command加入app的commands的数组中
    • run
      • setup
      • 生成context
      • HandleContextAction app.go#260
        • 如果有subCommand,
          • startApp()
          • app.RunAsSubcommand() command.go#302
        • HandleAction command,go#214
  • 返回前者运行实例

Gateway 运行

  • 在引入Gateway时,每个gateway的package的init函数中执行注册minio,RegisterGatewayCommand
  • 在RunAsSubcommand时获取对应Gateway的Action函数,比如xxGatewayMain
  • 在GatewayMain函数中执行minio.startGateway函数
  • 确认gateway监听地址,设置最大内存和最多打开文件和最大线程数量
  • 初始化NSLock
  • 初始化Router
    • STSRouter
    • AdminRouter
    • HealthCheck
    • MetricsRouter
    • WebRouter
    • APIRouter
  • 在另外一线程上启动globalHttpServer
  • signal.Notify() 启动系统信号
  • NewGatewayLayerc初始化成功
  • globalConfig 初始化
  • IAMSys 初始化
  • globalPolicySys 初始化
  • NotificationSys 初始化
  • globalObjectAPI 锁+初始化
  • handleSignals() 进程进入可中断的睡眠状态

Server 运行

同gateway运行基本无差异,除了两处,一处是使用ObjectLayer来初始化server-main#330,另一处为了支持分布式服务做的处理

在cmd/main,go中注册serverCmd时将Action:serverMain注册绑定

在serverMain函数中执行的流程如下:

  • 命令行参数处理 quiet\json
  • serverHandleCmdArgs()
    • handleCommonCmdArgs()处理通用的命令行参数
    • 获取serverAddr和endpoints,如果没有就使用默认参数创建createServerEndpoints()
  • 设置下启动类型 是globalIsXL还是globalIsDistXL
  • 设置TLS、CA
  • 根据环境变量设置 serverHandleEnvVars()
  • 和Gateway差异化的地方,如果是分布式部署,此时执行dsync.New(newDsyncNodes(globalEndpoints)) 同步
  • 初始化NSLock(传入是否分布式)
  • 设置各类handler configureServerHandler()
    • STSRouter
    • AdminRPCRouter
    • AdminRouter
    • HealthCheckRouter
    • MetricsRouter
    • WebRouter
    • APIRouter
  • 创建httpServer,在另一线程上启动
  • signal.Notify() 启动系统信号
  • 与Gateway初始化差异化的地方,NewObjectLayer初始化成功
    • 如果是FS类型,那么则直接使用FSObjectLayer
    • 如果不是则是需要XLSets类型Layer
  • globalConfig 初始化
  • IAMSys 初始化
  • globalPolicySys 初始化
  • NotificationSys 初始化
  • globalObjectAPI 锁+初始化
  • handleSignals() 进程进入可中断的睡眠状态