为开源项目 go-gin-api 增加 WebSocket 模块

简介: 为开源项目 go-gin-api 增加 WebSocket 模块

文章目录:

  • WebSocket 示例界面
  • 第三方包
  • 代码封装
  • 小结
  • 推荐阅读

WebSocket 示例界面

第三方包

  • gorilla/websocket[1]

websocket 链接时支持配置项:

type Upgrader struct {
    // 指定升级 websocket 握手完成的超时时间
    HandshakeTimeout time.Duration
    // 指定 io 操作的缓存大小,如果不指定就会自动分配。
    ReadBufferSize, WriteBufferSize int
    // 写数据操作的缓存池,如果没有设置值,write buffers 将会分配到链接生命周期里。
    WriteBufferPool BufferPool
    //按顺序指定服务支持的协议,如值存在,则服务会从第一个开始匹配客户端的协议。
    Subprotocols []string
    // 指定 http 的错误响应函数,如果没有设置 Error 则,会生成 http.Error 的错误响应。
    Error func(w http.ResponseWriter, r *http.Request, status int, reason error)
    // 请求检查函数,用于统一的链接检查,以防止跨站点请求伪造。如果不检查,就设置一个返回值为 true 的函数。
    // 如果请求 Origin 标头可以接受,CheckOrigin 将返回 true。 如果 CheckOrigin 为nil,则使用安全默认值:如果 Origin 请求头存在且原始主机不等于请求主机头,则返回 false
    CheckOrigin func(r *http.Request) bool
    // EnableCompression 指定服务器是否应尝试协商每个邮件压缩(RFC 7692)。 
    // 将此值设置为true并不能保证将支持压缩。 
    // 目前仅支持“无上下文接管”模式
    EnableCompression bool
}

Upgrade 函数可将 http 升级到 WebSocket 协议:

// responseHeader 包含在对客户端升级请求的响应中。 
// 使用 responseHeader 指定 cookie(Set-Cookie)和应用程序协商的子协议(Sec-WebSocket-Protocol)。
// 如果升级失败,则升级将使用 HTTP 错误响应回复客户端
// 返回一个 Conn 指针,拿到他后,可使用 Conn 读写数据与客户端通信。
func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error)

代码封装

封装一个 socket_server,同时支持使用日志、数据库、缓存等操作:

type Server interface {
 // OnMessage 接收消息
 OnMessage()
 // OnSend 发送消息
 OnSend(message []byte) error
 // OnClose 关闭
 OnClose()
}
func New(logger *zap.Logger, db db.Repo, cache cache.Repo, conn *websocket.Conn) (Server, error) {
    
    ...
    
}

封装一个 socket_conn

func (h *handler) Connect() core.HandlerFunc {
 var upGrader = websocket.Upgrader{
  HandshakeTimeout: 5 * time.Second,
  CheckOrigin: func(r *http.Request) bool {
   return true
  },
 }
 return func(ctx core.Context) {
  ws, err := upGrader.Upgrade(ctx.ResponseWriter(), ctx.Request(), nil)
  if err != nil {
   return
  }
  server, err = socket_server.New(h.logger, h.db, h.cache, ws)
  if err != nil {
   return
  }
  go server.OnMessage()
 }
}

socket_conn 是一个 HandlerFunc,可直接在路由中使用。

项目中 websocket 链接地址为:/socket/system/message,发送消息的接口为:/api/tool/send_message

JavaScript 示例代码:

const ws = new WebSocket("ws://127.0.0.1:9999/socket/system/message");
//连接打开时触发
ws.onopen = function (evt) {
    ...
};
//接收到消息时触发
ws.onmessage = function (evt) {
    ...
};
//连接关闭时触发
ws.onclose = function (evt) {
    ...
};

在项目中 实用工具箱 -> WebSocket 界面,右侧请求接口发送消息,在左侧可以实时收到消息。

小结

本文纯属抛砖引玉,有问题,欢迎批评指正。

