【wu-lazy-cloud-network】Java自动化内网穿透架构整理

这篇具有很好参考价值的文章主要介绍了【wu-lazy-cloud-network】Java自动化内网穿透架构整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目介绍

wu-lazy-cloud-network 是一款基于(wu-framework-parent)孵化出的项目,内部使用Lazy ORM操作数据库,主要功能是网络穿透,对于没有公网IP的服务进行公网IP映射
使用环境JDK17 Spring Boot 3.0.2

版本更新

1.2.2-JDK17-SNAPSHOT
【fix】修正流量计算保存两位小数
架构图

【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

实现原理
服务端创建socket服务端绑定本地端口(用于客户端连接)
package wu.framework.lazy.cloud.heartbeat.server.netty.socket;


import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import wu.framework.lazy.cloud.heartbeat.server.netty.filter.NettyServerFilter;

public class NettyOnCloudNettyServerSocket {
    private final EventLoopGroup bossGroup = new NioEventLoopGroup();
    private final EventLoopGroup workerGroup = new NioEventLoopGroup();
    private final NettyServerFilter nettyServerFilter;// 通道业务处理
    private ChannelFuture channelFuture;

    public NettyOnCloudNettyServerSocket(NettyServerFilter nettyServerFilter) {
        this.nettyServerFilter = nettyServerFilter;
    }

    /**
     * 启动服务端
     *
     * @throws Exception
     */
    public void startServer(int serverPort) throws Exception {
        try {

            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
                    // 给服务端channel设置属性
                    .option(ChannelOption.SO_BACKLOG, 128)

                    .childOption(ChannelOption.SO_KEEPALIVE, true)
                    .childHandler(nettyServerFilter)
            ;
            channelFuture = b.bind(serverPort).sync();

            channelFuture.addListener((ChannelFutureListener) channelFuture -> {
                // 服务器已启动
            });
            channelFuture.channel().closeFuture().sync();
        } finally {
            shutdown();
            // 服务器已关闭
        }
    }

    public void shutdown() {
        if (channelFuture != null) {
            channelFuture.channel().close().syncUninterruptibly();
        }
        if ((bossGroup != null) && (!bossGroup.isShutdown())) {
            bossGroup.shutdownGracefully();
        }
        if ((workerGroup != null) && (!workerGroup.isShutdown())) {
            workerGroup.shutdownGracefully();
        }
    }
}
客户端通过class NettyClientSocket 连接服务端
package wu.framework.lazy.cloud.heartbeat.client.netty.socket;


import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import wu.framework.lazy.cloud.heartbeat.client.application.ClientNettyConfigApplication;
import wu.framework.lazy.cloud.heartbeat.client.netty.filter.NettyClientFilter;
import wu.framework.lazy.cloud.heartbeat.common.MessageType;
import wu.framework.lazy.cloud.heartbeat.common.NettyProxyMsg;
import wu.framework.lazy.cloud.heartbeat.common.adapter.ChannelTypeAdapter;
import wu.framework.lazy.cloud.heartbeat.common.advanced.HandleChannelTypeAdvanced;
import wu.framework.lazy.cloud.heartbeat.common.utils.ChannelAttributeKeyUtils;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 客户端连接服务端
 */
@Slf4j
public class NettyClientSocket {
    private static final EventLoopGroup eventLoopGroup = new NioEventLoopGroup();
    /**
     * 服务端host
     */
    private final String inetHost;
    /**
     * 服务端端口
     */
    private final int inetPort;
    /**
     * 当前客户端id
     */
    @Getter
    private final String clientId;
    /**
     * nacos配置信息处理应用
     */
    @Getter
    private final ClientNettyConfigApplication clientNettyConfigApplication;
    private final List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList; // 处理服务端发送过来的数据类型

    public NettyClientSocket(String inetHost, int inetPort, String clientId, ClientNettyConfigApplication clientNettyConfigApplication, List<HandleChannelTypeAdvanced> handleChannelTypeAdvancedList) {
        this.inetHost = inetHost;
        this.inetPort = inetPort;
        this.clientId = clientId;
        this.clientNettyConfigApplication = clientNettyConfigApplication;
        this.handleChannelTypeAdvancedList = handleChannelTypeAdvancedList;
    }

    public void newConnect2Server() throws InterruptedException {
        newConnect2Server(inetHost, inetPort, clientId, clientNettyConfigApplication);
    }

