首先,我使用protobuf作为IDL,然后提供HTTP POST + JSON BODY的方式来发送请求. 能不能使用HTTTP POST + PB序列化后的二进制BODY呢? 做了一下尝试,非常简单: func Report(c *gin.Context) { req := protocols.ReportRequest{} var err error if c.ContentType() == "application/x-protobuf" { err = c.ShouldBi…
起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是每分钟限制大约xxx次请求,平均每秒限制到XXX除60次左右的请求也就够了. 限流器代码 于是下面用了个及其简单的方式来实现限流器: utils/limiter.go package utils import ( "sync/atomic" "time" ) //Lim…
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式上传. 还非常不完美,但是可以作为参考: upload.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>up…
代码中使用了类似的方式来向模板填充参数: c.HTML(200, "list.html", gin.H{"data":builder.String()}) 模板中的语法大致如下: <html> <h1>{{ .data }}</h1> </html> 发现我输入的内容都做了HTML转义. 如何不转义呢?解决方法很简单: import ("html/template") c.HTML(200, &qu…
参考了这篇帖子: https://golangtc.com/t/570b403eb09ecc66b90002d9 golang web如何发送小包的chunked数据 以下是代码: r.GET("/test_stream", func(c *gin.Context){ w := c.Writer header := w.Header() header.Set("Transfer-Encoding", "chunked") header.Set(&…
在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么是JWT? JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 为什么需要JWT? 在之前的一些web项目中,我们通常使用的是Cookie-Session模式实现用户认证.相关流程大…
golang(gin框架),基于RESTFUL的跨语言远程通信尝试 背景: 在今年的项目实训过程中,遇到了这样的问题: 企业老师讲课实用的技术栈是Java springboot. 实训实际给我们讲课以外的开发时间非常短暂,为了方便协作.提高效率,我们想要将系统模块拆分成几个粒度比较大的分布式服务.然而同学合作开发之间用的语言栈不相同,让大家都学习类似gRPC的跨语言远程调用技术也不现实,于是便决定通过一个中心网关对各个模块发起http restful调用,实现模块服务的拆分. 简单尝试: spr…
Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高.感兴趣的可以访问这里.Protocol Buffers官方只支持C++, Java, Python, C#, Go,如果想在PHP中使用Protocol Buffers,需要借助于第三方的扩展,使用方法如下. 安装protoc编译器 第一步,安装Google的protoc编译器,这个工具可以把pr…
本文来自网易云社区. 总览 先来看一下 FlatBuffers 项目已经为我们提供了什么,而我们在将 FlatBuffers 用到我们的项目中时又需要做什么的整体流程.如下图: 在使用 FlatBuffers 时,我们需要以特殊的格式定义我们的结构化数据,保存为 .fbs 文件.FlatBuffers 项目为我们提供了编译器,可用于将 .fbs 文件编译为Java文件,C++文件等,以用于我们的项目.FlatBuffers 编译器在我们的开发机,比如Ubuntu,Mac上运行.这些源代码文件是基…
本文来自网易云社区. FlatBuffers编码数组 编码数组的过程如下: 先执行 startVector(),这个方法会记录数组的长度,处理元素的对齐,准备足够的空间,并设置nested,用于指示记录的开始. 然后逐个添加元素. 最后 执行 endVector(),将nested复位,并记录数组的长度. public void startVector(int elem_size, int num_elems, int alignment) { notNested(); vector_num_e…