golang

golang grpc keepalive

我的梦境 提交于 2019-12-09 15:06:03
最近遇到 grpc 客户端报错 rpc error: code = Unavailable desc = transport is closing ,原因是连接长时间没有使用,被服务端断开,这种情况通过简单粗暴的重试策略可以解决,更加优雅的解决方案是增加保持连接策略 服务端 var kaep = keepalive.EnforcementPolicy{ MinTime: 5 * time.Second, // If a client pings more than once every 5 seconds, terminate the connection PermitWithoutStream: true, // Allow pings even when there are no active streams } var kasp = keepalive.ServerParameters{ MaxConnectionIdle: 15 * time.Second, // If a client is idle for 15 seconds, send a GOAWAY MaxConnectionAge: 30 * time.Second, // If any connection is alive for more than 30 seconds, send a GOAWAY

Golang 中的指针 - Pointer

不想你离开。 提交于 2019-12-09 11:22:58
Golang 中的指针 - Pointer Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func 。 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性。但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算。从这一点看,Golang 的指针基本就是一种引用。 那么 Golang 为什么需要指针?这种指针又能有什么独特的用途呢? 在学习引用类型语言的时候,总是要先搞清楚,当给一个函数/方法传参的时候,传进去的是值还是引用。实际上,在大部分引用型语言里,参数为基本类型时,传进去的大都是值,也就是另外复制了一份参数到当前的函数调用栈。参数为高级类型时,传进去的基本都是引用。这个主要是因为虚拟机的内存管理导致的。 内存管理中的内存区域一般包括 heap 和 stack, stack 主要用来存储当前调用栈用到的简单类型数据:string,boolean,int,float 等。这些类型的内存占用小,容易回收,基本上它们的值和指针占用的空间差不多,因此可以直接复制,GC也比较容易做针对性的优化。

【Golang】Debug :decoding dwarf section info at offset 0x0: too short

五迷三道 提交于 2019-12-09 09:55:57
解决方法 通过下面的方式升级dlv 来解决这个问题: go get -u github.com/derekparker/delve/cmd/dlv 下面是我记录的定位问题的过程 问题描述 博主升级到了go1.11之后,手抖点击了Visual Studio Code升级按钮,然后编写代码debug的时候一直报下面的错误: could not launch process: decoding dwarf section info at offset 0x0: too short 某度的爬虫不给力,搜不到相关的信息: 定位解决 在尝试了设置环境变量:( set CGO_ENABLED=0 ),重装Visual Studio Code 、go 1.11 等等无果之后突然意识到了自己漏了一环 -- debug包的更新,所以尝试着执行了下面的命令: go get -u github.com/derekparker/delve/cmd/dlv 更新了这个包之后果然可以正常使用了。在好奇心的驱使下我去看了该项目的最新更新。 延展 在这个项目GitHub issue下面发现了已经有人在三月份提过相关的问题,在最新的评论下面我们可以看到,有几个人在升级了go 1.11 都遇到了类似的问题,但从我更新的之后使用的结果来看,这个项目的作者已经修复了相关的bug,对最新版本做了兼容。

golang测试

空扰寡人 提交于 2019-12-08 17:48:37
/*--> */ /*--> */ 简述 Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命令来实现单元测试和性能测试。 go test [-c] [-i] [build flags] [packages] [flags for test binary] 参数解读 -c : 编译 go test 成为可执行的二进制文件,但是不运行测试。 -i : 安装测试包依赖的 package ,但是不运行测试。 关于 build flags ,调用 go help build ,这些是编译运行过程中需要使用到的参数,一般设置为空 关于 packages ,调用 go help packages ,这些是关于包的管理,一般设置为空 关于 flags for test binary ,调用 go help testflag ,这些是 go test 过程中经常使用到的参数 -test.v : 是否输出全部的单元测试用例(不管成功或者失败),默认没有加上,所以只输出失败的单元测试用例。 -test.run pattern: 只跑哪些单元测试用例 -test.bench patten: 只跑哪些性能测试用例 -test.benchmem : 是否在性能测试的时候输出内存情况 -test.benchtime t : 性能测试运行的时间,默认是 1s -test

golang:exported function Script should have comment or be unexported

微笑、不失礼 提交于 2019-12-08 14:47:28
当自己定义的包被外部使用时,如果不遵循一定的规范,那么会出现讨厌的绿色纹条,还会警告: 虽然不会影响运行,但是也令人讨厌,那么如何解决这个问题呢? 为结构体或者变量或者方法添加注释,并且开头必须是结构体或变量或方法的名字,加上空格,加上描述 这样就不会有讨厌的绿色纹条了,同时需要注意声明结构体时需指定名称,即q *Queue,不能用this或者self指代q,否则会有警告: 来源: https://www.cnblogs.com/xiximayou/p/12005705.html

Linux下Golang Socket编程原理分析与代码实现

牧云@^-^@ 提交于 2019-12-07 18:10:33
  在POSIX标准推出后,socket在各大主流OS平台上都得到了很好的支持。而Golang是自带Runtime的跨平台编程语言,Go中提供给开发者的Socket API是建立在操作系统原生Socket接口之上的。但Golang 中的Socket接口在行为特点与操作系统原生接口有一些不同。本文将结合一个简单的网络聊天程序加以分析。 一、socket简介 首先进程之间可以进行通信的前提是进程可以被唯一标识,在本地通信时可以使用PID唯一标识,而在网络中这种方法不可行,我们可以通过IP地址+协议+端口号来唯一标识一个进程,然后利用socket进行通信。socket通信流程如下: 1.服务端创建socket 2.服务端绑定socket和端口号 3.服务端监听该端口号 4.服务端启动accept()用来接收来自客户端的连接请求,此时如果有连接则继续执行,否则将阻塞在这里。 5.客户端创建socket 6.客户端通过IP地址和端口号连接服务端,即tcp中的三次握手 7.如果连接成功,客户端可以向服务端发送数据 8.服务端读取客户端发来的数据 9.任何一端均可主动断开连接 二、socket编程 有了抽象的socket后,当使用TCP或UDP协议进行web编程时,可以通过以下的方式进行。 服务端伪代码: listenfd = socket(……) bind(listenfd, ServerIp

golang利用gob序列化struct对象保存到本地

被刻印的时光 ゝ 提交于 2019-12-07 15:54:11
golang可以通过json或gob来序列化struct对象,虽然json的序列化更为通用,但利用gob编码可以 实现json所不能支持的struct的方法序列化,利用gob包序列化struct保存到本地也十分简单. gob包实现的序列化struct对象保存到本地 务必注意的是golang序列化有个小坑,就是struct里的字段必须要可导出也就是首字母大写 package main import ( "encoding/gob" "fmt" "os" ) type User struct { Id int Name string } func (this *User) Say() string { return this.Name + ` hello world ! ` } func main(){ file, err := os.Create("mygo/gob") if err != nil { fmt.Println(err) } user := User{Id: 1, Name: "Mike"} user2 := User{Id: 3, Name: "Jack"} u := []User{user, user2} enc := gob.NewEncoder(file) err2 := enc.Encode(u) fmt.Println(err2) }

centos7 制作golang开发环境的docker镜像

ⅰ亾dé卋堺 提交于 2019-12-07 15:09:09
1.首先安装docker yum install docker -y systemctl start docker systemctl enable docker 2.然后获取官方centos镜像 docker pull centos 3.下载完后用docker images命令查看镜像ID 4. 生成并启动容器:docker run -i -t 镜像ID 5. 在容器中执行exit退出容器. 6. service restart docker 7. 用docker ps -l 查看刚才的容器ID 8. 重新进入容器: docker start -ia 容器ID 下面的命令在容器中执行 ------------------------------- 9. yum install go -y 10. yum install git -y 11.用vi打开/etc/profile,将GOROOT设置为/usr/lib/golang并加入导出列表,保存退出 12.source /etc/profile 13. mkdir -p /root/go 14.用vi打开/root/.bashrc将GOPATH设置为/root/go:/var/myapp并导出,保存退出 15. source /root/.bashrc 16.根据你的需要,用go get命令下载你所需要的第三方golang库 17

基于golang从头开始构建基于docker的微服务实战笔记

廉价感情. 提交于 2019-12-07 14:07:39
参考博文 part 1 利用gRPC protobuf定义服务 part 2 - Docker and go-micro Go-micro part 3 - docker-compose and datastores Part 4 - Authentication with JWT JWT User-service consignment-cli consignment-server Part 5 - Event brokering with Go Micro NATS配置 user-service nats连接失败 参考博文 https://ewanvalentine.io/microservices-in-golang-part-1/ 这个博文是作者微服务系统的第一篇,本学习笔记基于目前的5篇而成 part 1 利用gRPC ,protobuf定义服务 本人在学习过程中没有严格按照博文中放在github目录,而是在主目录中创建一个wdyshippy的目录,目录中文件结构如下 . ├── consignment- cli │ ├── cli .go │ ├── consignment- cli │ ├── consignment .json │ ├── Dockerfile │ └── Makefile └── consignment-service ├──

Docker Volume Plugin 开发及Golang实现

拟墨画扇 提交于 2019-12-07 14:04:19
原文地址: http://www.damonyi.cc/?p=232 前期的项目需求,需要合理利用宿主机的存储,利用在宿主机部署Agent的方式,实现了基于LVM分配Docker数据卷的方式,随着开发的进行,项目想要集成docker compose 完成应用的自动编排,需要在docker compose中为容器创建数据卷并且指定卷大小,之前的采用agent的模式已经无法满足目前的需求。参考 docker 官方文档 和 Local-Persist 项目,实现了一个基于LVM的volume 插件 docker-volume-plugin-lvm 。 Docker Volume Plugin 提供了标准的卷管理API,第三方只需要实现这些API就可以了。 插件加载方式,将自己实现的Driver注册,启动main函数,实际上是启动了一个监听端口,sock文件:/var/run/docker/plugins/LVM.sock func main() { driver := NewLvmPersistDriver() handler := volume.NewHandler(driver) fmt.Println(handler.ServeUnix("root", driver.Name)) } 查询卷API: func (driver *LvmPersistDriver) Get(req