in transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java [83:137]
public void start(Promise<Void> startPromise) throws Exception {
try {
super.start();
// 如果本地未配置地址,则表示不必监听,只需要作为客户端使用即可
if (endpointObject == null) {
LOGGER.warn("rest listen address is not configured, will not start.");
startPromise.complete();
return;
}
Router mainRouter = Router.router(vertx);
mountAccessLogHandler(mainRouter);
mountCorsHandler(mainRouter);
initDispatcher(mainRouter);
mountGlobalRestFailureHandler(mainRouter);
HttpServer httpServer = createHttpServer();
httpServer.requestHandler(httpServerRequest -> {
if (this.endpointObject.isWebsocketEnabled()) {
String path = LegacyPropertyFactory.getStringProperty("servicecomb.rest.server.websocket-prefix");
if (httpServerRequest.path().startsWith(path)) {
httpServerRequest.toWebSocket().onComplete(w -> webSocketDispatcher.onRequest(w),
e -> LOGGER.error("WebSocket error.", e));
return;
}
}
mainRouter.handle(httpServerRequest);
});
httpServer.connectionHandler(connection -> {
DefaultHttpServerMetrics serverMetrics = (DefaultHttpServerMetrics) ((ConnectionBase) connection).metrics();
DefaultServerEndpointMetric endpointMetric = serverMetrics.getEndpointMetric();
long connectedCount = endpointMetric.getCurrentConnectionCount();
int connectionLimit = LegacyPropertyFactory.getIntProperty("servicecomb.rest.server.connection-limit",
Integer.MAX_VALUE);
if (connectedCount > connectionLimit) {
connection.close();
endpointMetric.onRejectByConnectionLimit();
}
});
List<HttpServerExceptionHandler> httpServerExceptionHandlers =
SPIServiceUtils.getAllService(HttpServerExceptionHandler.class);
httpServer.exceptionHandler(e -> {
if (e instanceof ClosedChannelException) {
// This is quite normal in between browser and edge, so do not print out.
LOGGER.debug("Unexpected error in server.{}", ExceptionUtils.getExceptionMessageWithoutTrace(e));
} else {
LOGGER.error("Unexpected error in server.{}", ExceptionUtils.getExceptionMessageWithoutTrace(e));
}
httpServerExceptionHandlers.forEach(httpServerExceptionHandler -> httpServerExceptionHandler.handle(e));
});
startListen(httpServer, startPromise);
} catch (Throwable e) {
// vert.x got some states that not print error and execute call back in VertexUtils.blockDeploy, we add a log our self.
LOGGER.error("", e);
throw e;
}
}