【fix】proxy代理支持令牌验证

This commit is contained in:
wujiawei
2025-07-14 18:54:10 +08:00
parent f8f485a14a
commit c5aeb6f0f7
19 changed files with 205 additions and 84 deletions

View File

@@ -7,6 +7,8 @@ import org.framework.lazy.cloud.network.heartbeat.client.config.NettyClientPrope
import org.framework.lazy.cloud.network.heartbeat.client.config.PropertiesType;
import org.framework.lazy.cloud.network.heartbeat.client.infrastructure.entity.LazyNettyServerPropertiesDO;
import org.framework.lazy.cloud.network.heartbeat.common.enums.ProtocolType;
import org.framework.lazy.cloud.network.heartbeat.protocol.token.AuthenticationToken;
import org.framework.lazy.cloud.network.heartbeat.protocol.token.AuthenticationTokenContext;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
@@ -74,6 +76,12 @@ public class NettyClientSocketApplicationListener implements ApplicationListener
if (!exists) {
lazyLambdaStream.insert(lazyNettyServerPropertiesDO);
}
// 添加本地token
AuthenticationToken authenticationToken = new AuthenticationToken();
authenticationToken.setUsedByClientId(clientId);
authenticationToken.setAppKey(appKey);
authenticationToken.setAppSecret(appSecret);
AuthenticationTokenContext.setAuthenticationToken(authenticationToken);
}catch (Exception e){
e.printStackTrace();
}

View File

@@ -1,18 +0,0 @@
package org.framework.lazy.cloud.network.heartbeat.client.netty.proxy.auth;
import org.framework.lazy.cloud.network.heartbeat.protocol.auth.AbstractNettyPasswordAuth;
import org.framework.lazy.cloud.network.heartbeat.protocol.properties.ProtocolProxyProperties;
public class ClientNettyPasswordAuth extends AbstractNettyPasswordAuth {
public ClientNettyPasswordAuth(ProtocolProxyProperties protocolProxyProperties) {
super(protocolProxyProperties);
}
@Override
public boolean doVerify(String username, String password) {
// 查找用户名称、密码
return false;
}
}

View File

