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

View File

@ -58,10 +58,13 @@ public class NettySocks5CommandRequestHandler extends SimpleChannelInboundHandle
NettyProxyMsg proxyMsg = new NettyProxyMsg(); NettyProxyMsg proxyMsg = new NettyProxyMsg();
proxyMsg.setVisitorId(visitorId); proxyMsg.setVisitorId(visitorId);
proxyMsg.setClientTargetIp(host);
proxyMsg.setClientTargetPort(port);
ProxyRoute route = RouteContext.getRoute(host, String.valueOf(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)){ if(ObjectUtils.isEmpty(route)){
proxyMsg.setType(ProxyMessageType.SOCKET_LOCAL_PROXY); proxyMsg.setType(ProxyMessageType.SOCKET_LOCAL_PROXY);
}else { }else {
@ -69,14 +72,14 @@ public class NettySocks5CommandRequestHandler extends SimpleChannelInboundHandle
proxyMsg.setType(ProxyMessageType.SOCKET_LOCAL_PROXY); proxyMsg.setType(ProxyMessageType.SOCKET_LOCAL_PROXY);
}else if (RouteType.CLIENT_PROXY_CLIENT.equals(route.getRouteType())){ }else if (RouteType.CLIENT_PROXY_CLIENT.equals(route.getRouteType())){
ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route; ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route;
String clientId = clientProxyRoute.getClientId(); String clientId = clientProxyRoute.getTargetClientId();
proxyMsg.setClientId(clientId); proxyMsg.setClientId(clientId);
proxyMsg.setType(ProxyMessageType.SOCKET_CLIENT_PROXY_CLIENT_); proxyMsg.setType(ProxyMessageType.SOCKET_CLIENT_PROXY_CLIENT_);
}else if (RouteType.CLIENT_PROXY_SEVER.equals(route.getRouteType())){ }else if (RouteType.CLIENT_PROXY_SEVER.equals(route.getRouteType())){
proxyMsg.setType(ProxyMessageType.SOCKET_CLIENT_PROXY_SERVER_); proxyMsg.setType(ProxyMessageType.SOCKET_CLIENT_PROXY_SERVER_);
}else if (RouteType.SERVER_PROXY_CLIENT.equals(route.getRouteType())){ }else if (RouteType.SERVER_PROXY_CLIENT.equals(route.getRouteType())){
ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route; ClientProxyRoute clientProxyRoute= (ClientProxyRoute) route;
String clientId = clientProxyRoute.getClientId(); String clientId = clientProxyRoute.getTargetClientId();
proxyMsg.setClientId(clientId); proxyMsg.setClientId(clientId);
proxyMsg.setType(ProxyMessageType.SOCKET_SERVER_PROXY_CLIENT_); 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 * 路由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 interface ProxyRoute {
public String getAllowIp(); public String getVirtualIp();
public RouteType getRouteType(); 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) { public static void setRoute(ProxyRoute route) {
RouteType routeType = route.getRouteType(); RouteType routeType = route.getRouteType();
String allowIp = route.getAllowIp(); String virtualIp = route.getVirtualIp();
String allowPort = route.getAllowPort(); String virtualPort = route.getVirtualPort();
String key = allowIp + ":" + allowPort + routeType; String key = virtualIp + ":" + virtualPort + routeType;
if (m.containsKey(key)) { if (m.containsKey(key)) {
return; return;
} }
@ -27,7 +27,7 @@ public class RouteContext {
public static ProxyRoute getRoute(String ip, String port) { public static ProxyRoute getRoute(String ip, String port) {
ProxyRoute p = m.values() ProxyRoute p = m.values()
.stream() .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() .findFirst()
.orElse(null); .orElse(null);
return p; return p;

View File

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

View File

@ -98,7 +98,7 @@ public class LazyNettyClientVirtualRouteDO {
* 客户端虚拟路由IP * 客户端虚拟路由IP
*/ */
@Schema(description ="客户端虚拟路由IP",name ="virtualIp",example = "") @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; private String virtualIp;
/** /**
@ -106,7 +106,7 @@ public class LazyNettyClientVirtualRouteDO {
* 客户端虚拟路由端口默认ALL * 客户端虚拟路由端口默认ALL
*/ */
@Schema(description ="客户端虚拟路由端口默认ALL",name ="virtualPort",example = "") @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; private String virtualPort;
} }

View File

@ -90,7 +90,7 @@ public class LazyNettyServerVirtualRouteDO {
* 虚拟服务端路由IP * 虚拟服务端路由IP
*/ */
@Schema(description ="虚拟服务端路由IP",name ="virtualIp",example = "") @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; private String virtualIp;
/** /**
@ -98,7 +98,7 @@ public class LazyNettyServerVirtualRouteDO {
* 虚拟服务端路由端口默认ALL * 虚拟服务端路由端口默认ALL
*/ */
@Schema(description ="虚拟服务端路由端口默认ALL",name ="virtualPort",example = "") @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; 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.entity.LazyNettyClientRouteDO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyClientRouteConverter; 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.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 org.springframework.stereotype.Repository;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -52,23 +53,40 @@ public class LazyNettyClientRouteRepositoryImpl implements LazyNettyClientRout
public Result<LazyNettyClientRoute> story(LazyNettyClientRoute lazyNettyClientRoute) { public Result<LazyNettyClientRoute> story(LazyNettyClientRoute lazyNettyClientRoute) {
LazyNettyClientRouteDO lazyNettyClientRouteDO = LazyNettyClientRouteConverter.INSTANCE.fromLazyNettyClientRoute(lazyNettyClientRoute); LazyNettyClientRouteDO lazyNettyClientRouteDO = LazyNettyClientRouteConverter.INSTANCE.fromLazyNettyClientRoute(lazyNettyClientRoute);
lazyLambdaStream.upsert(lazyNettyClientRouteDO); lazyLambdaStream.upsert(lazyNettyClientRouteDO);
// 更新服务端路由
String routeIp = lazyNettyClientRoute.getRouteIp(); String routeIp = lazyNettyClientRoute.getRouteIp();
String routePort = lazyNettyClientRoute.getRoutePort(); String routePort = lazyNettyClientRoute.getRoutePort();
String clientId = lazyNettyClientRoute.getClientId(); 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(); ClientProxyRoute serverProxyClientRoute = new ClientProxyRoute();
serverProxyClientRoute.setClientId(clientId); serverProxyClientRoute.setTargetClientId(clientId);
serverProxyClientRoute.setAllowIp(routeIp); serverProxyClientRoute.setVirtualIp(routeIp);
serverProxyClientRoute.setAllowPort(routePort); serverProxyClientRoute.setVirtualPort(routePort);
serverProxyClientRoute.setTargetIp(routeIp);
serverProxyClientRoute.setTargetPort(routePort);
serverProxyClientRoute.setRouteType(RouteType.SERVER_PROXY_CLIENT); serverProxyClientRoute.setRouteType(RouteType.SERVER_PROXY_CLIENT);
RouteContext.setRoute(serverProxyClientRoute); RouteContext.setRoute(serverProxyClientRoute);
ClientProxyRoute clientProxyRoute = new ClientProxyRoute(); ClientProxyRoute clientProxyRoute = new ClientProxyRoute();
clientProxyRoute.setClientId(clientId); clientProxyRoute.setTargetClientId(clientId);
clientProxyRoute.setAllowIp(routeIp); clientProxyRoute.setVirtualIp(routeIp);
clientProxyRoute.setAllowPort(routePort); clientProxyRoute.setVirtualPort(routePort);
clientProxyRoute.setTargetIp(routeIp);
clientProxyRoute.setTargetPort(routePort);
clientProxyRoute.setRouteType(RouteType.CLIENT_PROXY_CLIENT); clientProxyRoute.setRouteType(RouteType.CLIENT_PROXY_CLIENT);
// 发送所有客户端本地路由刷新 // 发送所有客户端本地路由刷新
ChannelContext.getChannels().forEach((channelClientId, channels) -> { ChannelContext.getChannels().forEach((channelClientId, channels) -> {

View File

@ -1,6 +1,14 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.persistence; 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 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.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.domain.model.lazy.netty.client.virtual.route.LazyNettyClientVirtualRouteRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyClientVirtualRouteConverter; 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.Result;
import org.wu.framework.web.response.ResultFactory; import org.wu.framework.web.response.ResultFactory;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -42,6 +51,44 @@ public class LazyNettyClientVirtualRouteRepositoryImpl implements LazyNettyClien
public Result<LazyNettyClientVirtualRoute> story(LazyNettyClientVirtualRoute lazyNettyClientVirtualRoute) { public Result<LazyNettyClientVirtualRoute> story(LazyNettyClientVirtualRoute lazyNettyClientVirtualRoute) {
LazyNettyClientVirtualRouteDO lazyNettyClientVirtualRouteDO = LazyNettyClientVirtualRouteConverter.INSTANCE.fromLazyNettyClientVirtualRoute(lazyNettyClientVirtualRoute); LazyNettyClientVirtualRouteDO lazyNettyClientVirtualRouteDO = LazyNettyClientVirtualRouteConverter.INSTANCE.fromLazyNettyClientVirtualRoute(lazyNettyClientVirtualRoute);
lazyLambdaStream.upsert(lazyNettyClientVirtualRouteDO); 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(); 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.entity.LazyNettyServerRouteDO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyServerRouteConverter; 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.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 org.springframework.stereotype.Repository;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -52,20 +53,34 @@ public class LazyNettyServerRouteRepositoryImpl implements LazyNettyServerRout
public Result<LazyNettyServerRoute> story(LazyNettyServerRoute lazyNettyServerRoute) { public Result<LazyNettyServerRoute> story(LazyNettyServerRoute lazyNettyServerRoute) {
LazyNettyServerRouteDO lazyNettyServerRouteDO = LazyNettyServerRouteConverter.INSTANCE.fromLazyNettyServerRoute(lazyNettyServerRoute); LazyNettyServerRouteDO lazyNettyServerRouteDO = LazyNettyServerRouteConverter.INSTANCE.fromLazyNettyServerRoute(lazyNettyServerRoute);
lazyLambdaStream.upsert(lazyNettyServerRouteDO); lazyLambdaStream.upsert(lazyNettyServerRouteDO);
// 更新服务端路由
String routeIp = lazyNettyServerRoute.getRouteIp(); String routeIp = lazyNettyServerRoute.getRouteIp();
String routePort = lazyNettyServerRoute.getRoutePort(); 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 serverProxyRoute = new ServerProxyRoute();
serverProxyRoute.setServerIp("default"); serverProxyRoute.setServerIp("default");
serverProxyRoute.setAllowIp(routeIp); serverProxyRoute.setVirtualIp(routeIp);
serverProxyRoute.setAllowPort(routePort); serverProxyRoute.setVirtualPort(routePort);
serverProxyRoute.setTargetIp(routeIp);
serverProxyRoute.setTargetPort(routePort);
serverProxyRoute.setRouteType(RouteType.LOCAL); serverProxyRoute.setRouteType(RouteType.LOCAL);
RouteContext.setRoute(serverProxyRoute); RouteContext.setRoute(serverProxyRoute);
ServerProxyRoute clientProxyServerRoute = new ServerProxyRoute(); ServerProxyRoute clientProxyServerRoute = new ServerProxyRoute();
clientProxyServerRoute.setServerIp("default"); clientProxyServerRoute.setServerIp("default");
clientProxyServerRoute.setAllowIp(routeIp); clientProxyServerRoute.setVirtualIp(routeIp);
clientProxyServerRoute.setAllowPort(routePort); clientProxyServerRoute.setVirtualPort(routePort);
clientProxyServerRoute.setTargetIp(routeIp);
clientProxyServerRoute.setTargetPort(routePort);
clientProxyServerRoute.setRouteType(RouteType.CLIENT_PROXY_SEVER); clientProxyServerRoute.setRouteType(RouteType.CLIENT_PROXY_SEVER);
// 发送所有客户端本地路由刷新 // 发送所有客户端本地路由刷新
ChannelContext.getChannels().forEach((clientId, channels) -> { ChannelContext.getChannels().forEach((clientId, channels) -> {

View File

@ -1,6 +1,14 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.persistence; 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 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.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.domain.model.lazy.netty.server.virtual.route.LazyNettyServerVirtualRouteRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyServerVirtualRouteConverter; 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.Result;
import org.wu.framework.web.response.ResultFactory; import org.wu.framework.web.response.ResultFactory;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -40,8 +49,45 @@ public class LazyNettyServerVirtualRouteRepositoryImpl implements LazyNettyServe
@Override @Override
public Result<LazyNettyServerVirtualRoute> story(LazyNettyServerVirtualRoute lazyNettyServerVirtualRoute) { public Result<LazyNettyServerVirtualRoute> story(LazyNettyServerVirtualRoute lazyNettyServerVirtualRoute) {
// 验证ip是否存在
//数据下发
LazyNettyServerVirtualRouteDO lazyNettyServerVirtualRouteDO = LazyNettyServerVirtualRouteConverter.INSTANCE.fromLazyNettyServerVirtualRoute(lazyNettyServerVirtualRoute); LazyNettyServerVirtualRouteDO lazyNettyServerVirtualRouteDO = LazyNettyServerVirtualRouteConverter.INSTANCE.fromLazyNettyServerVirtualRoute(lazyNettyServerVirtualRoute);
lazyLambdaStream.upsert(lazyNettyServerVirtualRouteDO); 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(); return ResultFactory.successOf();
} }