diff --git a/.gitignore b/.gitignore index 993208fd..b204d46d 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,5 @@ hs_err_pid* **/memo/** -neutrino-proxy-vuepress/deploy.sh \ No newline at end of file +neutrino-proxy-vuepress/deploy.sh +.NEUTRINO_PROXY_CLIENT_ID diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/CustomConfig.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/CustomConfig.java deleted file mode 100644 index 6f8de075..00000000 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/CustomConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2022 aoshiguchen - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.dromara.neutrinoproxy.client.config; - -import lombok.Data; - -/** - * @author: aoshiguchen - * @date: 2022/10/18 - */ -@Data -public class CustomConfig { - private String jksPath; - private String serverIp; - private Integer serverPort; - private Boolean sslEnable; - private String licenseKey; -} diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java index 20f48a18..ebe8376d 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/config/ProxyConfig.java @@ -39,5 +39,6 @@ public class ProxyConfig { private Integer obtainLicenseInterval; private String licenseKey; private Integer threadCount; + private String clientId; } } 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 d79a01b9..27759491 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 @@ -142,7 +142,7 @@ public class ProxyClientService { log.error("client start error", e); } } else { - channel.writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getClient().getLicenseKey())); + channel.writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getClient().getLicenseKey(), ProxyUtil.getClientId())); } } @@ -159,7 +159,7 @@ public class ProxyClientService { channel = future.channel(); // 连接成功,向服务器发送客户端认证信息(licenseKey) ProxyUtil.setCmdChannel(future.channel()); - future.channel().writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getClient().getLicenseKey())); + future.channel().writeAndFlush(ProxyMessage.buildAuthMessage(proxyConfig.getClient().getLicenseKey(), ProxyUtil.getClientId())); log.info("连接代理服务成功. channelId:{}", future.channel().id().asLongText()); // reconnectServiceEnable = true; diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java index e6259caa..9acdcc01 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/handler/ProxyMessageAuthHandler.java @@ -31,7 +31,9 @@ public class ProxyMessageAuthHandler implements ProxyMessageHandler { log.info("client auth failed , client stop."); context.channel().close(); Solon.stop(); - } else { + } else if (ExceptionEnum.CONNECT_FAILED.getCode().equals(code) || + ExceptionEnum.LICENSE_CANNOT_REPEAT_CONNECT.getCode().equals(code) + ){ context.channel().close(); } } diff --git a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java index 1bbb711d..897b139b 100644 --- a/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java +++ b/neutrino-proxy-client/src/main/java/org/dromara/neutrinoproxy/client/util/ProxyUtil.java @@ -21,6 +21,8 @@ */ package org.dromara.neutrinoproxy.client.util; +import org.apache.commons.lang3.StringUtils; +import org.dromara.neutrinoproxy.client.config.ProxyConfig; import org.dromara.neutrinoproxy.client.core.ProxyChannelBorrowListener; import org.dromara.neutrinoproxy.core.Constants; import io.netty.bootstrap.Bootstrap; @@ -29,10 +31,12 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelOption; import io.netty.util.AttributeKey; +import org.dromara.neutrinoproxy.core.util.FileUtil; import org.noear.solon.Solon; import java.util.Iterator; import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -54,6 +58,9 @@ public class ProxyUtil { private static volatile Channel cmdChannel; + private static String clientId; + private static final String CLIENT_ID_FILE = ".NEUTRINO_PROXY_CLIENT_ID"; + public static void borrowProxyChanel(Bootstrap bootstrap, final ProxyChannelBorrowListener borrowListener) { Channel channel = proxyChannelPool.poll(); if (null != channel) { @@ -129,4 +136,24 @@ public class ProxyUtil { realServerChannels.clear(); } + + public static String getClientId() { + if (StringUtils.isNotBlank(clientId)) { + return clientId; + } + ProxyConfig proxyConfig = Solon.context().getBean(ProxyConfig.class); + if (StringUtils.isNotBlank(proxyConfig.getClient().getClientId())) { + clientId = proxyConfig.getClient().getClientId(); + return clientId; + } + String id = FileUtil.readContentAsString(CLIENT_ID_FILE); + if (StringUtils.isNotBlank(id)) { + clientId = id; + return id; + } + id = UUID.randomUUID().toString().replace("-", ""); + FileUtil.write(CLIENT_ID_FILE, id); + clientId = id; + return id; + } } diff --git a/neutrino-proxy-client/src/main/resources/app.yml b/neutrino-proxy-client/src/main/resources/app.yml index db8bfaf2..386790ee 100644 --- a/neutrino-proxy-client/src/main/resources/app.yml +++ b/neutrino-proxy-client/src/main/resources/app.yml @@ -21,3 +21,4 @@ neutrino: ssl-enable: ${SSL_ENABLE:true} obtain-license-interval: 5 license-key: ${LICENSE_KEY:} + client-id: ${CLIENT_ID:} diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ExceptionEnum.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ExceptionEnum.java index ca02fb37..71cdc7a9 100644 --- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ExceptionEnum.java +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ExceptionEnum.java @@ -36,6 +36,7 @@ public enum ExceptionEnum { SUCCESS(0, "成功"), AUTH_FAILED(1, "认证失败"), CONNECT_FAILED(2, "连接失败"), + @Deprecated LICENSE_CANNOT_REPEAT_CONNECT(3, "license不能多个客户端同时使用"), ; diff --git a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessage.java b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessage.java index b4b0e299..5470565e 100644 --- a/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessage.java +++ b/neutrino-proxy-core/src/main/java/org/dromara/neutrinoproxy/core/ProxyMessage.java @@ -100,9 +100,9 @@ public class ProxyMessage { return create().setType(TYPE_HEARTBEAT); } - public static ProxyMessage buildAuthMessage(String info) { + public static ProxyMessage buildAuthMessage(String info, String clientId) { return create().setType(TYPE_AUTH) - .setInfo(info); + .setInfo(info + "," + clientId); } public static ProxyMessage buildAuthResultMessage(Integer code, String msg, String licenseKey) { diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java index 6e78924a..8636b74f 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/ProxyTunnelChannelHandler.java @@ -99,6 +99,8 @@ public class ProxyTunnelChannelHandler extends SimpleChannelInboundHandler subdomainToServerPort = new HashMap<>(); + /** + * licenseId - 客户端Id映射 + */ + private static Map licenseIdToClientIdMap = new HashMap<>(); /** * 初始化代理信息 @@ -387,4 +391,30 @@ public class ProxyUtil { // ignore } } + + /** + * 设置licenseId - clientId映射 + * @param licenseId + * @param clientId + */ + public static void setLicenseIdToClientIdMap(Integer licenseId, String clientId) { + licenseIdToClientIdMap.put(licenseId, clientId); + } + + /** + * 根据licenseId获取clientId + * @param licenseId + * @return + */ + public static String getClientIdByLicenseId(Integer licenseId) { + return licenseIdToClientIdMap.get(licenseId); + } + + /** + * 根据licenseId删除clientId + * @param licenseId + */ + public static void removeClientIdByLicenseId(Integer licenseId) { + licenseIdToClientIdMap.remove(licenseId); + } }