Start HTTP Server in Bookie Standlone Mode (#2496)

### Motivation
- when you launch "bookkeeper standalone" service the system does not take into account the HTTP Server configuration
- the HTTP Server is important because it allows to use the HTTP API https://bookkeeper.apache.org/docs/latest/admin/http/
- the standalone service is very useful when you are working on client applications (like BKVM)

### Changes

- consider HTTP server configuration in 'bin/bookkeeper standalone' command
- add default example configuration
- add VertxHttpServer to dependencies of Standalone Module
- the change is basically a copy and paste of this part of Main.java, but applied to the Main class of the Standalone Starter, which is a separate code: https://github.com/apache/bookkeeper/blob/master/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/Main.java#L327


 ## Verify this change
After this change when you run "bookkeeper standalone" the HTTP API will be enabled
For instance you can check the Bookie API with
http://localhost:8080/api/v1/bookie/info
diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/HttpService.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/HttpService.java
index e5dffc9..d4415a5 100644
--- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/HttpService.java
+++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/server/service/HttpService.java
@@ -47,7 +47,8 @@
 
         HttpServerLoader.loadHttpServer(conf.getServerConf());
         server = HttpServerLoader.get();
-        checkNotNull(server);
+        checkNotNull(server, "httpServerClass is not configured or it could not be started,"
+                + " please check your configuration and logs");
         server.initialize(provider);
     }
 
diff --git a/conf/standalone.conf b/conf/standalone.conf
index 17dd3c3..fb54adc 100755
--- a/conf/standalone.conf
+++ b/conf/standalone.conf
@@ -31,3 +31,16 @@
 
 # the cluster controller schedule interval, in milliseconds. default is 30 seconds.
 storage.cluster.controller.schedule.interval.ms=30000
+
+#################################################################
+# httpserver
+#################################################################
+
+# The flag enables/disables starting the admin http server. Default value is 'false'
+httpServerEnabled=true
+
+# The http server port to listen on. Default value is 8080.
+httpServerPort=8080
+
+# The http server class
+httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer
diff --git a/stream/server/pom.xml b/stream/server/pom.xml
index 70dd62f..0df6db3 100644
--- a/stream/server/pom.xml
+++ b/stream/server/pom.xml
@@ -40,6 +40,12 @@
       <groupId>com.beust</groupId>
       <artifactId>jcommander</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.bookkeeper.http</groupId>
+      <artifactId>vertx-http-server</artifactId>
+      <version>${project.parent.version}</version>
+      <scope>runtime</scope>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/stream/server/src/main/java/org/apache/bookkeeper/stream/server/StorageServer.java b/stream/server/src/main/java/org/apache/bookkeeper/stream/server/StorageServer.java
index 278aaf2..024343e 100644
--- a/stream/server/src/main/java/org/apache/bookkeeper/stream/server/StorageServer.java
+++ b/stream/server/src/main/java/org/apache/bookkeeper/stream/server/StorageServer.java
@@ -38,6 +38,8 @@
 import org.apache.bookkeeper.conf.ServerConfiguration;
 import org.apache.bookkeeper.discover.BookieServiceInfo;
 import org.apache.bookkeeper.meta.zk.ZKMetadataDriverBase;
+import org.apache.bookkeeper.server.http.BKHttpServiceProvider;
+import org.apache.bookkeeper.server.service.HttpService;
 import org.apache.bookkeeper.statelib.impl.rocksdb.checkpoint.dlog.DLCheckpointStore;
 import org.apache.bookkeeper.stats.NullStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
@@ -213,8 +215,9 @@
 
         // Create the stats provider
         StatsLogger rootStatsLogger;
+        StatsProviderService statsProviderService = null;
         if (startBookieAndStartProvider) {
-            StatsProviderService statsProviderService = new StatsProviderService(bkConf);
+            statsProviderService = new StatsProviderService(bkConf);
             rootStatsLogger = statsProviderService.getStatsProvider().getStatsLogger("");
             serverBuilder.addComponent(statsProviderService);
             log.info("Bookie configuration : {}", bkConf.asJson());
@@ -234,6 +237,22 @@
             BookieService bookieService = new BookieService(bkConf, rootStatsLogger, bookieServiceInfoProvider);
             serverBuilder.addComponent(bookieService);
             bkServerConf = bookieService.serverConf();
+
+            // Build http service
+            if (bkServerConf.isHttpServerEnabled()) {
+                BKHttpServiceProvider provider = new BKHttpServiceProvider.Builder()
+                        .setBookieServer(bookieService.getServer())
+                        .setServerConfiguration(bkServerConf)
+                        .setStatsProvider(statsProviderService.getStatsProvider())
+                        .build();
+                HttpService httpService =
+                        new HttpService(provider,
+                                new org.apache.bookkeeper.server.conf.BookieConfiguration(bkServerConf),
+                                rootStatsLogger);
+                serverBuilder.addComponent(httpService);
+                log.info("Load lifecycle component : {}", HttpService.class.getName());
+            }
+
         } else {
             bkServerConf = new ServerConfiguration();
             bkServerConf.loadConf(bkConf.getUnderlyingConf());
diff --git a/stream/server/src/main/java/org/apache/bookkeeper/stream/server/service/BookieService.java b/stream/server/src/main/java/org/apache/bookkeeper/stream/server/service/BookieService.java
index 4b8080c..f9b655c 100644
--- a/stream/server/src/main/java/org/apache/bookkeeper/stream/server/service/BookieService.java
+++ b/stream/server/src/main/java/org/apache/bookkeeper/stream/server/service/BookieService.java
@@ -82,6 +82,10 @@
         // no-op
     }
 
+    public BookieServer getServer() {
+        return bs;
+    }
+
     @Override
     public void publishInfo(ComponentInfoPublisher componentInfoPublisher) {
         try {