startClusterServers static method

dynamic startClusterServers({
  1. bool machineBind = false,
  2. String machineFile = '/etc/hostname',
  3. required String environment,
  4. required Map<String, Map<String, List<EasyClusterNodeConfig>>> envClusterServerConfig,
  5. Map<String, Map<String, EasyServerEntryPoint>>? envClusterServerEntryPoint,
  6. Map<String, EasyClusterNodeConfig>? envDefaultServerConfig,
  7. Map<String, EasyServerEntryPoint>? envDefaultServerEntryPoint,
  8. String? defaultLogFolder,
  9. bool runErrorsZone = true,
  10. bool errorsAreFatal = false,
})

启动服务器集群

  • machineBind 是否只启动与机器名称对应的进程
  • machineFile 机器名称文件的绝对路径
  • environment 当前启动的环境
  • envClusterServerConfig 环境集群配置信息
  • envClusterServerEntryPoint 环境集群入口函数
  • envDefaultServerConfig 环境默认配置信息
  • envDefaultServerEntryPoint 环境默认入口函数
  • defaultLogFolder 默认日志文件输出文件夹
  • runErrorsZone 在runZonedGuarded函数中运行子线程逻辑
  • errorsAreFatal 为true时若在子线程中产生未捕获的异常,将终止子线程的运行

Implementation

static startClusterServers({
  bool machineBind = false,
  String machineFile = '/etc/hostname',
  required String environment,
  required Map<String, Map<String, List<EasyClusterNodeConfig>>> envClusterServerConfig,
  Map<String, Map<String, EasyServerEntryPoint>>? envClusterServerEntryPoint,
  Map<String, EasyClusterNodeConfig>? envDefaultServerConfig,
  Map<String, EasyServerEntryPoint>? envDefaultServerEntryPoint,
  String? defaultLogFolder,
  bool runErrorsZone = true,
  bool errorsAreFatal = false,
}) async {
  final clusterServerConfig = envClusterServerConfig[environment];
  final clusterServerEntryPoint = envClusterServerEntryPoint?[environment];
  final defaultServerConfig = envDefaultServerConfig?[environment];
  final defaultServerEntryPoint = envDefaultServerEntryPoint?[environment];
  final finalServerConfig = <String, List<EasyServerConfig>>{}; //解析后的服务器集群配置信息
  final finalLogFileFolder = defaultLogFolder ?? '${Directory.current.path}/logs'; //日志文件输出文件夹
  clusterServerConfig?.forEach((cluster, serverConfigList) {
    finalServerConfig[cluster] = [];
    for (var serverConfig in serverConfigList) {
      final isolateInstances = serverConfig.isolateInstances ?? defaultServerConfig?.isolateInstances ?? 1;
      for (var i = 0; i < isolateInstances; i++) {
        finalServerConfig[cluster]?.add(
          EasyServerConfig.fromClusterNodeConfig(
            serverConfig: serverConfig,
            globalConfig: defaultServerConfig,
            defaultLogTag: '$environment-$cluster-${serverConfig.host}:${serverConfig.port}${isolateInstances > 1 ? '-$i' : ''}',
            defaultLogFilePath: '$finalLogFileFolder/$environment-$cluster-${serverConfig.port}${isolateInstances > 1 ? '-$i' : ''}',
          ),
        );
      }
    }
  });
  finalServerConfig.forEach((cluster, serverConfigList) {
    for (var serverConfig in serverConfigList) {
      serverConfig.initClusterLinksConfigs(finalServerConfig); //初始化需要远程连接的集群分组配置信息
      if (machineBind && serverConfig.host != File(machineFile).readAsStringSync().trim()) {
        continue; //不匹配主机名
      }
      final serverEntryPoint = clusterServerEntryPoint?[cluster] ?? defaultServerEntryPoint;
      _workerList.add(worker.create(WkConfig(
        serviceConfig: {
          'environment': environment,
          'cluster': cluster,
          'serverConfig': serverConfig,
          'serverEntryPoint': serverEntryPoint,
        },
        serviceHandler: _serviceHandler,
        messageHandler: _messageHandler,
      )));
    }
  });
  for (var wk in _workerList) {
    await wk.start(runErrorsZone: runErrorsZone, errorsAreFatal: errorsAreFatal);
  }
}