当前位置: 首页 > news >正文

Go语言实现SSE中转demo

Go语言实现SSE中转demo

文章概要:本文主要通过一个demo来介绍如何使用Go语言实现SSE中转。

本文内容来自:谷流仓AI - ai.guliucang.com

前提

  • 已安装Go语言环境(参考这篇文章:Macbook安装Go以及镜像设置)

创建项目

  1. 创建项目目录
mkdir go-app && cd go-app
  1. 初始化项目
# 后面的模块名自己定义
go mod init example/user/go-app

创建文件

先看一下完成之后的目录结构:

go-app/
├─ go.mod
├─ http/
│  ├─ requests.go
│  └─ responses.go
└─ main.go

然后每个文件的代码如下:

  1. main.go
package mainimport ("example/user/go-app/http""github.com/gin-gonic/gin""log"
)// 主函数:初始化并启动 Gin 框架的 HTTP 服务器,支持 /event-stream 的 POST 和 GET 请求。
func main() {// 创建一个用于传递事件的通道ch := make(chan string)// 初始化并配置默认的 Gin路由器router := gin.Default()// 设置 POST /event-stream 的处理函数,用于处理 POST 请求router.POST("/event-stream", func(c *gin.Context) {http.HandleEventStreamPost(c, ch) // 处理 POST 请求的逻辑})// 设置 GET /event-stream 的处理函数,用于处理 GET 请求router.GET("/event-stream", func(c *gin.Context) {http.HandleEventStreamGet(c, ch) // 处理 GET 请求的逻辑})// 启动 HTTP 服务器并监听端口 9990,记录启动失败的错误日志log.Fatalf("error running HTTP server: %s\n", router.Run(":9990"))
}
  1. 创建http目录,并创建文件
  • requests.go
package httpimport ("errors""fmt""github.com/gin-gonic/gin""io"
)// EventStreamRequest 结构体定义了事件流请求的数据模型
type EventStreamRequest struct {Message string `form:"message" json:"message" binding:"required,max=100"` // 请求中必须提供的消息内容,最大长度为100
}// HandleEventStreamPost 处理POST方法的事件流请求
// c: Gin框架的上下文对象,用于处理HTTP请求和响应
// ch: 用于事件流通信的通道,将请求消息发送到此通道
func HandleEventStreamPost(c *gin.Context, ch chan string) {var request EventStreamRequest// 尝试绑定请求数据到EventStreamRequest结构体if err := c.ShouldBind(&request); err != nil {// 如果绑定失败,生成错误响应并返回errorMessage := fmt.Sprintf("request validation error: %s", err.Error())BadRequestResponse(c, errors.New(errorMessage))return}// 将请求消息发送到通道ch <- request.Message// 创建成功响应并返回CreatedResponse(c, &request.Message)return
}// HandleEventStreamGet 处理获取事件流的请求。
// c: Gin框架的上下文对象,用于处理HTTP请求和响应。
// ch: 一个字符串类型的通道,用于向客户端发送事件消息。
func HandleEventStreamGet(c *gin.Context, ch chan string) {// 使用Stream方法来建立一个服务器端事件流,不断检查通道中是否有新消息。c.Stream(func(w io.Writer) bool {// 如果通道中有消息,通过SSEvent方法以"message"事件类型发送到客户端。if msg, ok := <-ch; ok {c.SSEvent("message", msg)return true // 表示继续发送下一个事件}return false // 表示没有更多事件,结束流})return
}
  • reponses.go
