# NettyServer **Repository Path**: F404NotFound/NettyServer ## Basic Information - **Project Name**: NettyServer - **Description**: authnexus 中间件 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: cloud-version-0.7.1 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-10-20 - **Last Updated**: 2023-12-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目概述 ## 背景 生产环境下,Iot设备(如摄像头)在实际部署过程中可能存在弱口令的现象,设备的认证登录缺乏统一的认证。同时,下设的各个Iot设备之间的管理模糊不清,协议与协议之间的转换多采用硬编码,且设备间缺乏有效的统一的管理。 再者,Iot设备计算性能较差,无法有效应对高并发的场景,当单个节点出现故障时,缺乏对应的容灾与补救措施。 在此基础上,本项目借助[宇视科技公司](https://cn.uniview.com/)提供的帮助实现了该中间件。 ## 项目思路 **经过讨论分析得出,中间件主要需要实现以下功能:** 1. **设备认证与安全性增强:** - 实施统一的身份验证机制,确保IoT设备使用强密码,并提供认证与授权服务。 - 支持Https的使用,以提高认证的安全性。 - 提供设备黑白名单功能,防范未授权设备的接入。 2. **设备管理与配置中心:** - 实现设备注册与注销功能,确保每个设备都有唯一标识。 - 提供设备状态监控,及时发现设备的在线与离线状态。 - 设计可视化的管理界面,方便用户对设备进行配置和管理。 3. **协议适配与转换:** - 实现灵活的协议适配器,支持动态配置不同IoT设备之间的通信协议。 - 提供可扩展的插件机制,以方便新增、修改、删除协议适配器。 4. **规则引擎与热更新:** - 集成规则引擎,支持用户定义业务规则,并能够实现规则的热更新。 - 允许用户通过界面或API管理规则,确保规则的灵活性和易用性。 5. **高性能通信服务器:** - 实现高性能的WebSocket、HTTP和UDP服务器,以满足实时通信的需求。 - 采用异步处理机制,提高系统的并发处理能力。 - 考虑负载均衡机制,确保在高并发场景下的稳定性。 6. **容灾与补救措施:** - 实现设备故障检测,及时发现并处理设备节点的故障。 - 部署冗余节点,确保在单个节点故障时系统仍能正常运行。 - 支持数据备份与恢复功能,以应对不可预测的数据丢失情况。 7. **拓展性与低耦合性:** - 设计模块化架构,使各个功能模块可以独立扩展和更新。 - 提供清晰的API文档,方便开发者根据需求进行二次开发和定制。 8. **符合设计原则:** - 遵循开闭原则,确保系统对扩展开放,对修改关闭。 - 考虑采用面向接口编程,降低模块之间的耦合度。 同时,设计的全程需要考虑到嵌入式的场景,因此需要提供一个适配弱性能服务器的版本,并在次基础上开发一个功能更强大,拓展性更强的适配高性能服务器的版本。 # 需求分析 这里只给出基本的概述,详细的解决方案可见源代码。 # 技术选型 ## 技术栈 ### 后端 - **Spring Boot:** 主流的Java后端框架 - **Netty:** 高性能的网络通信框架 - **MyBatis:** 持久层框架,用于操作数据库 - **PicoCLI:** 用于创建命令行应用程序的Java库 - **Redis:** 内存数据库,用于缓存和数据存储 - **MySQL:** 关系型数据库 ### 微服务 - **Spring Cloud Gateway:** 基于Spring Cloud的API网关,用于微服务路由 - **Spring Cloud Eureka:** 服务注册和发现 - **Spring Cloud Sleuth:** 分布式跟踪 - **Zipkin:** 分布式跟踪系统 ### 消息队列 - **Kafka:** 分布式流处理平台,用于消息队列 ### 数据处理和可视化 - **Logstash:** 数据收集引擎,用于将不同格式的数据集中到Elasticsearch - **Elasticsearch:** 分布式搜索引擎,用于数据存储和检索 - **Kibana:** Elasticsearch的可视化工具,用于数据分析和可视化 ### 容器化 - **Docker:** 容器化平台,用于轻松部署、运行和扩展应用程序 这些技术构成了项目的全栈技术架构,同时也为实现高性能、可伸缩和可维护的分布式系统提供支持。 ## 开发环境 - IDE:IDEA 2023.2(Ultimate Edition) - 运行时版本: 17.0.7+7-b1000.6 amd64 - VM: OpenJDK 64-Bit Server VM,JetBrains s.r.o. - JDK:OpenJDK version 1.8.0_351 - 数据库版本:mysql Ver 8.1.0 for Win64 on x86_64 (MySQL Community Server - GPL) - Redis版本:5.0.14.1([github上大佬实现的windows支持](https://github.com/tporadowski/redis/releases/tag/v5.0.14.1)) Docker version:20.10.21, build 20.10.21-0ubuntu1~18.04.3 # 项目架构 ## 模块间依赖架构 ![模块间依赖架构](/img/image1.png) ## 整体架构 ![整体架构](/img/image2.png) # 注意事项 本项目主要依靠 # 项目改进点 # 安装与运行 ## 启动中间件 ### 环境准备: 1. mysql: 运行/mysql/目录下的内容 2. redis:确保redis在6379端口下,考虑到测试环境的便利性,因此这里默认url是localhost:6379,首个redis数据库**默认无密码,如果要设置对应的参数可更改配置**(相关配置可见源码RedisConfig.java) 3. 部分可能要手动导入jar包,具体方式如下: ```xml git clone https://gitee.com/F404NotFound/NettyServer.git cd server-core # 进入core包目录 手动导入jar包 mvn install:install-file -Dfile="lib/bcprov-jdk18on-1.71.jar" -DgroupId="org.bouncycastle" -DartifactId="bcprov-jdk18on" -Dversion="1.71" -Dpackaging="jar" mvn install:install-file -Dfile="lib/jpbc-api-2.0.0.jar" -DgroupId="com.github.emilianobonassi.jpbc" -DartifactId="jpbc-api" -Dversion="2.0.0" -Dpackaging="jar" mvn install:install-file -Dfile="lib/jpbc-crypto-2.0.0.jar" -DgroupId="com.github.emilianobonassi.jpbc" -DartifactId="jpbc-crypto" -Dversion="2.0.0" -Dpackaging="jar" mvn install:install-file -Dfile="lib/jpbc-plaf-2.0.0.jar" -DgroupId="com.github.emilianobonassi.jpbc" -DartifactId="jpbc-plaf" -Dversion="2.0.0" -Dpackaging="jar" 并且确保server-core包目录下的pom.xml文件中有如下的四个依赖 com.github.emilianobonassi.jpbc jpbc-api 2.0.0 com.github.emilianobonassi.jpbc jpbc-plaf 2.0.0 com.github.emilianobonassi.jpbc jpbc-crypto 2.0.0 org.bouncycastle bcprov-jdk18on 1.71 ``` ```java @Slf4j public class NettyAppLauncher { //若只启动基本版本 需要取消注释状态 @NeedImprovement("这里主要是考虑到了加入spring项目的需要") public void startServer() { // log.info("启动Netty中"); // //异步启动两个服务器 // //这里需要掌握线程相关知识 // ThreadPoolExecutor orderThreadPool = OrderControlThreadPoolExecutor.getInstance(); // UdpNettyClient udpNettyClient = new UdpNettyClient(); // WebSocketNettyServer webSocketNettyServer = new WebSocketNettyServer(); // HttpNettyServer httpNettyServer = new HttpNettyServer(); // log.info("websocket服务器启动中"); // CompletableFuture WebsocketFutureTask = CompletableFuture.runAsync( // webSocketNettyServer::start // ,orderThreadPool); // log.info("udp服务器启动中"); // CompletableFuture UdpFutureTask = CompletableFuture.runAsync( // udpNettyClient::start // ,orderThreadPool); // log.info("http服务器启动中"); // CompletableFuture HttpFutureTask = CompletableFuture.runAsync( // httpNettyServer::start // ); // log.info("http服务器启动中"); // log.info("Netty启动项完毕"); } } 同时 若只启动基础版本需要修改logback.xml文件为: 第一个appender root标签取消注释 // // 60.204.158.84:4560 // // // { // "@timestamp":"%date{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}", // "@version":"1", // "message":"%msg", // "logger_name":"%logger", // "thread_name":"%thread", // "level":"%level", // "mdc": "%mdc", // "tags": ["your-custom-tag"] // } // // // // // // ``` 若需要完全启动本项目还需要启动对应的平台及前端,所以这里只能提供部分功能。 ### 启动中间件 **若只需要启动基本版本(core包) 只需要执行server-core 中的 Starter的main方法即可** **完全版本启动顺序(包含了其他组件)**见下: - 启动顺序:**最上面优先级最高** - 启动server-spring-eureka(**确保是最先启动**) - 启动server-spring-gateway - 启动server-spring-spring - 启动server-spring-http - 启动server-spring-udp - 启动server-spring-websocket ## 启动PicoCli ### 环境准备 执行包目录下的java -jar server-cli-starter-1.0-SNAPSHOT-jar-with-dependencies.jar ![运行界面](/img/image3.png) ### 运行Pico 现在可以执行一些基本的cli 命令比如: **pico -h** ![运行界面](/img/image4.png) **pico list** ![运行界面](/img/image5.png) ## 启动ELK 启动ELK需要配置一台部署了ELK的服务器,并且修改logback.xml的内容 # 其他 有需要问题及其他沟通的地方可联系本人 QQ:1065402636 mail:1065402636@qq.com