# Volta
**Repository Path**: multiworker/Volta
## Basic Information
- **Project Name**: Volta
- **Description**: Volta框架是一款开源GO Socket框架,提供web项目的高并发通信,Volta支持高并发,超高稳定性,支持自定义协议。拥有异步MYSQL、异步Redis、异步消息队列等组件
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 1
- **Created**: 2020-08-20
- **Last Updated**: 2023-05-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Volta 1.15
#### 介绍
Volta框架是一款GO语言编写的开源分布式网络综合应用框架,提供web项目的高并发通信,包括tcp/http/rpc等服务,
Volta支持高并发,超高稳定性,支持自定义协议。拥有异步MYSQL、异步Redis、异步消息队列等组件
#### 软件架构
App -- 业务层代码
> Common -- 公共类、常量
> Http -- http应用层
> Libs -- 第三方扩展包
> Model -- 应用模型层
> Rpc -- rpc模块应用层
> Service -- 应用服务层
> Tcp -- Tcp通信模块应用层
> Utils -- 应用工具类
>
Bootstrap -- 业务服务注册 包含定时任务、socket请求处理方法注册
Build -- 打包
Cmd -- Cobra命令行组件
Config -- 框架配置信息
Core -- 框架核心包
> Common -- 公共类、常量
> Container -- 容器
> Coral -- 核心组件
> Facade -- 服务员,框架内所有的方法都通过facade调用,就问题就问服务员
>> ServiceContainer -- Facade容器,保存了框架内所有的实例在这里
>> ServiceInterface -- Facade接口,保存了框架内所有方法的接口在这里
>
> Http -- Gin模块
> License -- 启动钥匙
> Utils -- 核心工具包
> Workers -- Tcp通信模块
>> Events -- 通信事件处理类
>> Monitor -- 心跳
>> GatewayWorker.go -- websocket服务,负责维护客户端的连接
>> SwitchWorker.go -- socket服务 负责服务器内同信,与api框架交互,使用tcp短连接
>
> Kernel.go -- 服务注册类
>
CronJob -- 定时任务
> Test -- 默认定时任务,很简单,仿照这里的方法即可
>
#### 安装教程
1.Volta简洁快速,部署GO环境,执行go run main.go 即可
#### 使用说明
1. 框架使用Cobra命令启动,go run main.go
-c 选择配置文件(默认.env.yaml)
-s 选择需要开启的服务(all/tcp/http/cronjob)
2. 框架内提供的方法已经足以应付绝大部分项目,无序去另外编写自定义方法和协议
3. 如需使用TCP通信服务自定义协议和方法见以下方法:
> 一、首先在App/Tcp/Relays目录新建一个控制器类,框架已经为你建立了两个默认类,
> 分别是GatewayRelay.go/SwitchRelay.go 他们分别可以处理客户端、内网其他服务的请求。
>
> 二、然后在Bootstrap/App中注册对应方法即可
> `Container.App.Bind(95000,&Relays.SwitchRelay{},"handle")` 参数1:内网api服务请求协议号 参数2:控制器类 参数3:方法名
> `Container.App.Bind(95001,&Relays.GatewayRelay{},"handle")` 参数1:客户端请求协议号 参数2:控制器类 参数3:方法名
>
> 三、上面两步完成后剩下的就是业务部分了框架会将发送者的请求信息传递给注册方法,
> 客户端请求信息为WorkerInstance.WsBody结构体,内网api服务请求信息为WorkerInstance.Protocol结构体,里面包含了session header body等等信息 足够使用了。
>
4. 推送消息、使用mysql/redis等,调用Facade即可,例子:
`Facade.Accessor.WsEvents.SendToUid()` 给uid推送消息
`Facade.Accessor.WsEvents.IsOnline()` 查看uid是否在线
`Facade.Accessor.DB().Query()` 执行mysql查询语句
`Facade.Accessor.Redis().Do()` 执行redis命令
5. 最后客户端连接到服务的过程是 客户端发起websocket连接,Volta接收到请求后会返回一个clientId回去,
客户端将clientId通过api接口给api服务,api服务使用`socket::bind(clientId,uid)`方法,传入clientId和当前用户uid,
这样绑定操作就完成了,Volta就可以给uid推送消息了
#### 参与贡献
1. leon 创作者