diff --git a/.idea/icon.png b/.idea/icon.png deleted file mode 100644 index 4b526ba9..00000000 Binary files a/.idea/icon.png and /dev/null differ diff --git a/neutrino-proxy-client-sdk/Dockerfile b/neutrino-proxy-client-sdk/Dockerfile new file mode 100644 index 00000000..e2a41943 --- /dev/null +++ b/neutrino-proxy-client-sdk/Dockerfile @@ -0,0 +1,16 @@ +FROM openjdk:21-jdk-oracle +#同步时间 +#RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ +# apk update && apk add wget unzip vim && apk add -U tzdata && \ +# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone +# 设置时区为北京时间 +ENV TZ=Asia/Shanghai +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone +RUN mkdir -p /root/neutrino-proxy/config +WORKDIR /root/neutrino-proxy +COPY ./target/neutrino-proxy-client.jar /root/neutrino-proxy/neutrino-proxy-client.jar +COPY ./src/main/resources/app-copy.yml /root/neutrino-proxy/config/app.yml +#VOLUME ["/root/neutrino-proxy"] +ENTRYPOINT ["java","-jar","neutrino-proxy-client.jar","config=./config/app.yml"] + +#docker run -it -d --restart=always --name np_client -e SERVER_IP=127.0.0.1 diff --git a/neutrino-proxy-client-sdk/pom.xml b/neutrino-proxy-client-sdk/pom.xml new file mode 100644 index 00000000..9db95010 --- /dev/null +++ b/neutrino-proxy-client-sdk/pom.xml @@ -0,0 +1,62 @@ + + + + neutrino-proxy + org.dromara.neutrino-proxy + ${revision} + ../pom.xml + + 4.0.0 + jar + + neutrino-proxy-client-sdk + + + + org.dromara.neutrino-proxy + neutrino-proxy-core + ${revision} + + + org.noear + solon-lib + + + com.github.jsqlparser + jsqlparser + 4.5 + compile + + + + + ${project.artifactId} + + + src/main/resources + true + + *.yml + + + + ${project.basedir}/src/main/resources + false + + + app-dev.yml + + + + + + + org.noear + solon-maven-plugin + + + + + diff --git a/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/IBeanHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/IBeanHandler.java new file mode 100644 index 00000000..266d5b3d --- /dev/null +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/IBeanHandler.java @@ -0,0 +1,8 @@ +package org.dromara.neutrinoproxy.client.sdk.config; + +import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; + +public interface IBeanHandler { + Dispatcher getDispatcher(); + ProxyConfig getProxyConfig(); +} diff --git a/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/IProxyConfiguration.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/IProxyConfiguration.java new file mode 100644 index 00000000..abe2a641 --- /dev/null +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/IProxyConfiguration.java @@ -0,0 +1,187 @@ +package org.dromara.neutrinoproxy.client.sdk.config; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioDatagramChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.logging.LoggingHandler; +import io.netty.handler.timeout.IdleStateHandler; +import org.dromara.neutrinoproxy.client.sdk.core.*; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; +import org.dromara.neutrinoproxy.core.ProxyMessageDecoder; +import org.dromara.neutrinoproxy.core.ProxyMessageEncoder; +import org.dromara.neutrinoproxy.core.aot.NeutrinoCoreRuntimeNativeRegistrar; + +import java.net.InetSocketAddress; + +/** + * 代理配置 + * @author: aoshiguchen + * @date: 2022/10/8 + */ + +public abstract class IProxyConfiguration { + + public abstract IBeanHandler getBeanHandler(); + + public NioEventLoopGroup tunnelWorkGroup(ProxyConfig proxyConfig) { + return new NioEventLoopGroup(proxyConfig.getTunnel().getThreadCount()); + } + + public NioEventLoopGroup tcpRealServerWorkGroup(ProxyConfig proxyConfig) { + // 暂时先公用此配置 + return new NioEventLoopGroup(proxyConfig.getTunnel().getThreadCount()); + } + + public NioEventLoopGroup udpServerGroup(ProxyConfig proxyConfig) { + // 暂时先公用此配置 + return new NioEventLoopGroup(proxyConfig.getClient().getUdp().getBossThreadCount()); + } + + public NioEventLoopGroup udpWorkGroup(ProxyConfig proxyConfig) { + // 暂时先公用此配置 + return new NioEventLoopGroup(proxyConfig.getClient().getUdp().getWorkThreadCount()); + } + + public Bootstrap cmdTunnelBootstrap(ProxyConfig proxyConfig, + NioEventLoopGroup tunnelWorkGroup) { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(tunnelWorkGroup); + bootstrap.channel(NioSocketChannel.class); +// bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000); +// bootstrap.option(ChannelOption.SO_KEEPALIVE, true); +// /** +// * TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。 +// * Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。 +// */ +// bootstrap.option(ChannelOption.TCP_NODELAY, true); + bootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); + + bootstrap.handler(new ChannelInitializer() { + + @Override + public void initChannel(SocketChannel ch) throws Exception { + if (proxyConfig.getTunnel().getSslEnable()) { + ch.pipeline().addLast(ProxyUtil.createSslHandler(proxyConfig)); + } + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { + ch.pipeline().addFirst(new LoggingHandler(CmdChannelHandler.class)); + } + ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), + proxyConfig.getProtocol().getLengthFieldOffset(), proxyConfig.getProtocol().getLengthFieldLength(), + proxyConfig.getProtocol().getLengthAdjustment(), proxyConfig.getProtocol().getInitialBytesToStrip())); + ch.pipeline().addLast(new ProxyMessageEncoder()); + ch.pipeline().addLast(new IdleStateHandler(proxyConfig.getProtocol().getReadIdleTime(), proxyConfig.getProtocol().getWriteIdleTime(), proxyConfig.getProtocol().getAllIdleTimeSeconds())); + ch.pipeline().addLast(new CmdChannelHandler(getBeanHandler())); + } + }); + return bootstrap; + } + + public Bootstrap tcpProxyTunnelBootstrap(ProxyConfig proxyConfig, + NioEventLoopGroup tunnelWorkGroup) { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(tunnelWorkGroup); + bootstrap.channel(NioSocketChannel.class); + bootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); + bootstrap.handler(new ChannelInitializer() { + + @Override + public void initChannel(SocketChannel ch) throws Exception { + if (proxyConfig.getTunnel().getSslEnable()) { + ch.pipeline().addLast(ProxyUtil.createSslHandler(proxyConfig)); + } + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { + ch.pipeline().addFirst(new LoggingHandler(TcpProxyChannelHandler.class)); + } + ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), + proxyConfig.getProtocol().getLengthFieldOffset(), proxyConfig.getProtocol().getLengthFieldLength(), + proxyConfig.getProtocol().getLengthAdjustment(), proxyConfig.getProtocol().getInitialBytesToStrip())); + ch.pipeline().addLast(new ProxyMessageEncoder()); + ch.pipeline().addLast(new IdleStateHandler(proxyConfig.getProtocol().getReadIdleTime(), proxyConfig.getProtocol().getWriteIdleTime(), proxyConfig.getProtocol().getAllIdleTimeSeconds())); + ch.pipeline().addLast(new TcpProxyChannelHandler(getBeanHandler())); + } + }); + return bootstrap; + } + public Bootstrap udpProxyTunnelBootstrap(ProxyConfig proxyConfig, + NioEventLoopGroup tunnelWorkGroup) { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(tunnelWorkGroup); + bootstrap.channel(NioSocketChannel.class); + bootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); + bootstrap.handler(new ChannelInitializer() { + + @Override + public void initChannel(SocketChannel ch) throws Exception { + if (proxyConfig.getTunnel().getSslEnable()) { + ch.pipeline().addLast(ProxyUtil.createSslHandler(proxyConfig)); + } + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { + ch.pipeline().addFirst(new LoggingHandler(TcpProxyChannelHandler.class)); + } + ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), + proxyConfig.getProtocol().getLengthFieldOffset(), proxyConfig.getProtocol().getLengthFieldLength(), + proxyConfig.getProtocol().getLengthAdjustment(), proxyConfig.getProtocol().getInitialBytesToStrip())); + ch.pipeline().addLast(new ProxyMessageEncoder()); + ch.pipeline().addLast(new IdleStateHandler(proxyConfig.getProtocol().getReadIdleTime(), proxyConfig.getProtocol().getWriteIdleTime(), proxyConfig.getProtocol().getAllIdleTimeSeconds())); + ch.pipeline().addLast(new UdpProxyChannelHandler(getBeanHandler())); + } + }); + return bootstrap; + } + + public Bootstrap realServerBootstrap(ProxyConfig proxyConfig, + NioEventLoopGroup tcpRealServerWorkGroup + ) { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(tcpRealServerWorkGroup); + bootstrap.channel(NioSocketChannel.class); + bootstrap.handler(new ChannelInitializer() { + + @Override + public void initChannel(SocketChannel ch) throws Exception { + if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { + ch.pipeline().addFirst(new LoggingHandler(RealServerChannelHandler.class)); + } + ch.pipeline().addLast(new RealServerChannelHandler()); + } + }); + return bootstrap; + } + + public Bootstrap udpServerBootstrap(ProxyConfig proxyConfig, + NioEventLoopGroup udpServerGroup, + NioEventLoopGroup udpWorkGroup) { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(udpServerGroup) + // 主线程处理 + .channel(NioDatagramChannel.class) + // 广播 + .option(ChannelOption.SO_BROADCAST, true) + // 设置读缓冲区为2M + .option(ChannelOption.SO_RCVBUF, 2048 * 1024) + // 设置写缓冲区为1M + .option(ChannelOption.SO_SNDBUF, 1024 * 1024) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(NioDatagramChannel ch) { + ChannelPipeline pipeline = ch.pipeline(); + if (null != proxyConfig.getClient().getUdp().getTransferLogEnable() && proxyConfig.getClient().getUdp().getTransferLogEnable()) { + ch.pipeline().addFirst(new LoggingHandler(UdpRealServerHandler.class)); + } + pipeline.addLast(udpWorkGroup, new UdpRealServerHandler()); + } + }); + return bootstrap; + } + + public NeutrinoCoreRuntimeNativeRegistrar neutrinoCoreRuntimeNativeRegistrar() { + return new NeutrinoCoreRuntimeNativeRegistrar(); + } + +} diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/NeutrinoClientRuntimeNativeRegistrar.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/NeutrinoClientRuntimeNativeRegistrar.java similarity index 96% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/NeutrinoClientRuntimeNativeRegistrar.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/NeutrinoClientRuntimeNativeRegistrar.java index c9f84ef8..5b060964 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/NeutrinoClientRuntimeNativeRegistrar.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/NeutrinoClientRuntimeNativeRegistrar.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.config; +package org.dromara.neutrinoproxy.client.sdk.config; import org.noear.solon.annotation.Component; import org.noear.solon.aot.RuntimeNativeMetadata; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/ProxyConfig.java similarity index 96% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/ProxyConfig.java index a33f3520..ba740bef 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/config/ProxyConfig.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.config; +package org.dromara.neutrinoproxy.client.sdk.config; import lombok.Data; import org.noear.solon.annotation.Component; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/constant/Constants.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/constant/Constants.java similarity index 64% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/constant/Constants.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/constant/Constants.java index f9ab40c3..02dd5fe8 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/constant/Constants.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/constant/Constants.java @@ -1,7 +1,7 @@ -package org.dromara.neutrinoproxy.client.constant; +package org.dromara.neutrinoproxy.client.sdk.constant; import io.netty.util.AttributeKey; -import org.dromara.neutrinoproxy.client.util.UdpChannelBindInfo; +import org.dromara.neutrinoproxy.client.sdk.util.UdpChannelBindInfo; /** * @author: aoshiguchen diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/CmdChannelHandler.java similarity index 84% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/CmdChannelHandler.java index 68db2a0e..f4bb1c67 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CmdChannelHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/CmdChannelHandler.java @@ -1,17 +1,16 @@ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; -import org.dromara.neutrinoproxy.core.Constants; -import org.dromara.neutrinoproxy.core.ProxyMessage; -import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.timeout.IdleStateEvent; import lombok.extern.slf4j.Slf4j; -import org.noear.solon.Solon; +import org.dromara.neutrinoproxy.client.sdk.config.IBeanHandler; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; +import org.dromara.neutrinoproxy.core.Constants; +import org.dromara.neutrinoproxy.core.ProxyMessage; /** * 处理与服务端之间的数据传输 @@ -19,11 +18,13 @@ import org.noear.solon.Solon; * @date: 2022/6/16 */ @Slf4j -public class CmdChannelHandler extends SimpleChannelInboundHandler { +public class CmdChannelHandler extends SimpleChannelInboundHandler{ private static volatile Boolean transferLogEnable = Boolean.FALSE; + private IBeanHandler beanHandler; - public CmdChannelHandler() { - ProxyConfig proxyConfig = Solon.context().getBean(ProxyConfig.class); + public CmdChannelHandler(IBeanHandler beanHandler) { + this.beanHandler = beanHandler; + ProxyConfig proxyConfig = beanHandler.getProxyConfig(); if (null != proxyConfig.getClient() && null != proxyConfig.getTunnel().getHeartbeatLogEnable()) { transferLogEnable = proxyConfig.getTunnel().getHeartbeatLogEnable(); } @@ -34,7 +35,7 @@ public class CmdChannelHandler extends SimpleChannelInboundHandler if (ProxyMessage.TYPE_HEARTBEAT != proxyMessage.getType() || transferLogEnable) { log.debug("[CMD Channel]Client CmdChannel recieved proxy message, type is {}", proxyMessage.getType()); } - Solon.context().getBean(Dispatcher.class).dispatch(ctx, proxyMessage); + beanHandler.getDispatcher().dispatch(ctx, proxyMessage); } @Override @@ -82,4 +83,5 @@ public class CmdChannelHandler extends SimpleChannelInboundHandler } } } + } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CustomThreadFactory.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/CustomThreadFactory.java similarity index 97% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CustomThreadFactory.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/CustomThreadFactory.java index b6a3e191..1bddce35 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/CustomThreadFactory.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/CustomThreadFactory.java @@ -19,7 +19,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; diff --git a/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/IAbProxyClientService.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/IAbProxyClientService.java new file mode 100644 index 00000000..9e442ea7 --- /dev/null +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/IAbProxyClientService.java @@ -0,0 +1,129 @@ +package org.dromara.neutrinoproxy.client.sdk.core; + +import cn.hutool.core.util.StrUtil; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; +import org.dromara.neutrinoproxy.client.sdk.util.UdpServerUtil; +import org.dromara.neutrinoproxy.core.ProxyMessage; +import org.noear.solon.Solon; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; + +/** + * 代理客户端服务 + * @author: aoshiguchen + * @date: 2022/6/16 + */ +@Slf4j +@Data +public class IAbProxyClientService { + + public ProxyConfig proxyConfig; + + public Bootstrap cmdTunnelBootstrap; + + public Bootstrap udpServerBootstrap; + + private volatile Channel channel; + /** + * 重连次数 + */ + private volatile int reconnectCount = 0; + + /** + * 重连服务执行器 + */ + public static final ScheduledExecutorService reconnectExecutor = Executors.newSingleThreadScheduledExecutor(new CustomThreadFactory("ClientReconnect")); + + public void init(){ + reconnectExecutor.scheduleWithFixedDelay(this::reconnect, 10, proxyConfig.getTunnel().getReconnection().getIntervalSeconds(), TimeUnit.SECONDS); + try { + this.start(); + UdpServerUtil.initCache(proxyConfig, udpServerBootstrap); + } catch (Exception e) { + // 启动连不上也做一下重连,因此先catch异常 + log.error("[CmdChannel] start error", e); + } + } + + public void start() { + if (StrUtil.isEmpty(proxyConfig.getTunnel().getServerIp())) { + log.error("not found server-ip config."); + Solon.stop(); + return; + } + if (null == proxyConfig.getTunnel().getServerPort()) { + log.error("not found server-port config."); + Solon.stop(); + return; + } + if (null != proxyConfig.getTunnel().getSslEnable() && proxyConfig.getTunnel().getSslEnable() + && StrUtil.isEmpty(proxyConfig.getTunnel().getJksPath())) { + log.error("not found jks-path config."); + Solon.stop(); + return; + } + if (StrUtil.isEmpty(proxyConfig.getTunnel().getLicenseKey())) { + log.error("not found license-key config."); + Solon.stop(); + return; + } + if (null == channel || !channel.isActive()) { + try { + connectProxyServer(); + } catch (Exception e) { + log.error("client start error", e); + } + } else { + channel.writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getTunnel().getLicenseKey(), ProxyUtil.getClientId())); + } + } + + /** + * 连接代理服务器 + */ + private void connectProxyServer() throws InterruptedException { + cmdTunnelBootstrap.connect() + .addListener(new ChannelFutureListener() { + + @Override + public void operationComplete(ChannelFuture future) throws Exception { + if (future.isSuccess()) { + channel = future.channel(); + // 连接成功,向服务器发送客户端认证信息(licenseKey) + ProxyUtil.setCmdChannel(future.channel()); + future.channel().writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getTunnel().getLicenseKey(), ProxyUtil.getClientId())); + log.info("[CmdChannel] connect proxy server success. channelId:{}", future.channel().id().asLongText()); + +// reconnectServiceEnable = true; + reconnectCount = 0; + } else { + log.info("[CmdChannel] connect proxy server failed!"); + } + } + }).sync(); + } + + protected synchronized void reconnect() { + if (null != channel) { + if (channel.isActive()) { + return; + } + channel.close(); + } + + log.info("[CmdChannel] client reconnect seq:{}", ++reconnectCount); + try { + connectProxyServer(); + } catch (Exception e) { + log.error("[CmdChannel] reconnect error", e); + } + } +} diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyChannelBorrowListener.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/ProxyChannelBorrowListener.java similarity index 96% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyChannelBorrowListener.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/ProxyChannelBorrowListener.java index 21e014fa..1dce20d2 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyChannelBorrowListener.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/ProxyChannelBorrowListener.java @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; import io.netty.channel.Channel; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/RealServerChannelHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/RealServerChannelHandler.java similarity index 97% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/RealServerChannelHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/RealServerChannelHandler.java index aafec97a..ea0cb3d5 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/RealServerChannelHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/RealServerChannelHandler.java @@ -20,10 +20,10 @@ * SOFTWARE. */ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyMessage; import io.netty.buffer.ByteBuf; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/TcpProxyChannelHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/TcpProxyChannelHandler.java similarity index 86% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/TcpProxyChannelHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/TcpProxyChannelHandler.java index c3710e83..59161321 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/TcpProxyChannelHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/TcpProxyChannelHandler.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; @@ -6,7 +6,9 @@ import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.timeout.IdleStateEvent; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; +import org.dromara.neutrinoproxy.client.sdk.config.IBeanHandler; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; @@ -20,13 +22,16 @@ import org.noear.solon.Solon; @Slf4j public class TcpProxyChannelHandler extends SimpleChannelInboundHandler { - + private IBeanHandler beanHandler; + public TcpProxyChannelHandler(IBeanHandler beanHandler) { + this.beanHandler = beanHandler; + } @Override protected void channelRead0(ChannelHandlerContext ctx, ProxyMessage proxyMessage) throws Exception { if (ProxyMessage.TYPE_HEARTBEAT != proxyMessage.getType()) { log.debug("[TCP Proxy Channel]Client ProxyChannel recieved proxy message, type is {}", proxyMessage.getType()); } - Solon.context().getBean(Dispatcher.class).dispatch(ctx, proxyMessage); + beanHandler.getDispatcher().dispatch(ctx, proxyMessage); } @Override diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/UdpProxyChannelHandler.java similarity index 88% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/UdpProxyChannelHandler.java index 8504e20f..40dec1b6 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpProxyChannelHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/UdpProxyChannelHandler.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; @@ -6,7 +6,8 @@ import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.timeout.IdleStateEvent; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; +import org.dromara.neutrinoproxy.client.sdk.config.IBeanHandler; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; @@ -20,13 +21,16 @@ import org.noear.solon.Solon; @Slf4j public class UdpProxyChannelHandler extends SimpleChannelInboundHandler { - + private IBeanHandler beanHandler; + public UdpProxyChannelHandler(IBeanHandler beanHandler) { + this.beanHandler = beanHandler; + } @Override protected void channelRead0(ChannelHandlerContext ctx, ProxyMessage proxyMessage) throws Exception { if (ProxyMessage.TYPE_HEARTBEAT != proxyMessage.getType()) { log.debug("[UDP Proxy Channel]Client ProxyChannel recieved proxy message, type is {}", proxyMessage.getType()); } - Solon.context().getBean(Dispatcher.class).dispatch(ctx, proxyMessage); + beanHandler.getDispatcher().dispatch(ctx, proxyMessage); } @Override diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpRealServerHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/UdpRealServerHandler.java similarity index 90% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpRealServerHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/UdpRealServerHandler.java index 1a288e88..758a5618 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/UdpRealServerHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/core/UdpRealServerHandler.java @@ -1,11 +1,11 @@ -package org.dromara.neutrinoproxy.client.core; +package org.dromara.neutrinoproxy.client.sdk.core; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.constant.Constants; -import org.dromara.neutrinoproxy.client.util.UdpChannelBindInfo; +import org.dromara.neutrinoproxy.client.sdk.constant.Constants; +import org.dromara.neutrinoproxy.client.sdk.util.UdpChannelBindInfo; import org.dromara.neutrinoproxy.core.ProxyMessage; import java.net.InetSocketAddress; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageAuthHandler.java similarity index 85% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageAuthHandler.java index ff41bc10..5ae9219e 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageAuthHandler.java @@ -1,8 +1,8 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ExceptionEnum; import org.dromara.neutrinoproxy.core.ProxyMessage; @@ -10,8 +10,6 @@ import org.dromara.neutrinoproxy.core.ProxyMessageHandler; import org.dromara.neutrinoproxy.core.dispatcher.Match; import org.noear.snack.ONode; import org.noear.solon.Solon; -import org.noear.solon.annotation.Component; -import org.noear.solon.annotation.Inject; /** * 认证信息处理器 @@ -20,10 +18,12 @@ import org.noear.solon.annotation.Inject; */ @Slf4j @Match(type = Constants.ProxyDataTypeName.AUTH) -@Component public class ProxyMessageAuthHandler implements ProxyMessageHandler { - @Inject private ProxyConfig proxyConfig; + + public ProxyMessageAuthHandler(ProxyConfig proxyConfig){ + this.proxyConfig=proxyConfig; + } @Override public void handle(ChannelHandlerContext context, ProxyMessage proxyMessage) { String info = proxyMessage.getInfo(); diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageConnectHandler.java similarity index 81% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageConnectHandler.java index 2bca8667..804c2cc2 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageConnectHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageConnectHandler.java @@ -1,33 +1,36 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; -import org.dromara.neutrinoproxy.client.core.ProxyChannelBorrowListener; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import lombok.extern.slf4j.Slf4j; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.core.ProxyChannelBorrowListener; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.ProxyMessageHandler; import org.dromara.neutrinoproxy.core.dispatcher.Match; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; -import org.noear.solon.annotation.Component; -import org.noear.solon.annotation.Inject; /** * 连接信息处理器 * @author: aoshiguchen * @date: 2022/6/16 */ +@Slf4j @Match(type = Constants.ProxyDataTypeName.CONNECT) -@Component public class ProxyMessageConnectHandler implements ProxyMessageHandler { - @Inject("tcpProxyTunnelBootstrap") + private Bootstrap tcpProxyTunnelBootstrap; - @Inject("realServerBootstrap") private Bootstrap realServerBootstrap; - @Inject private ProxyConfig proxyConfig; + public ProxyMessageConnectHandler(Bootstrap tcpProxyTunnelBootstrap,Bootstrap realServerBootstrap,ProxyConfig proxyConfig){ + this.proxyConfig=proxyConfig; + this.realServerBootstrap=realServerBootstrap; + this.tcpProxyTunnelBootstrap=tcpProxyTunnelBootstrap; + } + @Override public void handle(ChannelHandlerContext ctx, ProxyMessage proxyMessage) { final Channel cmdChannel = ctx.channel(); @@ -84,4 +87,5 @@ public class ProxyMessageConnectHandler implements ProxyMessageHandler { public String name() { return ProxyDataTypeEnum.CONNECT.getDesc(); } + } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageDisconnectHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageDisconnectHandler.java similarity index 87% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageDisconnectHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageDisconnectHandler.java index d1ada2d7..1534aae1 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageDisconnectHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageDisconnectHandler.java @@ -1,24 +1,24 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; +import io.netty.buffer.Unpooled; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.ProxyMessageHandler; import org.dromara.neutrinoproxy.core.dispatcher.Match; -import io.netty.buffer.Unpooled; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelHandlerContext; -import org.noear.solon.annotation.Component; /** * 断开连接信息处理器 * @author: aoshiguchen * @date: 2022/6/16 */ +@Slf4j @Match(type = Constants.ProxyDataTypeName.DISCONNECT) -@Component public class ProxyMessageDisconnectHandler implements ProxyMessageHandler { @Override diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageErrorHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageErrorHandler.java similarity index 67% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageErrorHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageErrorHandler.java index 8d986f8e..66ce7fea 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageErrorHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageErrorHandler.java @@ -1,15 +1,10 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.core.Constants; -import org.dromara.neutrinoproxy.core.ExceptionEnum; -import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; -import org.dromara.neutrinoproxy.core.ProxyMessage; -import org.dromara.neutrinoproxy.core.ProxyMessageHandler; +import org.dromara.neutrinoproxy.core.*; import org.dromara.neutrinoproxy.core.dispatcher.Match; import org.noear.snack.ONode; -import org.noear.solon.annotation.Component; /** * 异常信息处理器 @@ -18,7 +13,6 @@ import org.noear.solon.annotation.Component; */ @Slf4j @Match(type = Constants.ProxyDataTypeName.ERROR) -@Component public class ProxyMessageErrorHandler implements ProxyMessageHandler { @Override @@ -35,4 +29,5 @@ public class ProxyMessageErrorHandler implements ProxyMessageHandler { public String name() { return ProxyDataTypeEnum.DISCONNECT.getDesc(); } + } diff --git a/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageFactory.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageFactory.java new file mode 100644 index 00000000..e11ac05d --- /dev/null +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageFactory.java @@ -0,0 +1,76 @@ +package org.dromara.neutrinoproxy.client.sdk.handler; + +import com.google.common.collect.Lists; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.nio.NioEventLoopGroup; +import org.dromara.neutrinoproxy.client.sdk.config.IProxyConfiguration; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.core.IAbProxyClientService; +import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; +import org.dromara.neutrinoproxy.core.ProxyMessage; +import org.dromara.neutrinoproxy.core.ProxyMessageHandler; +import org.dromara.neutrinoproxy.core.aot.NeutrinoCoreRuntimeNativeRegistrar; +import org.dromara.neutrinoproxy.core.dispatcher.DefaultDispatcher; +import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; + +import java.util.List; + +/** + * + * @author: gc.x + * @date: 2024/1/21 + */ +public abstract class ProxyMessageFactory extends IProxyConfiguration { + + public abstract void beanInject(String beanName, Object t); + public abstract Object getBean(String beanName); + + public void start(ProxyConfig proxyConfig){ + init(proxyConfig); + IAbProxyClientService clientService=new IAbProxyClientService(); + clientService.setProxyConfig(proxyConfig); + clientService.setCmdTunnelBootstrap((Bootstrap) getBean("cmdTunnelBootstrap")); + clientService.setUdpServerBootstrap((Bootstrap) getBean("udpServerBootstrap")); + clientService.init(); + } + + public void init(ProxyConfig proxyConfig){ + NioEventLoopGroup tunnelWorkGroup = super.tunnelWorkGroup(proxyConfig); + beanInject("tunnelWorkGroup",tunnelWorkGroup); + NioEventLoopGroup tcpRealServerWorkGroup = super.tcpRealServerWorkGroup(proxyConfig); + beanInject("tcpRealServerWorkGroup",tcpRealServerWorkGroup); + NioEventLoopGroup udpServerGroup = super.udpServerGroup(proxyConfig); + beanInject("udpServerGroup",udpServerGroup); + NioEventLoopGroup udpWorkGroup = super.udpWorkGroup(proxyConfig); + beanInject("udpWorkGroup",udpWorkGroup); + Bootstrap cmdTunnelBootstrap = super.cmdTunnelBootstrap(proxyConfig, tunnelWorkGroup); + beanInject("cmdTunnelBootstrap",cmdTunnelBootstrap); + Bootstrap tcpProxyTunnelBootstrap = super.tcpProxyTunnelBootstrap(proxyConfig, tunnelWorkGroup); + beanInject("tcpProxyTunnelBootstrap",tcpProxyTunnelBootstrap); + Bootstrap udpProxyTunnelBootstrap = super.udpProxyTunnelBootstrap(proxyConfig, tunnelWorkGroup); + beanInject("udpProxyTunnelBootstrap",udpProxyTunnelBootstrap); + Bootstrap realServerBootstrap = super.realServerBootstrap(proxyConfig, tcpRealServerWorkGroup); + beanInject("realServerBootstrap",realServerBootstrap); + Bootstrap udpServerBootstrap = super.udpServerBootstrap(proxyConfig, udpServerGroup, udpWorkGroup); + beanInject("udpServerBootstrap",udpServerBootstrap); + NeutrinoCoreRuntimeNativeRegistrar neutrinoCoreRuntimeNativeRegistrar = super.neutrinoCoreRuntimeNativeRegistrar(); + beanInject("neutrinoCoreRuntimeNativeRegistrar",neutrinoCoreRuntimeNativeRegistrar); + dispatcher(proxyConfig, tcpProxyTunnelBootstrap, realServerBootstrap); + } + public void dispatcher(ProxyConfig proxyConfig, Bootstrap tcpProxyTunnelBootstrap, Bootstrap realServerBootstrap) { + List list = Lists.newArrayList( + new ProxyMessageAuthHandler(proxyConfig), + new ProxyMessageConnectHandler(tcpProxyTunnelBootstrap,realServerBootstrap,proxyConfig), + new ProxyMessageDisconnectHandler(), + new ProxyMessageErrorHandler(), + new ProxyMessageTransferHandler(), + new UdpProxyMessageConnectHandler(proxyConfig,tcpProxyTunnelBootstrap), + new UdpProxyMessageTransferHandler() + ); + Dispatcher dispatcher = new DefaultDispatcher<>("MessageDispatcher", list, + proxyMessage -> ProxyDataTypeEnum.of((int)proxyMessage.getType()) == null ? + null : ProxyDataTypeEnum.of((int)proxyMessage.getType()).getName()); + beanInject("dispatcher",dispatcher); + } +} diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageTransferHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageTransferHandler.java similarity index 91% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageTransferHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageTransferHandler.java index 60d51a95..1d2199aa 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageTransferHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/ProxyMessageTransferHandler.java @@ -1,14 +1,14 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.ProxyMessageHandler; import org.dromara.neutrinoproxy.core.dispatcher.Match; -import io.netty.buffer.ByteBuf; -import io.netty.channel.Channel; -import io.netty.channel.ChannelHandlerContext; -import org.noear.solon.annotation.Component; /** * 传输信息处理器 @@ -16,7 +16,7 @@ import org.noear.solon.annotation.Component; * @date: 2022/6/16 */ @Match(type = Constants.ProxyDataTypeName.TRANSFER) -@Component +@Slf4j public class ProxyMessageTransferHandler implements ProxyMessageHandler { @Override diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/UdpProxyMessageConnectHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/UdpProxyMessageConnectHandler.java similarity index 81% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/UdpProxyMessageConnectHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/UdpProxyMessageConnectHandler.java index bc0e9bb0..81dc9651 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/UdpProxyMessageConnectHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/UdpProxyMessageConnectHandler.java @@ -1,20 +1,18 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; -import org.dromara.neutrinoproxy.client.core.ProxyChannelBorrowListener; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.core.ProxyChannelBorrowListener; +import org.dromara.neutrinoproxy.client.sdk.util.ProxyUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.ProxyMessageHandler; import org.dromara.neutrinoproxy.core.dispatcher.Match; import org.noear.snack.ONode; -import org.noear.solon.annotation.Component; -import org.noear.solon.annotation.Inject; /** * @author: aoshiguchen @@ -22,13 +20,16 @@ import org.noear.solon.annotation.Inject; */ @Slf4j @Match(type = Constants.ProxyDataTypeName.UDP_CONNECT) -@Component public class UdpProxyMessageConnectHandler implements ProxyMessageHandler { - @Inject + private ProxyConfig proxyConfig; - @Inject("udpProxyTunnelBootstrap") private Bootstrap udpProxyTunnelBootstrap; + public UdpProxyMessageConnectHandler(ProxyConfig proxyConfig,Bootstrap udpProxyTunnelBootstrap){ + this.proxyConfig=proxyConfig; + this.udpProxyTunnelBootstrap=udpProxyTunnelBootstrap; + } + @Override public void handle(ChannelHandlerContext ctx, ProxyMessage proxyMessage) { final Channel cmdChannel = ctx.channel(); @@ -61,4 +62,5 @@ public class UdpProxyMessageConnectHandler implements ProxyMessageHandler { public String name() { return ProxyDataTypeEnum.UDP_CONNECT.getDesc(); } + } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/UdpProxyMessageTransferHandler.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/UdpProxyMessageTransferHandler.java similarity index 91% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/UdpProxyMessageTransferHandler.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/UdpProxyMessageTransferHandler.java index a3d111d5..2e97adfa 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/UdpProxyMessageTransferHandler.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/handler/UdpProxyMessageTransferHandler.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.handler; +package org.dromara.neutrinoproxy.client.sdk.handler; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -6,14 +6,13 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.socket.DatagramPacket; import lombok.extern.slf4j.Slf4j; -import org.dromara.neutrinoproxy.client.util.UdpServerUtil; +import org.dromara.neutrinoproxy.client.sdk.util.UdpServerUtil; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyDataTypeEnum; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.core.ProxyMessageHandler; import org.dromara.neutrinoproxy.core.dispatcher.Match; import org.noear.snack.ONode; -import org.noear.solon.annotation.Component; import java.net.InetSocketAddress; @@ -23,7 +22,6 @@ import java.net.InetSocketAddress; */ @Slf4j @Match(type = Constants.ProxyDataTypeName.UDP_TRANSFER) -@Component public class UdpProxyMessageTransferHandler implements ProxyMessageHandler { @Override @@ -45,4 +43,5 @@ public class UdpProxyMessageTransferHandler implements ProxyMessageHandler { public String name() { return ProxyDataTypeEnum.UDP_TRANSFER.getDesc(); } + } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/LockChannel.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/LockChannel.java similarity index 91% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/LockChannel.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/LockChannel.java index d694ba83..765e0ba1 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/LockChannel.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/LockChannel.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.util; +package org.dromara.neutrinoproxy.client.sdk.util; import io.netty.channel.Channel; import lombok.Data; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/ProxyUtil.java similarity index 97% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/ProxyUtil.java index b44bd4a9..3e28da24 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/ProxyUtil.java @@ -19,14 +19,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.dromara.neutrinoproxy.client.util; +package org.dromara.neutrinoproxy.client.sdk.util; import io.netty.channel.ChannelHandler; import io.netty.handler.ssl.SslHandler; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; -import org.dromara.neutrinoproxy.client.core.ProxyChannelBorrowListener; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.core.ProxyChannelBorrowListener; import org.dromara.neutrinoproxy.core.Constants; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpChannelBindInfo.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/UdpChannelBindInfo.java similarity index 89% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpChannelBindInfo.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/UdpChannelBindInfo.java index fea6aa86..21fa5366 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpChannelBindInfo.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/UdpChannelBindInfo.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.util; +package org.dromara.neutrinoproxy.client.sdk.util; import io.netty.channel.Channel; import lombok.Data; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/UdpServerUtil.java similarity index 96% rename from neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java rename to neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/UdpServerUtil.java index 02f47437..ba909d6d 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/UdpServerUtil.java +++ b/neutrino-proxy-client-sdk/src/main/java/org/dromara/neutrinoproxy/client/sdk/util/UdpServerUtil.java @@ -1,4 +1,4 @@ -package org.dromara.neutrinoproxy.client.util; +package org.dromara.neutrinoproxy.client.sdk.util; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; @@ -7,9 +7,9 @@ import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; -import org.dromara.neutrinoproxy.client.constant.Constants; -import org.dromara.neutrinoproxy.client.core.CustomThreadFactory; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.client.sdk.constant.Constants; +import org.dromara.neutrinoproxy.client.sdk.core.CustomThreadFactory; import org.dromara.neutrinoproxy.core.ProxyMessage; import org.noear.solon.core.runtime.NativeDetector; diff --git a/neutrino-proxy-client/pom.xml b/neutrino-proxy-client/pom.xml index 1e5d3a8a..a15e1195 100644 --- a/neutrino-proxy-client/pom.xml +++ b/neutrino-proxy-client/pom.xml @@ -16,13 +16,9 @@ org.dromara.neutrino-proxy - neutrino-proxy-core + neutrino-proxy-client-sdk ${revision} - - org.noear - solon-lib - diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfiguration.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfiguration.java index 87dda221..489bf99d 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfiguration.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfiguration.java @@ -1,30 +1,11 @@ package org.dromara.neutrinoproxy.client.config; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelOption; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioDatagramChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.logging.LoggingHandler; -import io.netty.handler.timeout.IdleStateHandler; -import org.dromara.neutrinoproxy.client.core.*; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; -import org.dromara.neutrinoproxy.core.*; -import org.dromara.neutrinoproxy.core.aot.NeutrinoCoreRuntimeNativeRegistrar; -import org.dromara.neutrinoproxy.core.dispatcher.DefaultDispatcher; -import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelHandlerContext; +import org.dromara.neutrinoproxy.client.handler.BeanHandler; +import org.dromara.neutrinoproxy.client.sdk.config.IBeanHandler; +import org.dromara.neutrinoproxy.client.sdk.handler.ProxyMessageFactory; import org.noear.solon.Solon; -import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Configuration; -import org.noear.solon.annotation.Inject; -import org.noear.solon.core.bean.LifecycleBean; - -import java.net.InetSocketAddress; -import java.util.List; +import org.noear.solon.core.BeanWrap; /** * 代理配置 @@ -32,182 +13,24 @@ import java.util.List; * @date: 2022/10/8 */ @Configuration -public class ProxyConfiguration implements LifecycleBean { +public class ProxyConfiguration extends ProxyMessageFactory { + @Override - public void start() throws Throwable { - List list = Solon.context().getBeansOfType(ProxyMessageHandler.class); - Dispatcher dispatcher = new DefaultDispatcher<>("MessageDispatcher", list, - proxyMessage -> ProxyDataTypeEnum.of((int)proxyMessage.getType()) == null ? - null : ProxyDataTypeEnum.of((int)proxyMessage.getType()).getName()); - Solon.context().wrapAndPut(Dispatcher.class, dispatcher); + public IBeanHandler getBeanHandler() { + return new BeanHandler(); } - @Bean("tunnelWorkGroup") - public NioEventLoopGroup tunnelWorkGroup(@Inject ProxyConfig proxyConfig) { - return new NioEventLoopGroup(proxyConfig.getTunnel().getThreadCount()); + @Override + public void beanInject(String beanName, Object bean) { + //包装Bean(指定名字的) + BeanWrap beanWrap = Solon.context().wrap(beanName, bean); + //以名字注册 + Solon.context().putWrap(beanName, beanWrap); } - @Bean("tcpRealServerWorkGroup") - public NioEventLoopGroup tcpRealServerWorkGroup(@Inject ProxyConfig proxyConfig) { - // 暂时先公用此配置 - return new NioEventLoopGroup(proxyConfig.getTunnel().getThreadCount()); + @Override + public Object getBean(String beanName) { + return Solon.context().getBean(beanName); } - - @Bean("udpServerGroup") - public NioEventLoopGroup udpServerGroup(@Inject ProxyConfig proxyConfig) { - // 暂时先公用此配置 - return new NioEventLoopGroup(proxyConfig.getClient().getUdp().getBossThreadCount()); - } - - @Bean("udpWorkGroup") - public NioEventLoopGroup udpWorkGroup(@Inject ProxyConfig proxyConfig) { - // 暂时先公用此配置 - return new NioEventLoopGroup(proxyConfig.getClient().getUdp().getWorkThreadCount()); - } - - @Bean("cmdTunnelBootstrap") - public Bootstrap cmdTunnelBootstrap(@Inject ProxyConfig proxyConfig, - @Inject("tunnelWorkGroup") NioEventLoopGroup tunnelWorkGroup) { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(tunnelWorkGroup); - bootstrap.channel(NioSocketChannel.class); -// bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000); -// bootstrap.option(ChannelOption.SO_KEEPALIVE, true); -// /** -// * TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。 -// * Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。 -// */ -// bootstrap.option(ChannelOption.TCP_NODELAY, true); - bootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); - - bootstrap.handler(new ChannelInitializer() { - - @Override - public void initChannel(SocketChannel ch) throws Exception { - if (proxyConfig.getTunnel().getSslEnable()) { - ch.pipeline().addLast(ProxyUtil.createSslHandler(proxyConfig)); - } - if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { - ch.pipeline().addFirst(new LoggingHandler(CmdChannelHandler.class)); - } - ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), - proxyConfig.getProtocol().getLengthFieldOffset(), proxyConfig.getProtocol().getLengthFieldLength(), - proxyConfig.getProtocol().getLengthAdjustment(), proxyConfig.getProtocol().getInitialBytesToStrip())); - ch.pipeline().addLast(new ProxyMessageEncoder()); - ch.pipeline().addLast(new IdleStateHandler(proxyConfig.getProtocol().getReadIdleTime(), proxyConfig.getProtocol().getWriteIdleTime(), proxyConfig.getProtocol().getAllIdleTimeSeconds())); - ch.pipeline().addLast(new CmdChannelHandler()); - } - }); - return bootstrap; - } - - @Bean("tcpProxyTunnelBootstrap") - public Bootstrap tcpProxyTunnelBootstrap(@Inject ProxyConfig proxyConfig, - @Inject("tunnelWorkGroup") NioEventLoopGroup tunnelWorkGroup) { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(tunnelWorkGroup); - bootstrap.channel(NioSocketChannel.class); - bootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); - bootstrap.handler(new ChannelInitializer() { - - @Override - public void initChannel(SocketChannel ch) throws Exception { - if (proxyConfig.getTunnel().getSslEnable()) { - ch.pipeline().addLast(ProxyUtil.createSslHandler(proxyConfig)); - } - if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { - ch.pipeline().addFirst(new LoggingHandler(TcpProxyChannelHandler.class)); - } - ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), - proxyConfig.getProtocol().getLengthFieldOffset(), proxyConfig.getProtocol().getLengthFieldLength(), - proxyConfig.getProtocol().getLengthAdjustment(), proxyConfig.getProtocol().getInitialBytesToStrip())); - ch.pipeline().addLast(new ProxyMessageEncoder()); - ch.pipeline().addLast(new IdleStateHandler(proxyConfig.getProtocol().getReadIdleTime(), proxyConfig.getProtocol().getWriteIdleTime(), proxyConfig.getProtocol().getAllIdleTimeSeconds())); - ch.pipeline().addLast(new TcpProxyChannelHandler()); - } - }); - return bootstrap; - } - - @Bean("udpProxyTunnelBootstrap") - public Bootstrap udpProxyTunnelBootstrap(@Inject ProxyConfig proxyConfig, - @Inject("tunnelWorkGroup") NioEventLoopGroup tunnelWorkGroup) { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(tunnelWorkGroup); - bootstrap.channel(NioSocketChannel.class); - bootstrap.remoteAddress(InetSocketAddress.createUnresolved(proxyConfig.getTunnel().getServerIp(), proxyConfig.getTunnel().getServerPort())); - bootstrap.handler(new ChannelInitializer() { - - @Override - public void initChannel(SocketChannel ch) throws Exception { - if (proxyConfig.getTunnel().getSslEnable()) { - ch.pipeline().addLast(ProxyUtil.createSslHandler(proxyConfig)); - } - if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { - ch.pipeline().addFirst(new LoggingHandler(TcpProxyChannelHandler.class)); - } - ch.pipeline().addLast(new ProxyMessageDecoder(proxyConfig.getProtocol().getMaxFrameLength(), - proxyConfig.getProtocol().getLengthFieldOffset(), proxyConfig.getProtocol().getLengthFieldLength(), - proxyConfig.getProtocol().getLengthAdjustment(), proxyConfig.getProtocol().getInitialBytesToStrip())); - ch.pipeline().addLast(new ProxyMessageEncoder()); - ch.pipeline().addLast(new IdleStateHandler(proxyConfig.getProtocol().getReadIdleTime(), proxyConfig.getProtocol().getWriteIdleTime(), proxyConfig.getProtocol().getAllIdleTimeSeconds())); - ch.pipeline().addLast(new UdpProxyChannelHandler()); - } - }); - return bootstrap; - } - - @Bean("realServerBootstrap") - public Bootstrap realServerBootstrap(@Inject ProxyConfig proxyConfig, - @Inject("tcpRealServerWorkGroup") NioEventLoopGroup tcpRealServerWorkGroup - ) { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(tcpRealServerWorkGroup); - bootstrap.channel(NioSocketChannel.class); - bootstrap.handler(new ChannelInitializer() { - - @Override - public void initChannel(SocketChannel ch) throws Exception { - if (null != proxyConfig.getTunnel().getTransferLogEnable() && proxyConfig.getTunnel().getTransferLogEnable()) { - ch.pipeline().addFirst(new LoggingHandler(RealServerChannelHandler.class)); - } - ch.pipeline().addLast(new RealServerChannelHandler()); - } - }); - return bootstrap; - } - - @Bean("udpServerBootstrap") - public Bootstrap udpServerBootstrap(@Inject ProxyConfig proxyConfig, - @Inject("udpServerGroup") NioEventLoopGroup udpServerGroup, - @Inject("udpWorkGroup") NioEventLoopGroup udpWorkGroup) { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(udpServerGroup) - // 主线程处理 - .channel(NioDatagramChannel.class) - // 广播 - .option(ChannelOption.SO_BROADCAST, true) - // 设置读缓冲区为2M - .option(ChannelOption.SO_RCVBUF, 2048 * 1024) - // 设置写缓冲区为1M - .option(ChannelOption.SO_SNDBUF, 1024 * 1024) - .handler(new ChannelInitializer() { - @Override - protected void initChannel(NioDatagramChannel ch) { - ChannelPipeline pipeline = ch.pipeline(); - if (null != proxyConfig.getClient().getUdp().getTransferLogEnable() && proxyConfig.getClient().getUdp().getTransferLogEnable()) { - ch.pipeline().addFirst(new LoggingHandler(UdpRealServerHandler.class)); - } - pipeline.addLast(udpWorkGroup, new UdpRealServerHandler()); - } - }); - return bootstrap; - } - - @Bean - public NeutrinoCoreRuntimeNativeRegistrar neutrinoCoreRuntimeNativeRegistrar() { - return new NeutrinoCoreRuntimeNativeRegistrar(); - } - } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java index e7ff1e3f..e1252d91 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/core/ProxyClientService.java @@ -1,22 +1,12 @@ package org.dromara.neutrinoproxy.client.core; -import cn.hutool.core.util.StrUtil; -import org.dromara.neutrinoproxy.client.config.ProxyConfig; -import org.dromara.neutrinoproxy.client.util.ProxyUtil; -import org.dromara.neutrinoproxy.client.util.UdpServerUtil; -import org.dromara.neutrinoproxy.core.ProxyMessage; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.*; import lombok.extern.slf4j.Slf4j; -import org.noear.solon.Solon; +import org.dromara.neutrinoproxy.client.config.ProxyConfiguration; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Init; import org.noear.solon.annotation.Inject; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - /** * 代理客户端服务 * @author: aoshiguchen @@ -24,107 +14,15 @@ import java.util.concurrent.TimeUnit; */ @Slf4j @Component -public class ProxyClientService { - @Inject - private ProxyConfig proxyConfig; - @Inject("cmdTunnelBootstrap") - private Bootstrap cmdTunnelBootstrap; - @Inject("udpServerBootstrap") - private Bootstrap udpServerBootstrap; - private volatile Channel channel; - /** - * 重连次数 - */ - private volatile int reconnectCount = 0; - /** - * 重连服务执行器 - */ - private static final ScheduledExecutorService reconnectExecutor = Executors.newSingleThreadScheduledExecutor(new CustomThreadFactory("ClientReconnect")); - +public class ProxyClientService{ + @Inject + private ProxyConfiguration proxyConfiguration; + @Inject + private ProxyConfig proxyConfig; @Init public void init() { - this.reconnectExecutor.scheduleWithFixedDelay(this::reconnect, 10, proxyConfig.getTunnel().getReconnection().getIntervalSeconds(), TimeUnit.SECONDS); - - try { - this.start(); - UdpServerUtil.initCache(proxyConfig, udpServerBootstrap); - } catch (Exception e) { - // 启动连不上也做一下重连,因此先catch异常 - log.error("[CmdChannel] start error", e); - } - } - - public void start() { - if (StrUtil.isEmpty(proxyConfig.getTunnel().getServerIp())) { - log.error("not found server-ip config."); - Solon.stop(); - return; - } - if (null == proxyConfig.getTunnel().getServerPort()) { - log.error("not found server-port config."); - Solon.stop(); - return; - } - if (null != proxyConfig.getTunnel().getSslEnable() && proxyConfig.getTunnel().getSslEnable() - && StrUtil.isEmpty(proxyConfig.getTunnel().getJksPath())) { - log.error("not found jks-path config."); - Solon.stop(); - return; - } - if (StrUtil.isEmpty(proxyConfig.getTunnel().getLicenseKey())) { - log.error("not found license-key config."); - Solon.stop(); - return; - } - if (null == channel || !channel.isActive()) { - try { - connectProxyServer(); - } catch (Exception e) { - log.error("client start error", e); - } - } else { - channel.writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getTunnel().getLicenseKey(), ProxyUtil.getClientId())); - } - } - - /** - * 连接代理服务器 - */ - private void connectProxyServer() throws InterruptedException { - cmdTunnelBootstrap.connect() - .addListener(new ChannelFutureListener() { - - @Override - public void operationComplete(ChannelFuture future) throws Exception { - if (future.isSuccess()) { - channel = future.channel(); - // 连接成功,向服务器发送客户端认证信息(licenseKey) - ProxyUtil.setCmdChannel(future.channel()); - future.channel().writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getTunnel().getLicenseKey(), ProxyUtil.getClientId())); - log.info("[CmdChannel] connect proxy server success. channelId:{}", future.channel().id().asLongText()); - -// reconnectServiceEnable = true; - reconnectCount = 0; - } else { - log.info("[CmdChannel] connect proxy server failed!"); - } - } - }).sync(); - } - - protected synchronized void reconnect() { - if (null != channel) { - if (channel.isActive()) { - return; - } - channel.close(); - } - - log.info("[CmdChannel] client reconnect seq:{}", ++reconnectCount); - try { - connectProxyServer(); - } catch (Exception e) { - log.error("[CmdChannel] reconnect error", e); - } + log.info("启动中...."); + proxyConfiguration.start(proxyConfig); + log.info("启动成功...."); } } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/BeanHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/BeanHandler.java new file mode 100644 index 00000000..35b0fd9c --- /dev/null +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/BeanHandler.java @@ -0,0 +1,20 @@ +package org.dromara.neutrinoproxy.client.handler; + +import org.dromara.neutrinoproxy.client.sdk.config.IBeanHandler; +import org.dromara.neutrinoproxy.client.sdk.config.ProxyConfig; +import org.dromara.neutrinoproxy.core.dispatcher.Dispatcher; +import org.noear.solon.Solon; + + +public class BeanHandler implements IBeanHandler { + + @Override + public Dispatcher getDispatcher(){ + return Solon.context().getBean("dispatcher"); + } + + @Override + public ProxyConfig getProxyConfig() { + return Solon.context().getBean(ProxyConfig.class); + } +} diff --git a/pom.xml b/pom.xml index 46b7b52b..70cd80d5 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ neutrino-proxy-core neutrino-proxy-client neutrino-proxy-server + neutrino-proxy-client-sdk