# 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
# 项目架构
## 模块间依赖架构

## 整体架构

# 注意事项
本项目主要依靠
# 项目改进点
# 安装与运行
## 启动中间件
### 环境准备:
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

### 运行Pico
现在可以执行一些基本的cli 命令比如:
**pico -h**

**pico list**

## 启动ELK
启动ELK需要配置一台部署了ELK的服务器,并且修改logback.xml的内容
# 其他
有需要问题及其他沟通的地方可联系本人
QQ:1065402636 mail:1065402636@qq.com