Skip to content

Commit

Permalink
Feat: Enhance http.server.port
Browse files Browse the repository at this point in the history
  • Loading branch information
LinShunKang committed Dec 6, 2020
1 parent 1391287 commit 25ded55
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,9 @@ private boolean needComputeMaxs(ClassLoader classLoader) {
String loaderName = getClassLoaderName(classLoader);
return loaderName.equals("org.apache.catalina.loader.WebappClassLoader")
|| loaderName.equals("org.apache.catalina.loader.ParallelWebappClassLoader")
|| loaderName.equals("org.springframework.boot.loader.LaunchedURLClassLoader");
|| loaderName.equals("org.springframework.boot.loader.LaunchedURLClassLoader")
|| loaderName.startsWith("org.apache.flink.runtime.execution.librarycache.FlinkUserCodeClassLoaders")
;
}

private String getClassLoaderName(ClassLoader classLoader) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,57 @@
package cn.myperf4j.base.config;

import cn.myperf4j.base.util.Logger;
import cn.myperf4j.base.util.StrUtils;

import java.util.List;

import static cn.myperf4j.base.config.MyProperties.getInt;
import static cn.myperf4j.base.config.MyProperties.getStr;
import static cn.myperf4j.base.constant.PropertyKeys.HttpServer.ACCEPT_COUNT;
import static cn.myperf4j.base.constant.PropertyKeys.HttpServer.MAX_WORKERS;
import static cn.myperf4j.base.constant.PropertyKeys.HttpServer.MIN_WORKERS;
import static cn.myperf4j.base.constant.PropertyKeys.HttpServer.PORT;
import static cn.myperf4j.base.util.NumUtils.parseInt;

/**
* Created by LinShunkang on 2020/09/13
*/
public class HttpServerConfig {

private int port;
private int preferencePort;

private int minPort;

private int maxPort;

private int minWorkers;

private int maxWorkers;

private int acceptCount;

public int getPort() {
return port;
public int getPreferencePort() {
return preferencePort;
}

public void setPreferencePort(int preferencePort) {
this.preferencePort = preferencePort;
}

public int getMinPort() {
return minPort;
}

public void setPort(int port) {
this.port = port;
public void setMinPort(int minPort) {
this.minPort = minPort;
}

public int getMaxPort() {
return maxPort;
}

public void setMaxPort(int maxPort) {
this.maxPort = maxPort;
}

public int getMinWorkers() {
Expand Down Expand Up @@ -56,25 +81,41 @@ public void setAcceptCount(int acceptCount) {
@Override
public String toString() {
return "HttpServerConfig{" +
"port=" + port +
"preferencePort=" + preferencePort +
", minPort=" + minPort +
", maxPort=" + maxPort +
", minWorkers=" + minWorkers +
", maxWorkers=" + maxWorkers +
", acceptCount=" + acceptCount +
'}';
}

public static HttpServerConfig loadHttpServerConfig() {
Integer port = getInt(PORT);
if (port == null) {
port = 2048;
Logger.info(PORT.key() + " is not configured, so use '2048' as default.");
String portStr = getStr(PORT);
if (portStr == null) {
portStr = "2048,2000,2040";
Logger.info(PORT.key() + " is not configured, so use '" + portStr + "' as default.");
}

HttpServerConfig config = new HttpServerConfig();
config.setPort(port);
final HttpServerConfig config = new HttpServerConfig();
completePorts(config, portStr);
config.setMinWorkers(getInt(MIN_WORKERS, 1));
config.setMaxWorkers(getInt(MAX_WORKERS, 2));
config.setAcceptCount(getInt(ACCEPT_COUNT, 1024));
return config;
}

private static void completePorts(final HttpServerConfig config, final String portStr) {
final List<String> ports = StrUtils.splitAsList(portStr, ',');
if (ports.size() != 3) {
config.setPreferencePort(parseInt(ports.get(0), 2048));
config.setMinPort(2000);
config.setMaxPort(2040);
return;
}

config.setPreferencePort(parseInt(ports.get(0), 2048));
config.setMinPort(parseInt(ports.get(1), 2000));
config.setMaxPort(parseInt(ports.get(1), 2040));
}
}
33 changes: 33 additions & 0 deletions MyPerf4J-Base/src/main/java/cn/myperf4j/base/util/NetUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package cn.myperf4j.base.util;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.ServerSocket;

/**
* Created by LinShunkang on 2020/12/06
*/
public final class NetUtils {

public static final int MIN_PORT_NUMBER = 1;

public static final int MAX_PORT_NUMBER = 65535;

public static boolean isPortAvailable(int port) {
if (port < MIN_PORT_NUMBER || port > MAX_PORT_NUMBER) {
throw new IllegalArgumentException("Invalid port: " + port);
}

try (ServerSocket ss = new ServerSocket(port); DatagramSocket ds = new DatagramSocket(port)) {
ss.setReuseAddress(true);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
return false;
}
}

private NetUtils() {
//empty
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package cn.myperf4j.base.util;

import com.sun.net.httpserver.HttpServer;
import org.junit.Assert;
import org.junit.Test;

import java.io.IOException;
import java.net.InetSocketAddress;

/**
* Created by LinShunkang on 2020/12/06
*/
public class NetUtilsTest {

@Test
public void test() throws IOException {
final int port = 1234;
final HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
server.start();
Assert.assertFalse(NetUtils.isPortAvailable(port));
Assert.assertTrue(NetUtils.isPortAvailable(1235));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import static cn.myperf4j.base.metric.exporter.MetricsExporterFactory.getMemoryMetricsExporter;
import static cn.myperf4j.base.metric.exporter.MetricsExporterFactory.getMethodMetricsExporter;
import static cn.myperf4j.base.metric.exporter.MetricsExporterFactory.getThreadMetricsExporter;
import static cn.myperf4j.base.util.NetUtils.isPortAvailable;
import static cn.myperf4j.base.util.StrUtils.splitAsList;
import static cn.myperf4j.base.util.SysProperties.LINE_SEPARATOR;

Expand Down Expand Up @@ -430,7 +431,7 @@ private boolean initHttpServer() {
try {
final HttpServerConfig config = ProfilingConfig.httpServerConfig();
final SimpleHttpServer server = new SimpleHttpServer.Builder()
.port(config.getPort())
.port(choseHttpServerPort(config))
.minWorkers(config.getMinWorkers())
.maxWorkers(config.getMaxWorkers())
.acceptCnt(config.getAcceptCount())
Expand All @@ -444,6 +445,22 @@ private boolean initHttpServer() {
return false;
}

private int choseHttpServerPort(final HttpServerConfig config) {
final int preferencePort = config.getPreferencePort();
if (isPortAvailable(preferencePort)) {
Logger.info("Use " + preferencePort + " as HttpServer port.");
return preferencePort;
}

for (int port = config.getMinPort(); port < config.getMaxPort(); port++) {
if (isPortAvailable(port)) {
Logger.info("Use " + port + " as HttpServer port.");
return port;
}
}
throw new IllegalStateException("Has no available port for HttpServer!");
}

private Dispatcher getHttpServerDispatch() {
return new Dispatcher() {
@Override
Expand Down

0 comments on commit 25ded55

Please sign in to comment.