【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】修正流量计算保存两位小数
架构图

在这里插入图片描述

实现原理
服务端创建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*/@Getterprivate final String clientId;/*** nacos配置信息处理应用*/@Getterprivate 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-common1.2.2-JDK17-SNAPSHOT内网穿透公共模块(声明接口、枚举、常量、适配器、解析器)
wu-lazy-cloud-heartbeat-client1.2.2-JDK17-SNAPSHOT客户端(支持二次开发)
wu-lazy-cloud-heartbeat-server1.2.2-JDK17-SNAPSHOT服务端(支持二次开发)
wu-lazy-cloud-network-ui1.2.2-JDK17-SNAPSHOT服务端页面
wu-lazy-cloud-heartbeat-client-sample1.2.2-JDK17-SNAPSHOT客户端样例
wu-lazy-cloud-heartbeat-server-sample1.2.2-JDK17-SNAPSHOT服务端样例

使用技术

框架版本描述
spring-boot3.0.7springboot框架
wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器
Lazy -ORM1.2.2-JDK17-SNAPSHOTORM
mysql-connector-j8.0.33mysql驱动
wu-authorization-server-platform-starter1.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-SNAPSHOThttp://127.0.0.1:18080/swagger-ui/index.html源码启动
页面操作

启动项目后打开服务端界面
在这里插入图片描述

默认账号密码:admin/admin
在这里插入图片描述

初始化项目
在这里插入图片描述

添加角色
在这里插入图片描述

为用户授权
在这里插入图片描述

刷新页面
在这里插入图片描述

客户端管理(客户端会自动注册)
在这里插入图片描述

网络映射管理(修改后者新增需要映射的客户端)
在这里插入图片描述

访客端口池管理(服务器端需要开放的端口)
在这里插入图片描述

流量管理(每个客户端使用的流量)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin基本语法 4 类

1.定义类 package classStudyclass Player {var name:String "jack"get() field.capitalize()set(value) {field value.trim()} }fun main() {val player Player()println(player.name)player.name " asdas "println(player.name)} 2.计算属性与防范…

2.20 day2 QT

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//窗口相关设置this->setWindowTitle("登入页面"); //设置 窗口 标题this->setWindowIcon(QIcon("D:…

深度学习图像处理基础

这里写目录标题 分辨率是什么 视网膜屏视网膜屏人眼的视觉视力 像素密度设置合适的PPI&#xff0c;制造视网膜屏 色彩是什么色匹配实验色彩匹配的意义量化色彩匹配白色合为1色度图 总结 HDR光亮度&#xff08;尼特&#xff09;灰阶亮度范围HDR显示技术总结 一级目录二级目录二级…

Job 和 DaemonSet

一、Job 1、Job 背景问题 K8s 里&#xff0c;最小的调度单元是 Pod&#xff0c;如果直接通过 Pod 来运行任务进程&#xff0c;会产生以下几种问题&#xff1a; ① 如何保证 Pod 内进程正确的结束&#xff1f; ② 如何保证进程运行失败后重试&#xff1f; ③ 如何管理多个任…

曾经爆火的「流批一体」现在怎么样了?

2021年和2022年&#xff0c;曾经有一个概念在整个数据开发方向传播&#xff0c;不管是懂和不懂的人&#xff0c;都能扯上一两句。那就是大家耳熟能详的「流批一体」。 时至今日&#xff0c;已经很少有人再提起这个话题&#xff0c;这个概念在21、22年很多面试中也会被面试官问到…

[嵌入式AI从0开始到入土]15_orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

单片机学习笔记---红外遥控(外部中断)

目录 红外遥控简介 硬件电路 基本发送与接收 NEC编码​​​​​​​ 遥控器键码 复习外部中断和定时器 红外遥控简介 红外遥控是利用红外光进行通信的设备&#xff0c;由红外LED将调制后的信号发出&#xff0c;由专用的红外接收头进行解调输出 通信方式&#xff1a;单工…

WebGL中开发科学数据可视化应用

WebGL在科学数据可视化领域有广泛的应用&#xff0c;可以用于呈现和解释复杂的科学数据。以下是在WebGL中开发科学数据可视化应用时的一些建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.选择合…

2、电源管理入门之开机详解

目录 1. 硬件上电 2. ATF运行 3. Linux启动 3.1 内核启动start_kernel 3.2 平台启动setup_arch 3.4 DTS初始化psci_dt_init 3.5 系统rest创建kernel_init线程 3.6 SMP初始化smp_init 3.7 PSCI接口psci_cpu_on 3.8 SMC返回secondary_entry 系统开机牵扯到:“我是…

