gRPC error code

RPC.response.status.code HTTP RPC Description 0 - OK 200 OK Not an error; returned on success. 1 - CANCELLED 499 Client Closed Request The operation was cancelled, typically by the caller. 2 - UNKNOWN 500 Internal Server Error Unknown error. For example, this error may be returned when a Status value received from another address space belongs to an error space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error....

2019-06-12 · 4 min · L

Protobuf 总结

Protobuf是什么 Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于通信协议和数据存储等。 传输协议 - 如json、XML IDL - 接口描述语言 存储格式 - 序列化压缩后存储到数据库 核心竞争力 向前向后兼容性 - 新老版本兼容,无需考虑版本升级 多语言代码生成 - 支持Java、Python、PHP、Go等编程语言 快&小 - 序列化、反序列化速度快,压缩比优秀 关键技术 varints编码 每个字节使用其中7位保存数字,最高位表示后面是否还有内容 低位在前,高位在后 保留了fixed32和fixed64,用于传递大的正数 int32、int64、unit32、uint64、bool,序列化结果相互兼容,可以修改 zigzag编码 传统上,负数最高位为1,小负数会浪费编码长度 (n<<1)^(n>>31) -1将会被编码成1,1将会编码成2,-2将会被编码成3 sint32和sint64使用zigzag编码 message structure编码 Tag-Value编码 Tag=(field_number<<3)|wire_type->varints wire_type:0表示varints,1表示固定64位,5表示固定32位 wire_type:2表示Tag-Length-Value编码(TLV),Length使用varints string、bytes、message嵌套,都采用TLV编码 wire_type只有0、1、2、5,那么3和4去哪了?—被废除了 repeated编码 第一种方式:重复出现的相同tag 第二种方式:(packed=true),TLVVV…编码 仅有数字类型才可以使用第二种方法,protocol buffers 3(pb3)中默认第二种,pb2中需要指定,第一种任何情况下会被支持 非repeated情况出现重复tag,后面的覆盖前面的,因此optional和repeated相互兼容 Map编码 map<key_type,value_type>map_field=N 序列化结果完全等价于: message MapFieldEntry { key_type key = 1; value_type value = 2; } repeated MapFieldEntry map_field = N; protoc编译器 C++编写的proto文件编译器 支持各种语言编写的插件,使用进程间通信传递信息 Android和iOS上有对应的插件支持,自动调用protoc Github地址:https://github....

2019-03-14 · 1 min · L

Learning go from zero to hero - Part 2

作者:Milap Neupane 链接:https://medium.freecodecamp.org/learning-go-from-zero-to-hero-d2a3223b3d86 函数 main.go包中定义的func main()是执行程序的入口。可以定义和使用更多函数。让我们看一个简单的例子: func add(a int, b int) int { c := a + b return c } func main() { fmt.Println(add(2, 1)) } // 3 正如我们在上面的例子中所看到的,使用**func关键字后跟函数名来定义Go函数。函数所需的参数**需要根据其数据类型定义,最后是返回的数据类型。 函数的返回也可以在函数中预定义: func add(a int, b int) (c int) { c = a + b return } func main() { fmt.Println(add(2, 1)) } // 3 这里c被定义为返回变量。因此,定义的变量c将自动返回,而无需在结尾的return语句中定义。 还可以从单个函数返回多个返回值,将返回值与逗号分隔开。 func add(a int, b int) (int, string) { c := a + b return c, "successfully added" } func main() { sum, message := add(2, 1) fmt....

2018-12-28 · 4 min · L

Learning go from zero to hero - Part 1

作者:Milap Neupane 链接:https://medium.freecodecamp.org/learning-go-from-zero-to-hero-d2a3223b3d86 开始 想到刚开始学习Go的时候,也是不清不楚地本着拿来能用就行的心态,没有系统学习,导致学习过程中踩坑无数。今天发现一篇文章写的很好,Go语言的特征讲得很细,翻译给需要的初学Go的同学。 前言 让我们从Go(或者称为Golang)的一个小介绍开始。Go由Google工程师Robert Griesemer,Rob Pike和Ken Thompson设计。它是一种静态类型的编译语言。第一个版本于2012年3月作为开源发布。 “ Go是一种开源编程语言,可以轻松构建简单,可靠,高效的软件 ” 在许多语言中,有许多方法可以解决给定的问题。程序员可以花很多时间思考解决问题的最佳方法。 另一方面,Go相信更少的功能 — 只有一种正确的方法来解决问题。 这节省了开发人员的时间,并使大型代码库易于维护。 “ 功能越多,成本越高 ” — Rob Pike 入门 Go由package组成。名为main的包告诉Go编译器被编译为可执行文件,而不是作为library被引用。它是应用程序的主入口。主包定义为: package main 让我们在Go工作区中创建一个简单的hello world示例。 工作区 Go中的工作空间由环境变量定义,称为 GOPATH。 你的任何代码都将写在工作区内。Go将搜索GOPATH目录中的任何包,或者GOROOT在安装Go时默认设置的目录。注:GOROOT 是安装go的路径。 设置GOPATH为所需的目录。现在,让我们将其添加到文件夹中~/workspace。 # 定义GOPATH目录 export GOPATH=~/workspace # 进入工作区目录 cd ~/workspace 在我们刚刚创建的工作区文件夹中创建main.go文件并写入以下代码。 Hello World! package main import ( "fmt" ) func main(){ fmt.Println("Hello World!") } 在上面的示例中,Go中的官方包fmt实现了格式化I/O的函数。 我们使用import 关键字在Go中导入fmt包。func main是代码执行的主入口。Println是fmt包内的一个函数,我们用它来打印“hello world”。 让我们先运行这个文件看看。可以通过两种方式运行Go命令。众所周知,Go是编译型语言,所以我们要在执行之前编译它。 go build main.go 这将创建一个二进制可执行文件main,现在我们可以运行: ./main # Hello World! 还有另一种更简单的方式来运行程序。使用go run命令有助于抽象编译步骤。只需运行以下命令即可编译并执行该程序。...

2018-12-22 · 2 min · L