package httpimport ("github.com/gin-gonic/gin""net/http"
)// JSendFailResponse 定义了一个失败响应的结构体,包含状态和数据字段
type JSendFailResponse[T any] struct {Status string `json:"status"` // 响应状态Data   T      `json:"data"`   // 响应数据,这里泛型T可以是任意类型
}// JSendSuccessResponse 定义了一个成功响应的结构体,包含状态和可选的数据字段
type JSendSuccessResponse[T any] struct {Status string `json:"status"`         // 响应状态Data   T      `json:"data,omitempty"` // 响应数据,成功时可选
}// BadRequestResponse 用于处理Bad Request错误,返回400状态码和错误信息
func BadRequestResponse(c *gin.Context, error error) {c.JSON(http.StatusBadRequest,JSendFailResponse[string]{Status: "fail",        // 设置响应状态为失败Data:   error.Error(), // 将错误信息填入数据字段},)return
}// CreatedResponse 用于处理创建资源的成功响应,返回201状态码和创建的资源信息
func CreatedResponse[T interface{}](c *gin.Context, i *T) {c.JSON(http.StatusCreated,JSendSuccessResponse[T]{Status: "success", // 设置响应状态为成功Data:   *i,        // 填入创建的资源信息},)return
}

运行程序

  1. 启动项目
go run main.go
  1. 开一个终端,运行以下命令, 监听数据:
curl http://localhost:9990/event-stream
  1. 打开另一个终端,运行以下命令,发送数据:
curl -d '{"message":"Hello, Event Stream!"}' -H "Content-Type: application/json" -X POST http://localhost:9990/event-stream
  1. 观察第一个终端,可以看到数据已经发送过来了:
event:message
data:Hello, Event Stream!

相关文章:

Go语言实现SSE中转demo

Go语言实现SSE中转demo 文章概要&#xff1a;本文主要通过一个demo来介绍如何使用Go语言实现SSE中转。 本文内容来自&#xff1a;谷流仓AI - ai.guliucang.com 前提 已安装Go语言环境&#xff08;参考这篇文章:Macbook安装Go以及镜像设置&#xff09; 创建项目 创建项目目录…...

国内IP修改软件下载指南

在互联网时代&#xff0c;IP地址扮演了一个非常重要的角色。国内IP修改成为一些用户迫切需求的问题&#xff0c;因为它可以帮助用户解决一些特定的网络访问问题。那么&#xff0c;要修改国内IP地址&#xff0c;我们该使用哪些软件呢&#xff1f;虎观代理小二将为大家列举几款可…...

模数转换器 SIG1230A 国产平替 ADS1230,替代 ADS1230

信格勒微电子的芯片产品已通过行业头部大厂导入验证&#xff0c;深受百万终端客户好评。 而且因为 fully compatible. 板子拿来&#xff0c;换个芯片&#xff0c; 性能更好 。MCU不用改 c code。 SIG1230A 10/80SPS 20-bit ADC with PGA Compatible Parts ADS1230 fully…...

获取淘宝商品评论的爬虫技术分享(已封装API,可测试)

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…...

由vue2版本升级vue3版本遇到的问题

一、vuedraggable 由vue2版本升级vue3版本后&#xff0c;可能会遇到以下几种bug&#xff1a; 1、vue3vuedraggable报错TypeError: Cannot read properties of undefined (reading ‘updated’)&#xff1a;这个一般是因为插件使用语法有问题&#xff0c;vue3版本的插件使用时&…...

数据挖掘终篇!一文学习模型融合!从加权融合到stacking, boosting

模型融合&#xff1a;通过融合多个不同的模型&#xff0c;可能提升机器学习的性能。这一方法在各种机器学习比赛中广泛应用&#xff0c; 也是在比赛的攻坚时刻冲刺Top的关键。而融合模型往往又可以从模型结果&#xff0c;模型自身&#xff0c;样本集等不同的角度进行融合。 数据…...

24考研数学炸了,给25考研人的启示

复习原则和要素 在选择老师、思路的时候&#xff0c;一定要看清楚&#xff0c;认不认可这个老师的复习思路。 有的老师认为大家基础不错&#xff0c;讲的内容可能不会特别细致。有的老师注重基础&#xff0c;讲的很细致&#xff0c;防止0基础的学生吃力。所以&#xff0c;思路…...

嵌入式学习第三十天!(单向链表练习)

1. 单向链表的逆序&#xff1a; int Is_Empty_Link(LINK_LIST *plist) {return plist->phead NULL; }void Reverse_Link(LINK_LIST *plist) {LINK_NODE *ptmp plist->phead;LINK_NODE *pinsert NULL;plist->phead NULL;if(Is_Empty_Link(plist)){return;}else{wh…...

Linux:rpm部署Jenkins(1)

1.获取Jenkins安装包 我这里使用的是centos7系统&#xff0c;ip为&#xff1a;192.168.6.6 2G运存 连接外网 Jenkins需要java环境&#xff0c;java的jdk包你可以去网上下载离线包&#xff0c;或者直接去yum安装&#xff0c;我这里使用的是yum安装 再去获取Jenkins的rpm包…...

新能源汽车充电桩站点烟火AI识别检测算法应用方案

新能源汽车作为现代科技与环保理念的完美结合&#xff0c;其普及和应用本应带给人们更加便捷和绿色的出行体验。然而&#xff0c;近年来新能源汽车充电火灾事故的频发&#xff0c;无疑给这一领域投下了巨大的阴影。这不禁让人深思&#xff0c;为何这一先进的交通工具在充电过程…...

Macbook安装Go以及镜像设置

Macbook安装Go 文章概要&#xff1a;本文主要介绍了在MacOS上安装Go的步骤 本文内容来自&#xff1a;谷流仓AI - ai.guliucang.com 有两种方式安装go&#xff1a; 通过homebrew安装通过Go官网直接下载安装文件安装 1. 通过homebrew安装 brew update && brew install…...

群晖NAS安装Video Station结合内网穿透实现公网访问本地影音文件

文章目录 1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑浏览器访问本地群晖video station5.公网条件下使用移动端&#xff08;搭载安卓&#xff0c;ios&#xff0c;ipados等系统的设备…...

GitHub加速访问最简单的方法

Github是全球最大的代码开源平台&#xff0c;对于编程的小伙伴来说&#xff0c;这是一个巨大的宝库&#xff0c;也是编程学习的圣地。很对小伙伴在使用GitHub时会经常出现无法访问Github的情况。 一、解决方法——>修改hosts文件 通过 IP查询工具来获取当前Github网站的真实…...

MySQL数据库索引介绍

前言 在数据库中创建索引可以提高数据检索的速度和效率。索引是一种数据结构&#xff0c;类似于书籍的目录&#xff0c;它可以帮助数据库系统快速定位和访问表中的特定数据行。 目录 一、索引相关介绍 1. 概述 2. 作用 3. 副作用 4. 创建原则依据 二、索引的分类与管理…...

中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念 1、时序数据 时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图&#xff0c;CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据&#xff0c;也就是我们常常听到的“数据可视化”。 2、时序数据库 非关系型数据库&#…...

Go第三方框架--gin框架(一)

序言 Gin框架作为go语言使用最多的web框架&#xff0c;以其快速的响应速度和对复杂http路由配置的支持受到程序员和媛们的喜爱&#xff0c;几乎统治了web市场。但作为一名合格的程序员&#xff0c;要知其然更要知其所以然&#xff0c;不然八股文背的也没有啥意思。本着这个原则…...

网络安全——笔记

XSS&#xff1a;跨站脚本&#xff08;Cross-site scripting&#xff09; XSS 全称“跨站脚本”&#xff0c;是注入攻击的一种。其特点是不对服务器端造成任何伤害&#xff0c;而是通过一些正常的站内交互途径&#xff0c;例如发布评论&#xff0c;提交含有 JavaScript 的内容文…...

Maven pom.xml配置详解

pom.xml是什么&#xff1f; pom.xml&#xff08;项目对象模型-Project Object Model的缩写&#xff09;是Maven项目的核心配置文件&#xff0c;用于管理项目的依赖、插件、构建配置等。 举例说明&#xff1a;以阿里巴巴的fastjson为例&#xff1a; <?xml version"1.…...

2024深圳国际电线电缆及电源产品展览会

2024深圳国际电线电缆及电源产品展览会 2024 Shenzhen International Coupling, Clutch and Brake Exhibition 时间&#xff1a;2024年08月28-30日 地点&#xff1a;深圳国际会展中心&#xff08;新馆&#xff09; 预订以上展会详询陆先生 I38&#xff08;前三位&#xff…...

如何成功将自己开发的APP上架到应用商店

随着移动应用市场的蓬勃发展&#xff0c;开发一款优秀的APP已成为许多企业和个人的首要选择。然而&#xff0c;成功上架并有效推广APP至关重要。本文将逐步介绍完整的上架流程&#xff0c;包括准备所需材料、注册开发者账户、进行APP备案、提交审核以及上架成功后的推广和维护。…...

PyTorch 2.8镜像实际案例:电商场景中AI生成商品短视频的端到端实现

PyTorch 2.8镜像实际案例&#xff1a;电商场景中AI生成商品短视频的端到端实现 1. 电商短视频生成的技术挑战 在电商运营中&#xff0c;商品短视频已经成为提升转化率的关键因素。传统视频制作面临三个主要痛点&#xff1a; 人力成本高&#xff1a;专业视频制作团队单条视频…...

不用手动设置滤波参数,程序自动根据信号特征,匹配滤波参数,零基础也能抗干扰。

在智能仪器的世界里&#xff0c;我们经常面临一个尴尬的局面&#xff1a;实验室里算法跑得飞起&#xff0c;一到现场就被噪声淹没。今天&#xff0c;我将结合《智能仪器设计》中的自适应信号处理理念&#xff0c;带你手撸一个“傻瓜式”自适应滤波器。这个工具的目标很明确&…...

Z-Image-Turbo镜像实战教程:开箱即用,9步生成高清图片

Z-Image-Turbo镜像实战教程&#xff1a;开箱即用&#xff0c;9步生成高清图片 1. 为什么选择Z-Image-Turbo镜像 如果你正在寻找一个能快速生成高质量图片的AI工具&#xff0c;Z-Image-Turbo镜像可能是目前最省心的选择。这个镜像最大的优势在于它已经预置了完整的32GB模型权重…...

08-Spring 数据访问 - JDBC 详解

08. Spring 数据访问 - JDBC 详解 8.1 Spring JDBC 概述 Spring JDBC 是 Spring Framework 提供的数据访问抽象层,简化了 JDBC 的使用,消除了样板代码,同时保留了 JDBC 的完整控制能力。 8.1.1 传统 JDBC 的问题 // 传统 JDBC 代码 - 大量样板代码 public List<User&…...

Guohua Diffusion 长短期记忆网络辅助:实现连贯性故事图像生成

Guohua Diffusion 长短期记忆网络辅助&#xff1a;实现连贯性故事图像生成 你有没有想过&#xff0c;让AI帮你画一个完整的故事&#xff1f;比如&#xff0c;一个关于探险家穿越神秘森林的漫画&#xff0c;或者一个产品从概念到成型的视觉故事板。现在很多图像生成模型单张图做…...

AUnit:面向Arduino的轻量级嵌入式单元测试框架

1. AUnit&#xff1a;面向嵌入式Arduino平台的轻量级单元测试框架1.1 设计动因与核心定位AUnit并非凭空诞生的全新框架&#xff0c;而是针对ArduinoUnit 2.2在实际工程中暴露出的三大痛点所进行的深度重构与优化。作为一名长期在资源受限的8位AVR平台&#xff08;如Arduino UNO…...

Intv_AI_MK11 Anaconda数据科学环境配置:一站式AI研发平台搭建

Intv_AI_MK11 Anaconda数据科学环境配置&#xff1a;一站式AI研发平台搭建 1. 为什么选择Anaconda搭建AI开发环境 如果你刚开始接触AI开发&#xff0c;可能会被各种环境配置问题困扰。不同框架的版本兼容性、CUDA驱动安装、Python包依赖冲突...这些问题足以让新手望而却步。A…...

Flash Memory技术解析与应用实践

1. Flash Memory技术全景解析作为一名嵌入式系统开发工程师&#xff0c;我使用Flash Memory已有十余年经验。从早期的NOR Flash烧录到现在的TLC NAND优化&#xff0c;这项技术始终是存储领域的核心支柱。让我们抛开教科书式的定义&#xff0c;从实际工程角度重新认识这项既熟悉…...

Git二分法精准定位Bug

Git二分法定位Bug的原理Git二分法基于二分查找算法&#xff0c;通过自动在提交历史中不断缩小范围&#xff0c;定位引入Bug的特定提交。其核心是利用git bisect命令&#xff0c;结合测试脚本或手动验证&#xff0c;高效识别问题根源。准备工作确保本地仓库有完整的提交历史&…...

使用Image - To - image条件生成对抗网络评估乳腺癌新辅助化疗反应的动态对比增强MRI血管渗透性映射

论文总结1、提出了一种基于条件生成对抗网络&#xff08;cGAN&#xff09;的新方法&#xff0c;用于将动态对比增强磁共振成像&#xff08;DCE MRI&#xff09;快速转换为药代动力学&#xff08;PK&#xff09;血管通透性参数图&#xff08;Ktrans&#xff09;&#xff0c;以早…...