go-gin-api[2] 项目开箱即用,支持 WEB 界面一键安装,赶快去试试吧。

推荐阅读

参考资料

[1]gorilla/websocket: https://github.com/gorilla/websocket

[2]go-gin-api: https://github.com/xinliangnote/go-gin-api

目录
相关文章
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
2472 33
|
监控 Java 编译器
限流、控并发、减GC!一文搞懂Go项目资源优化的正确姿势
本章介绍Go语言项目在构建与部署阶段的性能调优和资源控制策略,涵盖编译优化、程序性能提升、并发与系统资源管理、容器化部署及自动化测试等内容,助力开发者打造高效稳定的生产级应用。
|
测试技术 Go 开发工具
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
Go语言项目工程化实践中的开发工具与CI/CD支持,涵盖格式化、静态检查、依赖管理、构建打包、自动化测试及部署策略。内容包括常用工具如gofmt、go vet、golangci-lint、Docker、GitHub Actions等,并提供实战建议与总结,提升团队协作效率与项目质量。
|
NoSQL 中间件 Go
Go语言项目工程化 — 项目结构与模块划分
本章讲解Go语言项目工程化中的结构设计与模块划分,涵盖单体及分层架构方案,指导如何按功能组织代码,提升项目的可维护性、扩展性,适用于不同规模的开发场景。
|
JSON 安全 Go
Go语言项目工程化 —— 日志、配置、错误处理规范
本章详解Go语言项目工程化核心规范,涵盖日志、配置与错误处理三大关键领域。在日志方面,强调其在问题排查、性能优化和安全审计中的作用,推荐使用高性能结构化日志库zap,并介绍日志级别与结构化输出的最佳实践。配置管理部分讨论了配置分离的必要性,对比多种配置格式如JSON、YAML及环境变量,并提供viper库实现多环境配置的示例。错误处理部分阐述Go语言显式返回error的设计哲学,讲解标准处理方式、自定义错误类型、错误封装与堆栈追踪技巧,并提出按调用层级进行错误处理的建议。最后,总结各模块的工程化最佳实践,助力构建可维护、可观测且健壮的Go应用。
|
Go 持续交付 开发者
Go语言包与模块(module)的基本使用-《Go语言实战指南》
本章深入讲解Go语言中的包(Package)和模块(Module)概念。包是代码组织的最小单位,每个`.go`文件属于一个包,通过`import`实现复用;主程序包需命名为`main`。模块是Go 1.11引入的依赖管理机制,支持自动版本管理和私有/远程仓库,无需依赖GOPATH。通过实际示例,如自定义包`mathutil`和第三方模块`gin`的引入,展示其使用方法。常用命令包括`go mod init`、`go mod tidy`等,帮助开发者高效管理项目依赖。最后总结,包负责功能划分,模块实现现代化依赖管理,提升团队协作效率。
519 15
|
网络协议 算法 物联网
Go语言的WebSocket与实时通信
本文介绍了 WebSocket 技术及其在 Go 语言中的实现。WebSocket 是一种基于 TCP 的协议,支持客户端与服务器间的持久连接和实时通信,相比传统 HTTP 更高效。文章详细讲解了 WebSocket 的核心概念、Go 语言中的相关库(如 `gorilla/websocket`),以及其实现步骤和应用场景。通过代码示例展示了如何构建 WebSocket 服务器和客户端,并探讨了其在聊天应用、实时更新、游戏和物联网等领域的实际用途。此外,还推荐了相关工具和学习资源,帮助开发者更好地掌握这一技术。
606 3
|
网络协议 Java 开发工具
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
821 1
|
缓存 监控 前端开发
在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统
本文深入探讨了在 Go 语言中实现 WebSocket 实时通信的应用,包括 WebSocket 的简介、Go 语言的优势、基本实现步骤、应用案例、注意事项及性能优化策略,旨在帮助开发者构建高效稳定的实时通信系统。
1009 10
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
1669 4

热门文章

最新文章