【fix】添加虚拟路由管理

This commit is contained in:
wujiawei 2025-05-06 17:48:41 +08:00
parent 9a44a598ef
commit 965142793c
12 changed files with 198 additions and 38 deletions

View File

@ -80,13 +80,17 @@ public class NettyHttpProxyHandler extends ChannelInboundHandlerAdapter {
String visitorId = ChannelAttributeKeyUtils.getVisitorId(ctx.channel());
NettyProxyMsg proxyMsg = new NettyProxyMsg();
ProxyRoute route = RouteContext.getRoute(host, String.valueOf(port));
String targetIp = route.getTargetIp();
String targetPort = route.getTargetPort();
proxyMsg.setVisitorId(visitorId);
proxyMsg.setClientTargetIp(host);
proxyMsg.setClientTargetPort(port);
proxyMsg.setClientTargetIp(targetIp);
proxyMsg.setClientTargetPort(Integer.valueOf(targetPort));
proxyMsg.setData(bytes);
ProxyRoute route = RouteContext.getRoute(host, String.valueOf(port));
if(ObjectUtils.isEmpty(route)){
proxyMsg.setType(ProxyMessageType.HTTP_LOCAL_PROXY);
}else {
@ -94,14 +98,14 @@ public class NettyHttpProxyHandler extends ChannelInboundHandlerAdapter {
proxyMsg.setType(ProxyMessageType.HTTP_LOCAL_PROXY);
}else if (RouteType.CLIENT_PROXY_CLIENT.equals(route.getRouteType())){
ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route;
String clientId = clientProxyRoute.getClientId();
String clientId = clientProxyRoute.getTargetClientId();
proxyMsg.setClientId(clientId);
proxyMsg.setType(ProxyMessageType.HTTP_CLIENT_PROXY_CLIENT_);
}else if (RouteType.CLIENT_PROXY_SEVER.equals(route.getRouteType())){
proxyMsg.setType(ProxyMessageType.HTTP_CLIENT_PROXY_SERVER_);
}else if (RouteType.SERVER_PROXY_CLIENT.equals(route.getRouteType())){
ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route;
String clientId = clientProxyRoute.getClientId();
String clientId = clientProxyRoute.getTargetClientId();
proxyMsg.setClientId(clientId);
proxyMsg.setType(ProxyMessageType.HTTP_SERVER_PROXY_CLIENT_);
}

View File

@ -58,10 +58,13 @@ public class NettySocks5CommandRequestHandler extends SimpleChannelInboundHandle
NettyProxyMsg proxyMsg = new NettyProxyMsg();
proxyMsg.setVisitorId(visitorId);
proxyMsg.setClientTargetIp(host);
proxyMsg.setClientTargetPort(port);
ProxyRoute route = RouteContext.getRoute(host, String.valueOf(port));
String targetIp = route.getTargetIp();
String targetPort = route.getTargetPort();
proxyMsg.setClientTargetIp(targetIp);
proxyMsg.setClientTargetPort(Integer.parseInt(targetPort));
if(ObjectUtils.isEmpty(route)){
proxyMsg.setType(ProxyMessageType.SOCKET_LOCAL_PROXY);
}else {
@ -69,14 +72,14 @@ public class NettySocks5CommandRequestHandler extends SimpleChannelInboundHandle
proxyMsg.setType(ProxyMessageType.SOCKET_LOCAL_PROXY);
}else if (RouteType.CLIENT_PROXY_CLIENT.equals(route.getRouteType())){
ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route;
String clientId = clientProxyRoute.getClientId();
String clientId = clientProxyRoute.getTargetClientId();
proxyMsg.setClientId(clientId);
proxyMsg.setType(ProxyMessageType.SOCKET_CLIENT_PROXY_CLIENT_);
}else if (RouteType.CLIENT_PROXY_SEVER.equals(route.getRouteType())){
proxyMsg.setType(ProxyMessageType.SOCKET_CLIENT_PROXY_SERVER_);
}else if (RouteType.SERVER_PROXY_CLIENT.equals(route.getRouteType())){
ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route;
String clientId = clientProxyRoute.getClientId();
String clientId = clientProxyRoute.getTargetClientId();
proxyMsg.setClientId(clientId);
proxyMsg.setType(ProxyMessageType.SOCKET_SERVER_PROXY_CLIENT_);
}

View File

@ -11,19 +11,29 @@ public class ClientProxyRoute implements ProxyRoute{
/**
*
* 客户端ID
* 目标客户端ID
*/
private String clientId;
private String targetClientId;
/**
*
* 虚拟IP
*/
private String virtualIp;
/**
* 虚拟端口
*/
private String virtualPort;
/**
*
* 路由IP
*/
private String allowIp;
private String targetIp;
/**
* 允许代理的端口
*/
private String allowPort;
private String targetPort;
/**
* 路由类型

View File

@ -6,11 +6,17 @@ package org.framework.lazy.cloud.network.heartbeat.protocol.route;
public interface ProxyRoute {
public String getAllowIp();
public String getVirtualIp();
public RouteType getRouteType();
public String getAllowPort();
public String getVirtualPort();
public String getTargetIp();
public String getTargetPort();
}

View File

@ -14,9 +14,9 @@ public class RouteContext {
public static void setRoute(ProxyRoute route) {
RouteType routeType = route.getRouteType();
String allowIp = route.getAllowIp();
String allowPort = route.getAllowPort();
String key = allowIp + ":" + allowPort + routeType;
String virtualIp = route.getVirtualIp();
String virtualPort = route.getVirtualPort();
String key = virtualIp + ":" + virtualPort + routeType;
if (m.containsKey(key)) {
return;
}
@ -27,7 +27,7 @@ public class RouteContext {
public static ProxyRoute getRoute(String ip, String port) {
ProxyRoute p = m.values()
.stream()
.filter(route -> route.getAllowIp().equals(ip) && (route.getAllowPort().equals(port) || route.getAllowPort().equals("ALL")))
.filter(route -> route.getVirtualIp().equals(ip) && (route.getVirtualPort().equals(port) || route.getVirtualPort().equals("ALL")))
.findFirst()
.orElse(null);
return p;

View File

@ -16,15 +16,26 @@ public class ServerProxyRoute implements ProxyRoute {
private String serverIp;
/**
*
* 虚拟IP
*/
private String virtualIp;
/**
* 虚拟端口
*/
private String virtualPort;
/**
*
* 路由IP
*/
private String allowIp;
private String targetIp;
/**
* 允许代理的端口
*/
private String allowPort;
private String targetPort;
/**
* 路由类型

View File

@ -98,7 +98,7 @@ public class LazyNettyClientVirtualRouteDO {
* 客户端虚拟路由IP
*/
@Schema(description ="客户端虚拟路由IP",name ="virtualIp",example = "")
@LazyTableField(name="virtual_ip",comment="客户端虚拟路由IP",notNull=true,columnType="varchar(255)")
@LazyTableFieldUnique(name="virtual_ip",comment="客户端虚拟路由IP",notNull=true,columnType="varchar(255)")
private String virtualIp;
/**
@ -106,7 +106,7 @@ public class LazyNettyClientVirtualRouteDO {
* 客户端虚拟路由端口默认ALL
*/
@Schema(description ="客户端虚拟路由端口默认ALL",name ="virtualPort",example = "")
@LazyTableField(name="virtual_port",comment="客户端虚拟路由端口默认ALL",notNull=true,defaultValue="'ALL'",upsertStrategy = LazyFieldStrategy.NEVER,columnType="varchar(255)")
@LazyTableFieldUnique(name="virtual_port",comment="客户端虚拟路由端口默认ALL",notNull=true,defaultValue="'ALL'",upsertStrategy = LazyFieldStrategy.NEVER,columnType="varchar(255)")
private String virtualPort;
}

View File

@ -90,7 +90,7 @@ public class LazyNettyServerVirtualRouteDO {
* 虚拟服务端路由IP
*/
@Schema(description ="虚拟服务端路由IP",name ="virtualIp",example = "")
@LazyTableField(name="virtual_ip",comment="虚拟服务端路由IP",notNull=true,columnType="varchar(255)")
@LazyTableFieldUnique(name="virtual_ip",comment="虚拟服务端路由IP",notNull=true,columnType="varchar(255)")
private String virtualIp;
/**
@ -98,7 +98,7 @@ public class LazyNettyServerVirtualRouteDO {
* 虚拟服务端路由端口默认ALL
*/
@Schema(description ="虚拟服务端路由端口默认ALL",name ="virtualPort",example = "")
@LazyTableField(name="virtual_port",comment="虚拟服务端路由端口默认ALL",notNull=true,defaultValue="'ALL'",upsertStrategy = LazyFieldStrategy.NEVER,columnType="varchar(255)")
@LazyTableFieldUnique(name="virtual_port",comment="虚拟服务端路由端口默认ALL",notNull=true,defaultValue="'ALL'",upsertStrategy = LazyFieldStrategy.NEVER,columnType="varchar(255)")
private String virtualPort;
}

View File

@ -11,6 +11,7 @@ import org.framework.lazy.cloud.network.heartbeat.protocol.route.RouteType;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.entity.LazyNettyClientRouteDO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyClientRouteConverter;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.route.LazyNettyClientRouteRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.entity.LazyNettyClientVirtualRouteDO;
import org.springframework.stereotype.Repository;
import java.nio.charset.StandardCharsets;
@ -52,23 +53,40 @@ public class LazyNettyClientRouteRepositoryImpl implements LazyNettyClientRout
public Result<LazyNettyClientRoute> story(LazyNettyClientRoute lazyNettyClientRoute) {
LazyNettyClientRouteDO lazyNettyClientRouteDO = LazyNettyClientRouteConverter.INSTANCE.fromLazyNettyClientRoute(lazyNettyClientRoute);
lazyLambdaStream.upsert(lazyNettyClientRouteDO);
// 更新服务端路由
String routeIp = lazyNettyClientRoute.getRouteIp();
String routePort = lazyNettyClientRoute.getRoutePort();
String clientId = lazyNettyClientRoute.getClientId();
// 新增虚拟ip映射
LazyNettyClientVirtualRouteDO lazyNettyClientVirtualRouteDO = new LazyNettyClientVirtualRouteDO();
lazyNettyClientVirtualRouteDO.setIsDeleted(false);
lazyNettyClientVirtualRouteDO.setTargetClientId(clientId);
lazyNettyClientVirtualRouteDO.setVirtualIp(routeIp);
lazyNettyClientVirtualRouteDO.setVirtualPort(routePort);
lazyNettyClientVirtualRouteDO.setTargetIp(routeIp);
lazyNettyClientVirtualRouteDO.setTargetPort(routePort);
lazyLambdaStream.upsert(lazyNettyClientVirtualRouteDO);
// 更新服务端路由
ClientProxyRoute serverProxyClientRoute = new ClientProxyRoute();
serverProxyClientRoute.setClientId(clientId);
serverProxyClientRoute.setAllowIp(routeIp);
serverProxyClientRoute.setAllowPort(routePort);
serverProxyClientRoute.setTargetClientId(clientId);
serverProxyClientRoute.setVirtualIp(routeIp);
serverProxyClientRoute.setVirtualPort(routePort);
serverProxyClientRoute.setTargetIp(routeIp);
serverProxyClientRoute.setTargetPort(routePort);
serverProxyClientRoute.setRouteType(RouteType.SERVER_PROXY_CLIENT);
RouteContext.setRoute(serverProxyClientRoute);
ClientProxyRoute clientProxyRoute = new ClientProxyRoute();
clientProxyRoute.setClientId(clientId);
clientProxyRoute.setAllowIp(routeIp);
clientProxyRoute.setAllowPort(routePort);
clientProxyRoute.setTargetClientId(clientId);
clientProxyRoute.setVirtualIp(routeIp);
clientProxyRoute.setVirtualPort(routePort);
clientProxyRoute.setTargetIp(routeIp);
clientProxyRoute.setTargetPort(routePort);
clientProxyRoute.setRouteType(RouteType.CLIENT_PROXY_CLIENT);
// 发送所有客户端本地路由刷新
ChannelContext.getChannels().forEach((channelClientId, channels) -> {

View File

@ -1,6 +1,14 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.persistence;
import com.alibaba.fastjson.JSON;
import io.netty.channel.Channel;
import jakarta.annotation.Resource;
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
import org.framework.lazy.cloud.network.heartbeat.protocol.route.ClientProxyRoute;
import org.framework.lazy.cloud.network.heartbeat.protocol.route.RouteContext;
import org.framework.lazy.cloud.network.heartbeat.protocol.route.RouteType;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.virtual.route.LazyNettyClientVirtualRoute;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.virtual.route.LazyNettyClientVirtualRouteRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyClientVirtualRouteConverter;
@ -13,6 +21,7 @@ import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyWrappers;
import org.wu.framework.web.response.Result;
import org.wu.framework.web.response.ResultFactory;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Collectors;
@ -42,6 +51,44 @@ public class LazyNettyClientVirtualRouteRepositoryImpl implements LazyNettyClien
public Result<LazyNettyClientVirtualRoute> story(LazyNettyClientVirtualRoute lazyNettyClientVirtualRoute) {
LazyNettyClientVirtualRouteDO lazyNettyClientVirtualRouteDO = LazyNettyClientVirtualRouteConverter.INSTANCE.fromLazyNettyClientVirtualRoute(lazyNettyClientVirtualRoute);
lazyLambdaStream.upsert(lazyNettyClientVirtualRouteDO);
// 更新服务端路由
String virtualIp = lazyNettyClientVirtualRoute.getVirtualIp();
String virtualPort = lazyNettyClientVirtualRoute.getVirtualPort();
String targetIp = lazyNettyClientVirtualRoute.getTargetIp();
String targetPort = lazyNettyClientVirtualRoute.getTargetPort();
String targetClientId = lazyNettyClientVirtualRoute.getTargetClientId();
ClientProxyRoute serverProxyClientRoute = new ClientProxyRoute();
serverProxyClientRoute.setVirtualIp(virtualIp);
serverProxyClientRoute.setVirtualPort(virtualPort);
serverProxyClientRoute.setTargetClientId(targetClientId);
serverProxyClientRoute.setTargetIp(targetIp);
serverProxyClientRoute.setTargetPort(targetPort);
serverProxyClientRoute.setRouteType(RouteType.SERVER_PROXY_CLIENT);
RouteContext.setRoute(serverProxyClientRoute);
ClientProxyRoute clientProxyRoute = new ClientProxyRoute();
clientProxyRoute.setVirtualIp(virtualIp);
clientProxyRoute.setVirtualPort(virtualPort);
clientProxyRoute.setTargetClientId(targetClientId);
clientProxyRoute.setTargetIp(targetIp);
clientProxyRoute.setTargetPort(targetPort);
clientProxyRoute.setRouteType(RouteType.CLIENT_PROXY_CLIENT);
// 发送所有客户端本地路由刷新
ChannelContext.getChannels().forEach((channelClientId, channels) -> {
NettyProxyMsg nettyMsg = new NettyProxyMsg();
nettyMsg.setType(ProxyMessageType.HTTP_DISTRIBUTE_CLIENT_PROXY_SERVER_CLIENT_ROUTE_);
nettyMsg.setData((JSON.toJSONString(clientProxyRoute)
.getBytes(StandardCharsets.UTF_8)));
// 发送所有客户端ID
for (Channel channel : channels) {
channel.writeAndFlush(nettyMsg);
}
});
return ResultFactory.successOf();
}

View File

@ -11,6 +11,7 @@ import org.framework.lazy.cloud.network.heartbeat.protocol.route.ServerProxyRout
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.entity.LazyNettyServerRouteDO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyServerRouteConverter;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.server.route.LazyNettyServerRouteRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.entity.LazyNettyServerVirtualRouteDO;
import org.springframework.stereotype.Repository;
import java.nio.charset.StandardCharsets;
@ -52,20 +53,34 @@ public class LazyNettyServerRouteRepositoryImpl implements LazyNettyServerRout
public Result<LazyNettyServerRoute> story(LazyNettyServerRoute lazyNettyServerRoute) {
LazyNettyServerRouteDO lazyNettyServerRouteDO = LazyNettyServerRouteConverter.INSTANCE.fromLazyNettyServerRoute(lazyNettyServerRoute);
lazyLambdaStream.upsert(lazyNettyServerRouteDO);
// 更新服务端路由
String routeIp = lazyNettyServerRoute.getRouteIp();
String routePort = lazyNettyServerRoute.getRoutePort();
// 新增虚拟ip映射
LazyNettyServerVirtualRouteDO lazyNettyServerVirtualRouteDO = new LazyNettyServerVirtualRouteDO();
lazyNettyServerVirtualRouteDO.setIsDeleted(false);
lazyNettyServerVirtualRouteDO.setVirtualIp(routeIp);
lazyNettyServerVirtualRouteDO.setVirtualPort(routePort);
lazyNettyServerVirtualRouteDO.setTargetIp(routeIp);
lazyNettyServerVirtualRouteDO.setTargetPort(routePort);
lazyLambdaStream.upsert(lazyNettyServerVirtualRouteDO);
// 更新服务端路由
ServerProxyRoute serverProxyRoute = new ServerProxyRoute();
serverProxyRoute.setServerIp("default");
serverProxyRoute.setAllowIp(routeIp);
serverProxyRoute.setAllowPort(routePort);
serverProxyRoute.setVirtualIp(routeIp);
serverProxyRoute.setVirtualPort(routePort);
serverProxyRoute.setTargetIp(routeIp);
serverProxyRoute.setTargetPort(routePort);
serverProxyRoute.setRouteType(RouteType.LOCAL);
RouteContext.setRoute(serverProxyRoute);
ServerProxyRoute clientProxyServerRoute = new ServerProxyRoute();
clientProxyServerRoute.setServerIp("default");
clientProxyServerRoute.setAllowIp(routeIp);
clientProxyServerRoute.setAllowPort(routePort);
clientProxyServerRoute.setVirtualIp(routeIp);
clientProxyServerRoute.setVirtualPort(routePort);
clientProxyServerRoute.setTargetIp(routeIp);
clientProxyServerRoute.setTargetPort(routePort);
clientProxyServerRoute.setRouteType(RouteType.CLIENT_PROXY_SEVER);
// 发送所有客户端本地路由刷新
ChannelContext.getChannels().forEach((clientId, channels) -> {

View File

@ -1,6 +1,14 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.persistence;
import com.alibaba.fastjson.JSON;
import io.netty.channel.Channel;
import jakarta.annotation.Resource;
import org.framework.lazy.cloud.network.heartbeat.common.ChannelContext;
import org.framework.lazy.cloud.network.heartbeat.common.advanced.payload.NettyProxyMsg;
import org.framework.lazy.cloud.network.heartbeat.common.constant.ProxyMessageType;
import org.framework.lazy.cloud.network.heartbeat.protocol.route.RouteContext;
import org.framework.lazy.cloud.network.heartbeat.protocol.route.RouteType;
import org.framework.lazy.cloud.network.heartbeat.protocol.route.ServerProxyRoute;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.server.virtual.route.LazyNettyServerVirtualRoute;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.server.virtual.route.LazyNettyServerVirtualRouteRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyServerVirtualRouteConverter;
@ -13,6 +21,7 @@ import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyWrappers;
import org.wu.framework.web.response.Result;
import org.wu.framework.web.response.ResultFactory;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Collectors;
@ -40,8 +49,45 @@ public class LazyNettyServerVirtualRouteRepositoryImpl implements LazyNettyServe
@Override
public Result<LazyNettyServerVirtualRoute> story(LazyNettyServerVirtualRoute lazyNettyServerVirtualRoute) {
// 验证ip是否存在
//数据下发
LazyNettyServerVirtualRouteDO lazyNettyServerVirtualRouteDO = LazyNettyServerVirtualRouteConverter.INSTANCE.fromLazyNettyServerVirtualRoute(lazyNettyServerVirtualRoute);
lazyLambdaStream.upsert(lazyNettyServerVirtualRouteDO);
// 更新服务端路由
String virtualIp = lazyNettyServerVirtualRoute.getVirtualIp();
String virtualPort = lazyNettyServerVirtualRoute.getVirtualPort();
String targetIp = lazyNettyServerVirtualRoute.getTargetIp();
String targetPort = lazyNettyServerVirtualRoute.getTargetPort();
ServerProxyRoute serverProxyRoute = new ServerProxyRoute();
serverProxyRoute.setServerIp("default");
serverProxyRoute.setVirtualIp(virtualIp);
serverProxyRoute.setVirtualPort(virtualPort);
serverProxyRoute.setTargetIp(targetIp);
serverProxyRoute.setTargetPort(targetPort);
serverProxyRoute.setRouteType(RouteType.LOCAL);
RouteContext.setRoute(serverProxyRoute);
ServerProxyRoute clientProxyServerRoute = new ServerProxyRoute();
clientProxyServerRoute.setServerIp("default");
clientProxyServerRoute.setVirtualIp(virtualIp);
clientProxyServerRoute.setVirtualPort(virtualPort);
clientProxyServerRoute.setTargetIp(targetIp);
clientProxyServerRoute.setTargetPort(targetPort);
clientProxyServerRoute.setRouteType(RouteType.CLIENT_PROXY_SEVER);
// 发送所有客户端本地路由刷新
ChannelContext.getChannels().forEach((clientId, channels) -> {
NettyProxyMsg nettyMsg = new NettyProxyMsg();
nettyMsg.setType(ProxyMessageType.HTTP_DISTRIBUTE_CLIENT_PROXY_SERVER_SERVER_ROUTE_);
nettyMsg.setData((JSON.toJSONString(clientProxyServerRoute)
.getBytes(StandardCharsets.UTF_8)));
// 发送所有客户端ID
for (Channel channel : channels) {
channel.writeAndFlush(nettyMsg);
}
});
return ResultFactory.successOf();
}