public void start() throws InstantiationException {
    logger.info("Starting RestServer");
    long startupBeginTime = System.currentTimeMillis();
    try {
      // ordering is important.
      reporter.start();
      long reporterStartTime = System.currentTimeMillis();
      long elapsedTime = reporterStartTime - startupBeginTime;
      logger.info("JMX reporter start took {} ms", elapsedTime);
      restServerMetrics.jmxReporterStartTimeInMs.update(elapsedTime);

      restResponseHandler.start();
      long restResponseHandlerStartTime = System.currentTimeMillis();
      elapsedTime = restResponseHandlerStartTime - reporterStartTime;
      logger.info("Response handler and Request Handler start took {} ms", elapsedTime);
      restServerMetrics.restResponseHandlerStartTimeInMs.update(elapsedTime);

      restRequestService.start();
      long restRequestServiceStartTime = System.currentTimeMillis();
      elapsedTime = restRequestServiceStartTime - restResponseHandlerStartTime;
      logger.info("Rest request service start took {} ms", elapsedTime);
      restServerMetrics.restRequestServiceStartTimeInMs.update(elapsedTime);

      nioServer.start();
      elapsedTime = System.currentTimeMillis() - restRequestServiceStartTime;
      logger.info("NIO server start took {} ms", elapsedTime);
      restServerMetrics.nioServerStartTimeInMs.update(elapsedTime);

      nettyInternalMetrics.start();
      logger.info("NettyInternalMetric starts");

      restServerState.markServiceUp();
      logger.info("Service marked as up");
    } finally {
      long startupTime = System.currentTimeMillis() - startupBeginTime;
      logger.info("RestServer start took {} ms", startupTime);
      restServerMetrics.restServerStartTimeInMs.update(startupTime);
    }
  }
Starts up all the components required. Returns when startup is FULLY complete.
@throws InstantiationException if the RestServer is unable to start.
ambry-rest/src/main/java/com/github/ambry/rest/RestServer.java