流式 HTTP 是指在一次 HTTP 请求/响应过程中,服务端或客户端能够**逐步发送或接收数据**,而不是等待整个内容准备好后一次性传输。这种模式适用于大文件传输、实时日志推送、SSE(Server-Sent Events)、视频流等场景。
下面我们将从 **HTTP/1.1、HTTP/2、HTTP/3** 三个协议版本的角度详细解释流式传输的机制,并结合 **Go 语言** 编写服务端示例代码,说明其原理和实现方式。
---
## 一、HTTP/1.1 的流式传输
### 1.1 原理
- HTTP/1.1 支持 **Chunked Transfer Encoding**(分块传输编码)。
- 服务端可以在不知道内容总长度的情况下,通过 `Transfer-Encoding: chunked` 头部逐块发送响应体。
- 每个块以十六进制长度开头,后跟 `\r\n`,然后是数据,再以 `\r\n` 结尾。
- 最终用一个长度为 0 的块表示结束。
### 1.2 Go 实现示例(HTTP/1.1 流式响应)
```go
package m...
发布日期:
2025-11-22
分类:
后端
浏览量:
67
在 Go 语言中使用 `go-sql-driver/mysql`(即 `github.com/go-sql-driver/mysql`)作为 MySQL 驱动时,连接字符串中的 `loc` 参数用于指定驱动在处理 `DATETIME` 和 `TIMESTAMP` 类型时所使用的 **本地时区(Local Time Zone)**。
---
## 一、`loc` 参数的作用
- `loc` 指定的是 **Go 程序解析和格式化时间时使用的时区**。
- 它 **不会改变 MySQL 服务器本身的时区设置**,而是影响 Go 驱动如何将数据库中的时间值转换为 Go 的 `time.Time` 类型,以及如何将 `time.Time` 写入数据库。
语法示例:
```go
db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/dbname?loc=Asia%2FShanghai")
```
其中 `Asia/Shanghai` 是 IANA 时区名称,URL 编码后为 `Asi...
发布日期:
2025-11-20
分类:
Go
浏览量:
78
# Go Web 应用性能pprof分析完整指南
在构建高性能的 Go Web 应用时,性能分析(Profiling)是不可或缺的一环。Go 语言原生提供了强大且易用的性能分析工具,本文将系统性地介绍如何对 Go Web 应用进行 CPU、内存、阻塞、协程等维度的性能分析,并提供可直接复用的代码模板和操作步骤。
## 一、准备工作:启用 pprof
Go 的标准库 `net/http/pprof` 提供了 HTTP 接口访问性能分析数据的能力。只需在你的 Web 应用中导入该包即可自动注册相关路由:
```go
import _ "net/http/pprof"
```
> 注意:仅在开发或测试环境中暴露 pprof 端点。生产环境应通过权限控制或独立管理端口暴露,避免安全风险。
### 示例:最小可运行 Web 应用 + pprof
```go
package main
import (
"net/http"
_ "net/http/pprof" // 自动注册 /debug/pprof 路由
)
fu...
发布日期:
2025-11-20
分类:
Go
浏览量:
60
MCP是一种开放协议,它标准化了应用程序如何向LLM提供上下文。把MCP想象成人工智能应用程序的USB-C端口。正如USB-C提供了一种将您的设备连接到各种外围设备和附件的标准化方式,MCP提供了一种将人工智能模型连接到不同数据源和工具的标准化方式。
MCP分服务器和客户端:
- 服务器提供MCP定义的功能,主要包括工具(tool)、资源(resource)、提示(prompt)和采样(sampling)。
- 客户端则充当服务器和LLM之前通信的桥梁,告知LLM有哪些MCP功能可用,调用MCP服务器提供的获取返回再提交给LLM。
## 概念
### tool 工具
工具让LLM可以通过用户提供的服务器执行操作,通过工具LLM可以和外部系统交互。
比如需要获取实时新闻,天气等,LLM是不知道这些实时数据的,就可以通过工具来获取。
### resource 资源
资源是指可以公开给LLM的数据和内容,可以是任意类型的数据。
比如:
- 文件内容
- 图像内容
- 日志文件
- 等等......
资源是用URI来标识...
发布日期:
2025-06-22
分类:
后端
浏览量:
2452
有些场景,比如用户充值、注册等需要比较精确的数据时,可以在服务端通过GA提供的数据收集接口上报数据。
**1. 获取api密钥**
GA管理后台 => 管理 => 媒体和资源设置 => 数据收集和修改 => 数据流
在数据流里面选择一个项目,点进去可以看到`Measurement Protocol API 密钥`,点进去就可以管理api密钥了。
**2. POST数据**
把数据提交到`https://www.google-analytics.com/mp/collect?measurement_id=${measurement_id}&api_secret=${api_secret}`
`measurement_id`:数据流的衡量ID,在设置里面的数据流可以看到,类似`G-XXXXXXXXXX`的字符串
`api_secret`: 上一步获取的api密钥
**3. 调试**
把第二部里面的url改成`/debug/mp/collect`,提交数据有错误,会返回错误信息
**4. 文档链接**
发送事件:https:...
发布日期:
2025-04-22
分类:
后端
浏览量:
4857
GORM模型查询生成器生成的模型代码,创建数据的时候如果time.Time类型的属性未赋值,`create`将会报错:
`incorrect datetime value '0000-0-0 00:00:00' for column`
有几种方法能让GORM忽略未赋值的time字段,使用数据库默认的NULL:
- 使用`Omit`忽略指定的未赋值字段
- 模型数据类型`time.Time`改成`*time.Time`
- 把模型gorm的tag改成`gorm:"default:null"`
- 把模型数量类型改成`sql.NullTime`,新加模型赋值时需要赋值`sql.NullTime{}`...
发布日期:
2025-02-24
分类:
Go
浏览量:
6190
快钱官方没有提供完整的SDK,仅有一些demo,要集成进现有go mod项目要花一点时间集成和测试,记录一下签名验证的关键点,支付方式是SDK网关支付和H5支付。
快钱会提供三个密钥文件:
- 商户应用私钥文件,`pfx`格式,有密码,用于签名数据。
- ssl证书,`pfx`格式,有密码,用于`https`双向认证,快钱的证书测试下来会报错,所以用`openssl`提取了证书和密钥使用,下面有写。
- 快钱公钥证书,用于加/解密和验证数据。
场景是把以上证书内容`base64`编码成字符串存数据库,提供页面UI配置。
## 1、支付下单数据签名
按照文档里面的字段顺序排序字段,拼接成查询字符串,用商户私钥加签。
```go
//SignData data 拼接的待签名字符串
func SignData(data string) (string, error) {
// merchantKey私钥
certBytes, err := base64.StdEncoding.DecodeString(merchantKey)
i...
发布日期:
2024-08-09
分类:
后端
浏览量:
6529
**知识点:**
- udp 协议是无连接的协议,发送数据前不需要先和数据接收方建立连接。
- 每个 UDP socket 都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。
- 当socket 接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的 UDP 丢弃数据报。
- UDP每个数据包之间有界限,每次接收都是一个完整的数据包,即使被下层的ip协议分片传输(udp包大于ip包的最大传输单元)。
- ip分片传输,某个片丢失,那么整个udp包都会被丢弃,上层应用不知道udp包被丢弃。
## 单播
单播就是点对点通信,用于两个主机之间端对端的通信。
**服务端主要函数:**
- `net.ListenUDP`: 监听`udp`端口
- `ReadFromUDP`: 读取连接数据
- `WriteToUDP`: 写入数据
由于udp是无连接的协议,所以服务端读和写都要...
发布日期:
2024-07-31
分类:
Go
浏览量:
5464
> 原文 [Guide](https://github.com/golang/example/blob/master/slog-handler-guide/README.md)
标准库的 `log/slog` 包采用两部分设计。由 `Logger` 类型实现的“前端”收集经过结构化的日志信息(如消息、级别和属性),并将它们传递给“后端”,即 `Handler` 接口的实现。该软件包带有两个内置处理程序,通常应该足够了。但是您可能需要编写自己的处理程序,这并不总是那么简单。本指南随时为您提供帮助。
# 记录器(logger)及其处理程序(handler)
编写处理程序需要了解 `Logger` 和 `Handler` 类型如何协同工作。
每个记录器都包含一个处理程序。某些 `Logger` 方法会执行一些预备工作,例如将键值对收集到 `Attrs` 中,然后调用一个或多个 `Handler` 方法。这些 `Logger` 方法是 `With`、`WithGroup` 和输出方法。
输出方法履行记录器的主要作用:生成日志输出。下面是对输出方法的调用:
`...
发布日期:
2024-07-17
分类:
后端
浏览量:
1328
使用Golang读取pfx格式证书里面的私钥,用RSA算法签名数据。
代码如下:
```go
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"encoding/base64"
"log"
"os"
pkcs12 "software.sslmate.com/src/go-pkcs12"
)
func main() {
rsaSingFromPfxKey()
}
func rsaSingFromPfxKey() {
data := "测试数据"
// 读取pfx私钥
certPath := "./20190801.3300000002925831.pfx"
certBytes, err := os.ReadFile(certPath)
if err != nil {
log.Fatal(err)
}
pkey, _, _ := pkcs12.Decode(certBytes,...
发布日期:
2024-04-30
分类:
后端
浏览量:
1445