diff --git a/others/shade/vertx/pom.xml b/others/shade/vertx/pom.xml
index 565b4a53..ff8472a5 100644
--- a/others/shade/vertx/pom.xml
+++ b/others/shade/vertx/pom.xml
@@ -50,6 +50,7 @@
UTF-8
4.4.6
+ 2.15.0
@@ -64,6 +65,12 @@
vertx-web
${vertx.version}
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
diff --git a/powerjob-remote/powerjob-remote-benchmark/src/main/java/tech/powerjob/remote/benchmark/EngineService.java b/powerjob-remote/powerjob-remote-benchmark/src/main/java/tech/powerjob/remote/benchmark/EngineService.java
index 41079878..bb0eecd8 100644
--- a/powerjob-remote/powerjob-remote-benchmark/src/main/java/tech/powerjob/remote/benchmark/EngineService.java
+++ b/powerjob-remote/powerjob-remote-benchmark/src/main/java/tech/powerjob/remote/benchmark/EngineService.java
@@ -7,7 +7,7 @@ import tech.powerjob.common.enums.Protocol;
import tech.powerjob.remote.framework.BenchmarkActor;
import tech.powerjob.remote.framework.base.Address;
import tech.powerjob.remote.framework.base.ServerType;
-import tech.powerjob.remote.framework.engine.EngineConfig;
+import tech.powerjob.remote.framework.engine.config.EngineConfig;
import tech.powerjob.remote.framework.engine.impl.PowerJobRemoteEngine;
import tech.powerjob.remote.framework.transporter.Transporter;
diff --git a/powerjob-remote/powerjob-remote-framework/pom.xml b/powerjob-remote/powerjob-remote-framework/pom.xml
index e63f358a..eebd2010 100644
--- a/powerjob-remote/powerjob-remote-framework/pom.xml
+++ b/powerjob-remote/powerjob-remote-framework/pom.xml
@@ -18,9 +18,9 @@
UTF-8
4.3.6
+
0.10.2
-
-
+ 4.4.6
@@ -36,6 +36,18 @@
${reflections.version}
+
+ tech.powerjob
+ powerjob-shade-vertx
+ ${powerjob-shade-vertx.version}
+
+
+ *
+ *
+
+
+
+
\ No newline at end of file
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
index 50d22c3f..a64051fd 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/CSInitializerConfig.java
@@ -22,6 +22,4 @@ public class CSInitializerConfig implements Serializable {
private Address bindAddress;
private ServerType serverType;
-
- private ProxyConfig proxyConfig;
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
index e86d2722..5320c085 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/RemoteEngine.java
@@ -1,5 +1,7 @@
package tech.powerjob.remote.framework.engine;
+import tech.powerjob.remote.framework.engine.config.EngineConfig;
+
import java.io.IOException;
/**
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/config/EngineConfig.java
similarity index 85%
rename from powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
rename to powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/config/EngineConfig.java
index a9b82961..1d8cb40b 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/EngineConfig.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/config/EngineConfig.java
@@ -1,4 +1,4 @@
-package tech.powerjob.remote.framework.engine;
+package tech.powerjob.remote.framework.engine.config;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -30,6 +30,10 @@ public class EngineConfig implements Serializable {
* 绑定的本地地址
*/
private Address bindAddress;
+ /**
+ * 代理配置
+ */
+ private ProxyConfig proxyConfig;
/**
* actor实例,交由使用侧自己实例化以便自行注入各种 bean
*/
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/ProxyConfig.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/config/ProxyConfig.java
similarity index 90%
rename from powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/ProxyConfig.java
rename to powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/config/ProxyConfig.java
index 6a1822a1..9eb5f72d 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/cs/ProxyConfig.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/config/ProxyConfig.java
@@ -1,4 +1,4 @@
-package tech.powerjob.remote.framework.cs;
+package tech.powerjob.remote.framework.engine.config;
import lombok.Data;
import lombok.experimental.Accessors;
@@ -22,7 +22,7 @@ public class ProxyConfig implements Serializable {
/**
* 本机启动的代理服务器端口,当 enableProxyServer 为 true 时有效
*/
- private Integer proxyServerPort;
+ private Integer proxyServerPort = 9999;
/* ******************* 上述配置是本机自身行为,下面的配置是对外的访问行为,请勿混淆 ******************* */
/**
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
index 2f9cbc6b..36714f9a 100644
--- a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/engine/impl/PowerJobRemoteEngine.java
@@ -5,9 +5,12 @@ import lombok.extern.slf4j.Slf4j;
import tech.powerjob.remote.framework.actor.ActorInfo;
import tech.powerjob.remote.framework.cs.CSInitializer;
import tech.powerjob.remote.framework.cs.CSInitializerConfig;
-import tech.powerjob.remote.framework.engine.EngineConfig;
+import tech.powerjob.remote.framework.engine.config.ProxyConfig;
+import tech.powerjob.remote.framework.engine.config.EngineConfig;
import tech.powerjob.remote.framework.engine.EngineOutput;
import tech.powerjob.remote.framework.engine.RemoteEngine;
+import tech.powerjob.remote.framework.proxy.HttpProxyService;
+import tech.powerjob.remote.framework.proxy.ProxyService;
import tech.powerjob.remote.framework.transporter.Transporter;
import java.io.IOException;
@@ -46,16 +49,21 @@ public class PowerJobRemoteEngine implements RemoteEngine {
// 构建通讯器
Transporter transporter = csInitializer.buildTransporter();
- engineOutput.setTransporter(transporter);
log.info("[PowerJobRemoteEngine] [{}] start to bind Handler", engineType);
actorInfos.forEach(actor -> actor.getHandlerInfos().forEach(handlerInfo -> log.info("[PowerJobRemoteEngine] [{}] PATH={}, handler={}", engineType, handlerInfo.getLocation().toPath(), handlerInfo.getMethod())));
// 绑定 handler
csInitializer.bindHandlers(actorInfos);
-
log.info("[PowerJobRemoteEngine] [{}] startup successfully, cost: {}", engineType, sw);
+ // 处理代理服务器
+ ProxyConfig proxyConfig = engineConfig.getProxyConfig();
+ ProxyService proxyService = new HttpProxyService(transporter);
+ proxyService.initializeProxyServer(proxyConfig);
+ transporter = proxyService.warpProxyTransporter(engineConfig.getServerType());
+
+ engineOutput.setTransporter(transporter);
return engineOutput;
}
diff --git a/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/proxy/HttpProxyService.java b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/proxy/HttpProxyService.java
new file mode 100644
index 00000000..9d88f7da
--- /dev/null
+++ b/powerjob-remote/powerjob-remote-framework/src/main/java/tech/powerjob/remote/framework/proxy/HttpProxyService.java
@@ -0,0 +1,239 @@
+package tech.powerjob.remote.framework.proxy;
+
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import tech.powerjob.common.PowerSerializable;
+import tech.powerjob.common.serialize.JsonUtils;
+import tech.powerjob.remote.framework.base.RemotingException;
+import tech.powerjob.remote.framework.base.ServerType;
+import tech.powerjob.remote.framework.base.URL;
+import tech.powerjob.remote.framework.engine.config.ProxyConfig;
+import tech.powerjob.remote.framework.proxy.module.ProxyMethod;
+import tech.powerjob.remote.framework.proxy.module.ProxyRequest;
+import tech.powerjob.remote.framework.proxy.module.ProxyResult;
+import tech.powerjob.remote.framework.transporter.Protocol;
+import tech.powerjob.remote.framework.transporter.Transporter;
+import tech.powerjob.shade.io.netty.handler.codec.http.HttpHeaderNames;
+import tech.powerjob.shade.io.netty.handler.codec.http.HttpHeaderValues;
+import tech.powerjob.shade.io.netty.handler.codec.http.HttpResponseStatus;
+import tech.powerjob.shade.io.vertx.core.Future;
+import tech.powerjob.shade.io.vertx.core.Vertx;
+import tech.powerjob.shade.io.vertx.core.VertxOptions;
+import tech.powerjob.shade.io.vertx.core.http.*;
+import tech.powerjob.shade.io.vertx.core.json.JsonObject;
+import tech.powerjob.shade.io.vertx.ext.web.RequestBody;
+import tech.powerjob.shade.io.vertx.ext.web.Router;
+import tech.powerjob.shade.io.vertx.ext.web.handler.BodyHandler;
+
+import java.util.Objects;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * HTTP 代理服务
+ *
+ * @author tjq
+ * @since 2023/11/16
+ */
+@Slf4j
+public class HttpProxyService implements ProxyService {
+
+ private Vertx _vertx;
+ private ProxyConfig proxyConfig;
+
+ private final Transporter transporter;
+
+ private static final String PROXY_PATH = "/proxy";
+
+ public HttpProxyService(Transporter transporter) {
+ this.transporter = transporter;
+ }
+
+ @Override
+ @SneakyThrows
+ public void initializeProxyServer(ProxyConfig proxyConfig) {
+
+ this.proxyConfig = proxyConfig;
+ if (proxyConfig == null || !proxyConfig.isEnableProxyServer()) {
+ log.info("[HttpProxyService] no proxy server config, skip initialize.");
+ return;
+ }
+
+ log.info("[HttpProxyService] start to initialize proxy server by proxy config: {}", proxyConfig);
+
+ HttpServerOptions httpServerOptions = new HttpServerOptions().setIdleTimeout(300);
+ HttpServer httpServer = vertx().createHttpServer(httpServerOptions);
+ Router router = Router.router(vertx());
+ router.route().handler(BodyHandler.create());
+
+ router.post(PROXY_PATH).blockingHandler(ctx -> {
+ final RequestBody body = ctx.body();
+ ProxyRequest proxyRequest = body.asPojo(ProxyRequest.class);
+
+ PowerSerializable ret = (PowerSerializable) JsonUtils.parseObjectUnsafe(proxyRequest.getRequest(), proxyRequest.getClz());
+
+ if (ProxyMethod.TELL.getV().equals(proxyRequest.getProxyMethod())) {
+ transporter.tell(proxyRequest.getUrl(), ret);
+ ctx.json(JsonObject.mapFrom(new ProxyResult().setSuccess(true)));
+ return;
+ }
+
+ ProxyResult proxyResult = new ProxyResult();
+ try {
+ CompletionStage