记录人工智能领域的人、事、社区

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要关注人物OpenAI团队成员 关注事件2015年2016年2017年2018年2019年2020年2021年2022年2023年2024年 关注社区OpenAITensorFlowPyTorchMIT Technology ReviewReddit Machine LearningIEEE Transactions on Neural Net…

java 使用documents4j将XML转为pdf文件的方式

1.背景&#xff1a; 通过spire.doc.free将word转换成PDF时存在缺陷&#xff1a;只能获取前3页。获取全文另外需支付费用。 2.解决办法 使用documents4j&#xff0c;documents4j会保留原word文件中更多的样式&#xff0c;如修订模式下的差异化字体颜色、文档右侧修订记录等。 …

Android Studio基础(下载安装与简单使用)

1、搭建Android开发平台 1.1 Android Studio 下载地址及版本说明 Android 开发者官网&#xff1a; https://developer.android.com/index.html&#xff08;全球&#xff0c;需科学上网&#xff09; https://developer.android.google.cn/index.html&#xff08;国内&#xff…

十三、集合进阶——单列集合 及 数据结构

单列集合 及 数据结构 13.1 集合体系结构13.1.2 单列集合1. Collection2.Collection 的遍历方式迭代器遍历增强for遍历Lambda表达式遍历 3.List集合List集合的特有方法List集合的遍历方式五种遍历方式对比 4.数据结构1).栈2).队列3&#xff09;数组4&#xff09;链表小结5&…

PyTorch – 逻辑回归

data 首先导入torch里面专门做图形处理的一个库&#xff0c;torchvision&#xff0c;根据官方安装指南&#xff0c;你在安装pytorch的时候torchvision也会安装。 我们需要使用的是torchvision.transforms和torchvision.datasets以及torch.utils.data.DataLoader 首先DataLoa…

营销系统黑名单优化:位图的应用解析 | 京东云技术团队

背景 营销系统中&#xff0c;客户投诉是业务发展的一大阻碍&#xff0c;一般会过滤掉黑名单高风险账号&#xff0c;并配合频控策略&#xff0c;来减少客诉&#xff0c;进而增加营销效率&#xff0c;减少营销成本&#xff0c;提升营销质量。 营销系统一般是通过大数据分析建模…

2024年了,如何从 0 搭建一个 Electron 应用

简介 Electron 是一个开源的跨平台桌面应用程序开发框架&#xff0c;它允许开发者使用 Web 技术&#xff08;如 JavaScript、HTML 和 CSS&#xff09;来构建桌面应用程序。Electron 嵌入了 Chromium&#xff08;一个开源的 Web 浏览器引擎&#xff09;和 Node.js&#xff08;一…

游戏行业洞察:分布式开源爬虫项目在数据采集与分析中的应用案例介绍

前言 我在领导一个为游戏行业巨头提供数据采集服务的项目中&#xff0c;我们面临着实时数据需求和大规模数据处理的挑战。我们构建了一个基于开源分布式爬虫技术的自动化平台&#xff0c;实现了高效、准确的数据采集。通过自然语言处理技术&#xff0c;我们确保了数据的质量和…

【PostgreSQL实现psql连接时候提示用户的密码有效时间】

如下内容使用session_exec插件结合自定函数实现。类似于触发器的原理。 功能需要严格在测试环境测试后&#xff0c;才可在正式环境使用。没有相关要求&#xff0c;还是建议直接查询pg_roles/pg_authid/pg_user&#xff1b; 一、判断是否需要修改用户密码和有效期的检查SQL 首…

【Emgu CV教程】7.1、图像锐化之Laplacian(拉普拉斯)算子锐化

文章目录 一、介绍二、举例1.原始素材2.代码3.运行结果 一、介绍 前面几篇讲的是图像平滑&#xff0c;就是抑制或消除噪声&#xff0c;并使得图像亮度及颜色变化更平缓的操作。在图像处理领域&#xff0c;与平滑操作相对应的&#xff0c;叫图像锐化。 图像锐化就是增强图像的边…

python OpenCV:seamlessClone泊松融合

一、seamlessClone函数的用法 翻译 https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/ def seamlessClone(src, dst, mask, p, flags, blendNone): # real signature unknown; restored from __doc__"""seamlessClone(src, dst, mask, …