    protected void newConnect2Server(String inetHost, int inetPort, String clientId, ClientNettyConfigApplication clientNettyConfigApplication) throws InterruptedException {
        Bootstrap bootstrap = new Bootstrap();
        bootstrap.group(eventLoopGroup)
                .channel(NioSocketChannel.class)
                .handler(new NettyClientFilter(new ChannelTypeAdapter(handleChannelTypeAdvancedList), this))
        ;

        log.info("连接服务端IP:{},连接服务端端口:{}", inetHost, inetPort);
        ChannelFuture future = bootstrap.connect(inetHost, inetPort);
        Channel channel = future.channel();

        log.info("使用的客户端ID:" + clientId);
        future.addListener((ChannelFutureListener) futureListener -> {
            if (futureListener.isSuccess()) {

                log.info("连接服务端成功");
                // 告诉服务端这条连接是client的连接
                NettyProxyMsg nettyMsg = new NettyProxyMsg();
                nettyMsg.setType(MessageType.REPORT_CLIENT_CONNECT_SUCCESS);
                nettyMsg.setClientId(clientId);
                nettyMsg.setData((clientId).getBytes());
                ChannelAttributeKeyUtils.buildClientId(channel, clientId);
                channel.writeAndFlush(nettyMsg);
                // 在线
                clientNettyConfigApplication.clientOnLine(clientId);
            } else {
                log.info("每隔2s重连....");
                // 离线
                clientNettyConfigApplication.clientOffLine(clientId);
                futureListener.channel().eventLoop().schedule(() -> {
                    try {
                        newConnect2Server(inetHost, inetPort, clientId, clientNettyConfigApplication);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }, 2, TimeUnit.SECONDS);
            }
        });
    }

    /**
     * 关闭连接
     */

    public void shutdown() {
        if ((eventLoopGroup != null) && (!eventLoopGroup.isShutdown())) {
            eventLoopGroup.shutdownGracefully();
        }
    }

}
通过客户端与服务端建立的连接进行访客端口绑定
上述连接会形成一个channel,我们称之为通道(本文中简单叫**心跳通道**)
第一步 页面GUI进行新增访客端口而后将访客端口与客户端绑定(如果客户端已经启动,使用页面客户端下线触发第二步)
第二步 客户端与访客端口绑定后使用**心跳通道** 发送客户端告诉客户端,你帮我绑定你本地真实端口
第三步 访客访问,访客通过访客端口访问数据,此时访客通道打开截取访客发送的数据,然后将数据发送给客户真实通道,数据返回后再返回给访客通道

功能

1.内网穿透
2.服务端自主下发数据到客户端
3.流量监控

项目结构

模块 版本 描述
wu-lazy-cloud-heartbeat-common 1.2.2-JDK17-SNAPSHOT 内网穿透公共模块(声明接口、枚举、常量、适配器、解析器)
wu-lazy-cloud-heartbeat-client 1.2.2-JDK17-SNAPSHOT 客户端(支持二次开发)
wu-lazy-cloud-heartbeat-server 1.2.2-JDK17-SNAPSHOT 服务端(支持二次开发)
wu-lazy-cloud-network-ui 1.2.2-JDK17-SNAPSHOT 服务端页面
wu-lazy-cloud-heartbeat-client-sample 1.2.2-JDK17-SNAPSHOT 客户端样例
wu-lazy-cloud-heartbeat-server-sample 1.2.2-JDK17-SNAPSHOT 服务端样例

使用技术

框架 版本 描述
spring-boot 3.0.7 springboot框架
wu-framework-web 1.2.2-JDK17-SNAPSHOT web容器
Lazy -ORM 1.2.2-JDK17-SNAPSHOT ORM
mysql-connector-j 8.0.33 mysql驱动
wu-authorization-server-platform-starter 1.2.2-JDK17-SNAPSHOT 用户授权体系

使用环境

IDEA
Mac、Windows
JAVA >=13
MAVEN

启动

docker启动
    
    docker run  -d -it -p 18080:18080 --name wu-lazy-cloud-heartbeat-server registry.cn-hangzhou.aliyuncs.com/wu-lazy/wu-lazy-cloud-heartbeat-server:1.2.2-JDK17-SNAPSHOT
    
