Files
JChargePointProtocol/docs/技术栈与依赖.md
2025-10-28 14:39:06 +08:00

237 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 技术栈与依赖
<cite>
**本文档引用的文件**
- [pom.xml](file://pom.xml)
- [jcpp-app/pom.xml](file://jcpp-app/pom.xml)
- [jcpp-infrastructure-cache/pom.xml](file://jcpp-infrastructure-cache/pom.xml)
- [jcpp-infrastructure-queue/pom.xml](file://jcpp-infrastructure-queue/pom.xml)
- [jcpp-app-bootstrap/src/main/resources/app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml)
- [jcpp-infrastructure-proto/src/main/proto/grpc.proto](file://jcpp-infrastructure-proto/src/main/proto/grpc.proto)
- [jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkController.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkController.java)
- [jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/listener/tcp/TcpListener.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/listener/tcp/TcpListener.java)
- [jcpp-web-ui/package.json](file://jcpp-web-ui/package.json)
- [jcpp-web-ui/tsconfig.json](file://jcpp-web-ui/tsconfig.json)
- [jcpp-web-ui/src/App.tsx](file://jcpp-web-ui/src/App.tsx)
- [docker/app.Dockerfile](file://docker/app.Dockerfile)
- [docker/docker-compose.monolith.yml](file://docker/docker-compose.monolith.yml)
</cite>
## 目录
1. [后端技术栈](#后端技术栈)
2. [前端技术栈](#前端技术栈)
3. [中间件与存储](#中间件与存储)
4. [构建与部署](#构建与部署)
## 后端技术栈
### Spring Boot 基础框架
Spring Boot 作为本项目的核心基础框架提供了自动配置、起步依赖和嵌入式服务器等特性极大地简化了Java应用的开发和部署。项目基于Spring
Boot 3.5.6版本构建,利用其强大的生态系统来管理依赖、配置和生命周期。通过`spring-boot-starter-parent`
作为父POM实现了版本统一管理和标准化构建流程。
**Section sources**
- [pom.xml](file://pom.xml#L10-L15)
### MyBatis 数据库访问机制
项目采用MyBatis-Plus作为持久层框架基于MyBatis进行了功能增强提供了CRUD操作的封装减少了模板代码的编写。通过
`mybatis-plus-spring-boot3-starter`依赖集成实现了与Spring Boot的无缝对接。项目中的实体类`Pile``Station``Gun`
通过Mapper接口与XML映射文件进行数据库操作支持动态SQL和分页查询。
**Section sources**
- [jcpp-app/pom.xml](file://jcpp-app/pom.xml#L25-L30)
- [jcpp-app/src/main/java/sanbing/jcpp/app/dal/mapper](file://jcpp-app/src/main/java/sanbing/jcpp/app/dal/mapper)
### Netty TCP网络通信原理
Netty被用于处理TCP网络通信特别是在充电桩协议解析模块中。`TcpListener`类使用Netty的`ServerBootstrap`创建TCP服务器通过
`NioEventLoopGroup`管理事件循环实现了高性能的异步非阻塞I/O通信。项目中为不同协议如云快充、绿能配置了独立的TCP监听端口38001-38011并使用自定义的
`JCPPLengthFieldBasedFrameDecoder`进行消息拆包解决了TCP粘包问题。
```mermaid
sequenceDiagram
participant 充电桩 as 充电桩设备
participant Netty as Netty TCP Server
participant 协议处理器 as ProtocolMessageProcessor
participant Kafka as Kafka Queue
充电桩->>Netty : 发送二进制协议数据
Netty->>Netty : JCPPLengthFieldBasedFrameDecoder拆包
Netty->>协议处理器 : 解析协议并处理上行消息
协议处理器->>Kafka : 将消息转发到protocol_uplink主题
Kafka-->>应用服务 : 消费消息并更新业务状态
```
**Diagram sources**
- [jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/listener/tcp/TcpListener.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/listener/tcp/TcpListener.java#L40-L80)
- [jcpp-app-bootstrap/src/main/resources/app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml#L300-L350)
### gRPC与Protobuf服务间通信
项目采用gRPC与Protobuf实现高性能的服务间通信。通过`.proto`文件定义服务接口和消息结构使用Protocol
Buffers进行序列化相比JSON具有更小的体积和更快的解析速度。`grpc.proto`文件定义了`ProtocolInterface`服务,包含`onDownlink`
双向流式RPC方法用于处理下行控制指令。这种设计支持实时、低延迟的通信特别适合充电桩控制系统中需要快速响应的场景。
```mermaid
classDiagram
class ProtocolInterface {
+onDownlink(stream RequestMsg) returns (stream ResponseMsg)
}
class RequestMsg {
+int64 ts
+TracerProto tracer
+ConnectRequestMsg connectRequestMsg
+DownlinkRequestMessage downlinkRequestMessage
}
class ResponseMsg {
+TracerProto tracer
+ConnectResponseMsg connectResponseMsg
+DownlinkResponseMessage downlinkResponseMsg
}
class ConnectRequestMsg {
+string nodeId
}
class ConnectResponseMsg {
+ConnectResponseCode responseCode
+string errorMsg
}
ProtocolInterface --> RequestMsg : "请求"
ProtocolInterface --> ResponseMsg : "响应"
RequestMsg --> ConnectRequestMsg : "包含"
ResponseMsg --> ConnectResponseMsg : "包含"
```
**Diagram sources**
- [jcpp-infrastructure-proto/src/main/proto/grpc.proto](file://jcpp-infrastructure-proto/src/main/proto/grpc.proto#L10-L30)
- [jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkController.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/adapter/DownlinkController.java#L40-L60)
## 前端技术栈
### React组件化架构
前端采用React框架构建用户界面实现了组件化开发模式。项目结构清晰地划分了`components``contexts``services`等目录,通过
`App.tsx`作为根组件组织路由和布局。使用`React.FC`函数组件和Hooks`useEffect`管理状态和副作用实现了声明式的UI开发。路由系统基于
`react-router-dom`,通过`ProtectedRoute`组件实现权限控制,确保只有认证用户才能访问特定页面。
**Section sources**
- [jcpp-web-ui/src/App.tsx](file://jcpp-web-ui/src/App.tsx#L1-L50)
- [jcpp-web-ui/src/components](file://jcpp-web-ui/src/components)
### TypeScript类型安全优势
TypeScript为前端开发提供了静态类型检查增强了代码的可维护性和可靠性。通过`tsconfig.json`配置,启用了严格模式(
`"strict": true`
确保类型安全。项目中定义了清晰的类型接口如API响应、表单数据等减少了运行时错误。与React结合使用提供了更好的开发体验和智能提示特别是在处理复杂状态和props传递时类型系统能有效防止常见错误。
**Section sources**
- [jcpp-web-ui/tsconfig.json](file://jcpp-web-ui/tsconfig.json#L1-L15)
- [jcpp-web-ui/package.json](file://jcpp-web-ui/package.json#L10-L15)
### Ant Design UI组件库
Ant Design作为UI组件库提供了丰富、美观且功能完整的React组件。项目中使用`antd`版本5.27.4,通过`ConfigProvider`设置中文语言包(
`zhCN`),实现了国际化支持。组件如`Layout``Dashboard``Form`等被广泛应用于管理后台,提供了统一的设计语言和用户体验。结合
`@ant-design/icons`,实现了现代化的图标展示,提升了界面的视觉效果和交互性。
**Section sources**
- [jcpp-web-ui/package.json](file://jcpp-web-ui/package.json#L5-L10)
- [jcpp-web-ui/src/App.tsx](file://jcpp-web-ui/src/App.tsx#L10-L20)
## 中间件与存储
### PostgreSQL持久化存储
PostgreSQL被选为关系型数据库用于持久化存储充电桩、站点、用户等核心业务数据。通过`spring-boot-starter-jdbc``postgresql`
驱动集成使用HikariCP连接池管理数据库连接。配置中设置了最大连接池大小为64优化了数据库访问性能。项目中的`schema-init.sql`
脚本定义了表结构,确保了数据的一致性和完整性。
**Section sources**
- [jcpp-app/pom.xml](file://jcpp-app/pom.xml#L20-L25)
- [jcpp-app/src/main/resources/sql/schema-init.sql](file://jcpp-app/src/main/resources/sql/schema-init.sql)
### Redis多级缓存架构
项目实现了Caffeine+Redis的多级缓存架构以提高系统性能和响应速度。`jcpp-infrastructure-cache`
模块封装了缓存逻辑支持Caffeine本地缓存和Redis分布式缓存两种模式。通过`CacheSpecs`配置不同实体如piles、guns的缓存策略包括TTL和最大大小。
`AttributeRedisCache``PileRedisCache`等类实现了具体的缓存操作利用Redis的高性能读写能力减轻了数据库压力。
```mermaid
flowchart TD
A[客户端请求] --> B{本地缓存存在?}
B --> |是| C[返回Caffeine缓存数据]
B --> |否| D[查询Redis缓存]
D --> E{Redis缓存存在?}
E --> |是| F[更新Caffeine缓存]
E --> |否| G[查询数据库]
G --> H[更新Redis缓存]
H --> I[更新Caffeine缓存]
I --> J[返回数据]
```
**Diagram sources**
- [jcpp-infrastructure-cache/pom.xml](file://jcpp-infrastructure-cache/pom.xml#L20-L30)
- [jcpp-app-bootstrap/src/main/resources/app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml#L200-L250)
### Kafka消息解耦与高并发
Kafka在系统中扮演着消息中间件的角色用于解耦服务和处理高并发消息流。`jcpp-infrastructure-queue`
模块封装了Kafka客户端支持生产者和消费者模式。配置中设置了`protocol_uplink`
主题用于接收来自充电桩的上行消息。通过分区partitions和消费者组consumer
groups实现消息的并行处理提高了系统的吞吐量。Kafka的持久化特性确保了消息不丢失即使在服务重启后也能继续处理。
**Section sources**
- [jcpp-infrastructure-queue/pom.xml](file://jcpp-infrastructure-queue/pom.xml#L20-L30)
- [jcpp-app-bootstrap/src/main/resources/app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml#L100-L150)
## 构建与部署
### Maven多模块项目管理
项目采用Maven进行多模块管理通过父POM`jcpp-parent`)统一管理所有子模块的依赖和插件版本。项目包含多个模块,如`jcpp-app`
`jcpp-protocol-api``jcpp-infrastructure-cache`等,每个模块都有明确的职责。`pom.xml`中配置了`protobuf-maven-plugin`用于编译
`.proto`文件,`frontend-maven-plugin`用于构建前端资源。这种模块化设计提高了代码的可维护性和复用性。
**Section sources**
- [pom.xml](file://pom.xml#L100-L200)
- [jcpp-app/pom.xml](file://jcpp-app/pom.xml)
### Docker容器化部署
系统通过Docker实现容器化部署使用`app.Dockerfile`
定义应用镜像。采用多阶段构建策略首先使用基础镜像编译Maven项目然后提取JAR包的各个层dependencies、spring-boot-loader等最后构建运行时镜像。
`docker-compose.monolith.yml`定义了服务网络和端口映射将应用服务暴露在8080端口同时开放了多个TCP协议端口38001-38011。这种部署方式确保了环境一致性简化了部署流程。
```mermaid
graph TB
subgraph "Docker构建流程"
A[Maven构建] --> B[提取JAR层]
B --> C[构建运行时镜像]
C --> D[运行容器]
end
subgraph "容器网络"
D --> E[暴露HTTP端口 8080]
D --> F[暴露TCP协议端口 38001-38011]
end
subgraph "外部连接"
E --> G[前端应用]
F --> H[充电桩设备]
end
```
**Diagram sources**
- [docker/app.Dockerfile](file://docker/app.Dockerfile)
- [docker/docker-compose.monolith.yml](file://docker/docker-compose.monolith.yml)