@@ -2,6 +2,7 @@ package org.framework.lazy.cloud.network.heartbeat.protocol.auth;
import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.protocol.properties.ProtocolProxyProperties;
import org.framework.lazy.cloud.network.heartbeat.protocol.token.AuthenticationTokenContext;
import org.springframework.stereotype.Component;
import java.util.Map;
@@ -11,29 +12,17 @@ import java.util.concurrent.ConcurrentHashMap;
@Component
public class DefaultNettyPasswordAuth extends AbstractNettyPasswordAuth {
protected Map<String/*username*/, String/*password*/> authMap = new ConcurrentHashMap<>();
protected DefaultNettyPasswordAuth(ProtocolProxyProperties protocolProxyProperties) {
super(protocolProxyProperties);
}
@Override
public boolean doVerify(String username, String password) {
boolean verify = authMap.containsKey(username) && authMap.get(username).equals(password);
if(!verify){
boolean verify = AuthenticationTokenContext.verify(username, password);
if (!verify) {
log.error("授权失败");
}
return verify;
}
/**
* 新增授权
*
* @param username 用户
* @param password 密码
*/
public DefaultNettyPasswordAuth addAuth(String username, String password) {
authMap.putIfAbsent(username, password);
return this;
}
}

View File

@@ -0,0 +1,39 @@
package org.framework.lazy.cloud.network.heartbeat.protocol.token;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 授权信息
*/
@Data
public class AuthenticationToken {
/**
* 令牌key
*/
@Schema(description = "令牌key", name = "appKey", example = "")
private String appKey;
/**
* 令牌密钥
*/
@Schema(description = "令牌密钥", name = "appSecret", example = "")
private String appSecret;
/**
* 过期时间
*/
@Schema(description = "过期时间", name = "expireInTime", example = "")
private LocalDateTime expireInTime;
/**
* 被使用的客户端ID
*/
@Schema(description = "被使用的客户端ID", name = "usedByClientId", example = "")
private String usedByClientId;
}

View File

@@ -0,0 +1,83 @@
package org.framework.lazy.cloud.network.heartbeat.protocol.token;
import org.wu.framework.core.utils.ObjectUtils;
import java.util.concurrent.ConcurrentHashMap;
public class AuthenticationTokenContext {
// key appid value AuthenticationToken
private static final ConcurrentHashMap<String, AuthenticationToken> m = new ConcurrentHashMap<>();
/**
* 设置授权信息
*
* @param clientId 客户端ID
* @param appKey 令牌
* @param appSecret 迷药
*/
public static void setAuthenticationToken(String clientId, String appKey, String appSecret) {
AuthenticationToken authenticationToken = new AuthenticationToken();
authenticationToken.setUsedByClientId(clientId);
authenticationToken.setAppKey(appKey);
authenticationToken.setAppSecret(appSecret);
AuthenticationTokenContext.setAuthenticationToken(authenticationToken);
}
/**
* 设置授权信息
*
* @param authenticationToken 授权信息
*/
public static void setAuthenticationToken(AuthenticationToken authenticationToken) {
String key = authenticationToken.getAppKey();
if (m.containsKey(key)) {
m.put(key, authenticationToken);
return;
}
m.put(key, authenticationToken);
}
/**
* 获取授权信息
*
* @param appKey 令牌key
*/
public static AuthenticationToken getAuthenticationToken(String appKey) {
AuthenticationToken p = m.values()
.stream()
.filter(authenticationToken -> authenticationToken.getAppKey().equals(appKey))
.findFirst()
.orElse(null);
return p;
}
/**
* 删除授权信息
*
* @param appKey 令牌key
*/
public static void removeAuthenticationToken(String appKey) {
m.remove(appKey);
}
/**
* 验证令牌
*
* @param appKey 令牌key
*/
public static Boolean verify(String appKey, String appSecret) {
AuthenticationToken p = m.values()
.stream()
.filter(authenticationToken -> authenticationToken.getAppKey().equals(appKey)
&& authenticationToken.getAppSecret().equals(appSecret)
)
.findFirst()
.orElse(null);
return ObjectUtils.isNotEmpty(p);
}
}

View File

@@ -1,14 +1,10 @@
package org.framework.lazy.cloud.network.heartbeat.server.cluster.application.assembler;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node.*;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.dto.LazyNettyClusterNodeDTO;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.domain.model.cluster.node.LazyNettyClusterNode;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node.LazyNettyClusterNodeRemoveCommand;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node.LazyNettyClusterNodeStoryCommand;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node.LazyNettyClusterNodeUpdateCommand;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node.LazyNettyClusterNodeQueryListCommand;
import org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node.LazyNettyClusterNodeQueryOneCommand;
import org.wu.framework.core.mapper.LazyStructMappers;
import org.wu.framework.core.mapper.LazyStructMapper;
import org.wu.framework.core.mapper.LazyStructMappers;
/**
* describe 集群配置信息

View File

@@ -1,14 +1,11 @@
package org.framework.lazy.cloud.network.heartbeat.server.cluster.application.command.lazy.netty.cluster.node;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.v3.oas.annotations.media.Schema;
import org.framework.lazy.cloud.network.heartbeat.common.enums.NettyClientStatus;
import java.lang.String;
import java.lang.Integer;
import java.time.LocalDateTime;
import java.lang.Boolean;
/**
* describe 集群配置信息

View File

@@ -0,0 +1,43 @@
package org.framework.lazy.cloud.network.heartbeat.server.init;
import lombok.extern.slf4j.Slf4j;
import org.framework.lazy.cloud.network.heartbeat.protocol.token.AuthenticationTokenContext;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucket;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
public class InitAuthenticationToken implements CommandLineRunner {
private final LazyNettyClientTokenBucketRepository lazyNettyClientTokenBucketRepository;
public InitAuthenticationToken(LazyNettyClientTokenBucketRepository lazyNettyClientTokenBucketRepository) {
this.lazyNettyClientTokenBucketRepository = lazyNettyClientTokenBucketRepository;
}
@Override
public void run(String... args) throws Exception {
try {
LazyNettyClientTokenBucket lazyNettyClientTokenBucket = new LazyNettyClientTokenBucket();
lazyNettyClientTokenBucket.setIsDeleted(false);
for (LazyNettyClientTokenBucket nettyClientTokenBucket : lazyNettyClientTokenBucketRepository.findList(lazyNettyClientTokenBucket)
.getData()) {
String clientId = nettyClientTokenBucket.getUsedByClientId();
if (clientId != null) {
String appKey = nettyClientTokenBucket.getAppKey();
String appSecret = nettyClientTokenBucket.getAppSecret();
AuthenticationTokenContext.setAuthenticationToken(clientId, appKey, appSecret);
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("初始化令牌桶失败:{}", e.getMessage());
}
}
}

View File

@@ -1,19 +1,13 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
import org.wu.framework.web.response.Result;
import org.wu.framework.web.response.ResultFactory;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecord;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.record.LazyNettyClientStateRecordRemoveCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.record.LazyNettyClientStateRecordStoryCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.record.LazyNettyClientStateRecordUpdateCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.record.LazyNettyClientStateRecordQueryListCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.record.LazyNettyClientStateRecordQueryOneCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.state.record.*;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyNettyClientStateRecordDTO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.state.record.LazyNettyClientStateRecord;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.web.response.Result;
import java.util.List;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
/**
* describe 客户端状态变更记录
*

View File

@@ -1,20 +1,15 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.visitor.port.per.day.flow.*;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyClientFlowPerDayEchartsDTO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyClientPortFlowPerDayEchartsDTO;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.dto.LazyVisitorPortPerDayFlowDTO;
import org.wu.framework.web.response.Result;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.visitor.port.per.day.flow.LazyVisitorPortPerDayFlow;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.visitor.port.per.day.flow.LazyVisitorPortPerDayFlowRemoveCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.visitor.port.per.day.flow.LazyVisitorPortPerDayFlowStoryCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.visitor.port.per.day.flow.LazyVisitorPortPerDayFlowUpdateCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.visitor.port.per.day.flow.LazyVisitorPortPerDayFlowQueryListCommand;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.visitor.port.per.day.flow.LazyVisitorPortPerDayFlowQueryOneCommand;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.web.response.Result;
import java.util.List;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
/**
* describe 每日统计流量
*

View File

@@ -1,13 +1,10 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.route;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.v3.oas.annotations.media.Schema;
import java.lang.String;
import java.time.LocalDateTime;
import java.lang.Long;
import java.lang.Boolean;
/**
* describe 客户端代理路由规则

View File

@@ -1,13 +1,10 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.route;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.v3.oas.annotations.media.Schema;
import java.lang.String;
import java.time.LocalDateTime;
import java.lang.Long;
import java.lang.Boolean;
/**
* describe 客户端代理路由规则

View File

@@ -1,13 +1,10 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.application.command.lazy.netty.client.route;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.v3.oas.annotations.media.Schema;
import java.lang.String;
import java.time.LocalDateTime;
import java.lang.Long;
import java.lang.Boolean;
/**
* describe 客户端代理路由规则

View File

@@ -18,7 +18,7 @@ import org.springframework.stereotype.Repository;
import org.wu.framework.core.NormalUsedString;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazySetValueWrappers;
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;
@@ -183,7 +183,7 @@ public class LazyNettyClientRouteRepositoryImpl implements LazyNettyClientRouteR
@Override
public Result<LazyNettyClientRoute> remove(LazyNettyClientRoute lazyNettyClientRoute) {
lazyLambdaStream.update(LazyUpdateSetValueWrappers.<LazyNettyClientRouteDO>lambdaWrapper()
lazyLambdaStream.update(LazySetValueWrappers.<LazyNettyClientRouteDO>lambdaWrapper()
.set(LazyNettyClientRouteDO::getIsDeleted, true),
LazyWrappers
.<LazyNettyClientRouteDO>lambdaWrapper()

View File

@@ -10,7 +10,7 @@ import org.springframework.stereotype.Repository;
import org.wu.framework.lazy.orm.core.persistence.reverse.lazy.ddd.DefaultDDDLazyInfrastructurePersistence;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazySetValueWrappers;
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;
@@ -57,7 +57,7 @@ public class LazyNettyClientStateRepositoryImpl implements LazyNettyClientStateR
@Override
public Result<LazyNettyClientState> updateOne(LazyNettyClientState lazyNettyClientState) {
LazyNettyClientStateDO lazyNettyClientStateDO = LazyNettyClientStateConverter.INSTANCE.fromNettyClientState(lazyNettyClientState);
lazyLambdaStream.update(LazyUpdateSetValueWrappers.
lazyLambdaStream.update(LazySetValueWrappers.
lambdaWrapperBeanIgnoreEmpty(lazyNettyClientStateDO)
,

View File

@@ -1,6 +1,7 @@
package org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.persistence;
import jakarta.annotation.Resource;
import org.framework.lazy.cloud.network.heartbeat.protocol.token.AuthenticationTokenContext;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucket;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.domain.model.lazy.netty.client.token.bucket.LazyNettyClientTokenBucketRepository;
import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructure.converter.LazyNettyClientTokenBucketConverter;
@@ -8,7 +9,7 @@ import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructu
import org.springframework.stereotype.Repository;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazySetValueWrappers;
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;
@@ -177,7 +178,7 @@ public class LazyNettyClientTokenBucketRepositoryImpl implements LazyNettyClient
// 绑定客户端ID
lazyLambdaStream.update(
LazyUpdateSetValueWrappers.<LazyNettyClientTokenBucketDO>lambdaWrapper()
LazySetValueWrappers.<LazyNettyClientTokenBucketDO>lambdaWrapper()
.set(LazyNettyClientTokenBucketDO::getUsedByClientId, clientId)
.set(LazyNettyClientTokenBucketDO::getUpdateTime, LocalDateTime.now())
,
@@ -186,6 +187,9 @@ public class LazyNettyClientTokenBucketRepositoryImpl implements LazyNettyClient
.eq(LazyNettyClientTokenBucketDO::getAppKey, appKey)
.eq(LazyNettyClientTokenBucketDO::getAppSecret, appSecret)
);
AuthenticationTokenContext.setAuthenticationToken(clientId,appKey,appSecret);
return ResultFactory.successOf(true);
}

View File

@@ -16,7 +16,7 @@ import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructu
import org.springframework.stereotype.Repository;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazySetValueWrappers;
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;
@@ -171,7 +171,7 @@ public class LazyNettyClientVirtualRouteRepositoryImpl implements LazyNettyClien
@Override
public Result<LazyNettyClientVirtualRoute> remove(LazyNettyClientVirtualRoute lazyNettyClientVirtualRoute) {
LazyNettyClientVirtualRouteDO lazyNettyClientVirtualRouteDO = LazyNettyClientVirtualRouteConverter.INSTANCE.fromLazyNettyClientVirtualRoute(lazyNettyClientVirtualRoute);
lazyLambdaStream.update(LazyUpdateSetValueWrappers.<LazyNettyClientVirtualRouteDO>lambdaWrapper()
lazyLambdaStream.update(LazySetValueWrappers.<LazyNettyClientVirtualRouteDO>lambdaWrapper()
.set(LazyNettyClientVirtualRouteDO::getIsDeleted, true),
LazyWrappers
.<LazyNettyClientVirtualRouteDO>lambdaWrapper()

View File

@@ -18,7 +18,7 @@ import org.springframework.stereotype.Repository;
import org.wu.framework.core.NormalUsedString;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazySetValueWrappers;
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;
@@ -176,7 +176,7 @@ public class LazyNettyServerRouteRepositoryImpl implements LazyNettyServerRouteR
@Override
public Result<LazyNettyServerRoute> remove(LazyNettyServerRoute lazyNettyServerRoute) {
lazyLambdaStream.update(LazyUpdateSetValueWrappers.<LazyNettyServerRouteDO>lambdaWrapper()
lazyLambdaStream.update(LazySetValueWrappers.<LazyNettyServerRouteDO>lambdaWrapper()
.set(LazyNettyServerRouteDO::getIsDeleted, true),
LazyWrappers
.<LazyNettyServerRouteDO>lambdaWrapper()

View File

@@ -16,7 +16,7 @@ import org.framework.lazy.cloud.network.heartbeat.server.standalone.infrastructu
import org.springframework.stereotype.Repository;
import org.wu.framework.lazy.orm.database.lambda.domain.LazyPage;
import org.wu.framework.lazy.orm.database.lambda.stream.lambda.LazyLambdaStream;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazyUpdateSetValueWrappers;
import org.wu.framework.lazy.orm.database.lambda.stream.wrapper.LazySetValueWrappers;
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;
@@ -171,7 +171,7 @@ public class LazyNettyServerVirtualRouteRepositoryImpl implements LazyNettyServe
@Override
public Result<LazyNettyServerVirtualRoute> remove(LazyNettyServerVirtualRoute lazyNettyServerVirtualRoute) {
LazyNettyServerVirtualRouteDO lazyNettyServerVirtualRouteDO = LazyNettyServerVirtualRouteConverter.INSTANCE.fromLazyNettyServerVirtualRoute(lazyNettyServerVirtualRoute);
lazyLambdaStream.update(LazyUpdateSetValueWrappers.<LazyNettyServerVirtualRouteDO>lambdaWrapper()
lazyLambdaStream.update(LazySetValueWrappers.<LazyNettyServerVirtualRouteDO>lambdaWrapper()
.set(LazyNettyServerVirtualRouteDO::getIsDeleted, true),
LazyWrappers
.<LazyNettyServerVirtualRouteDO>lambdaWrapper()