    http://127.0.0.1:18080/swagger-ui/index.html

源码启动
页面操作

启动项目后打开服务端界面
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

默认账号密码:admin/admin
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

初始化项目
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

添加角色
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

为用户授权
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

刷新页面
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

客户端管理(客户端会自动注册)
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

网络映射管理(修改后者新增需要映射的客户端)
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

访客端口池管理(服务器端需要开放的端口)
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言

流量管理(每个客户端使用的流量)
【wu-lazy-cloud-network】Java自动化内网穿透架构整理,JAVA内网穿透,java,自动化,开发语言文章来源地址https://www.toymoban.com/news/detail-832611.html

到了这里,关于【wu-lazy-cloud-network】Java自动化内网穿透架构整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium java自动化

    2.1 什么是自动化以及为什么要做 自动化测试能够代替一部分的手工测试。自动化测试能够提高测试效率。 随着功能的增加,版本越来越多,版本回归的压力也越来越大,所以仅仅通过人工测试来回归所有的版本肯定是不现实的,所以我们需要借助自动化来进行回归 2.2为什么

    2024年02月11日
    浏览(90)
  • Java定时任务、自动化任务调度

    Java提供了多种方式来实现定时任务,使得开发人员能够在指定的时间间隔或固定时间点执行特定的任务。本文将介绍Java中实现定时任务的几种常用方法,并探讨它们的优势和适用场景。 Java中的Timer类是最早引入的定时任务工具,它可以用于执行一次性或重复性的定时任务。

    2024年02月16日
    浏览(50)
  • 接口自动化测试框架(Java 实现)

    需求点 需求分析 通过 yaml 配置接口操作和用例 后续新增接口和测试用例只需要编写 yaml 文件即可实现。 可以支持接口间的参数传递 具有参数依赖的接口可以进行变量的抽取和参数赋值。 支持全局、用例维度的变量存储 比如时间截命名法中要用到的时间截后缀。 支持用例

    2024年01月18日
    浏览(52)
  • Selenium自动化测试(基于Java)

    目录 一. 了解Selenium ✅1.1 概念 ✅1.2 作用 ✅1.3 特点 ✅1.4 工作原理  二. Selenium + Java 环境搭建 ✅2.1 下载 Chrome 浏览器 ✅2.2 查看浏览器的版本 ✅2.3 下载浏览器驱动 ✅2.4 验证环境是否搭建成功 三. Selenium 常用 API ✅3.1 定位元素 ✅3.2 操作对象 ✅3.3 添加等待 ✅3.4 打印信息

    2024年02月06日
    浏览(88)
  • 【自动化测试】——Selenium (基于java)

    小亭子正在努力的学习编程,接下来将开启软件测试的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 目录 一、认识Selenium 1.什么是自动化测试  2.Selenium  3.webdriver的工作原理

    2024年02月15日
    浏览(44)
  • java自动化-03-04java基础之数据类型举例

    1、需要特殊注意的数据类型举例 1)定义float类型,赋值时需要再小数后面带f 2)定义double类型,赋值时直接输入小数就可以 3)另外需要注意,float类型的精度问题,会有自动保存小数点后几位的问题,如下图 4)boolean类型的值只有true和false 5)char类型的变量进行赋值时需要

    2024年04月11日
    浏览(40)
  • 【java学习】jemeter与自动化测试

    可重复执行 每个用例的数据应该是独立的,测试前新增,测试后删除; 可并行执行 每个用例数据的建立应该是独立的,即使其它数据在并发执行应该互不干扰。==》通过uuid或者用例号对数据进行区分。 如果用例执行错误,不会造成脏数据。 不同环境都可以执行; 主要区别

    2023年04月27日
    浏览(28)
  • 【教程】JAVA + selenium 进行自动化测试

    自动登录淘宝 获取请求响应数据等 使用到的工具类

    2024年02月11日
    浏览(41)
  • Java + Selenium + Appium自动化测试

    一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装) 二、启动Appium(Appium环境安装可自行百度) 三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk 安装步骤:(基于Android SDK已经配置好了环境变量,可自行百

    2024年02月07日
    浏览(41)
  • java APP自动化测试AppIum

    一、前言 二、Appium环境搭建 2.1 JDK安装 2.2 Android SDK安装配置 2.3 模拟器安装及配置 2.4 Appium Desktop安装及使用 2.5 Appium配置连接模拟器 三、实战基本脚本编写 3.1 创建Maven项目并配置 3.2 简单Demo 四、写在最后   一、 前言 随着移动互联网的发展,APP上面的测试逐渐的流行起来。

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包