Go同时开启Grpc服务和http服务
Beego开发Grpc服务,同时提供Grpc和普通http服务。
在Beego项目中,一般都是直接开发应用,监听一个端口,使用一种协议。
当我们想使用Grpc服务,同时想使用http服务时,在同一个代码库中时,这时候需要提供2个服务,监听2个端口。
示例1234567891011121314151617181920212223242526272829303132333435363738394041424344package mainimport ( "context" "github.com/astaxie/beego" "github.com/astaxie/beego/logs" "google.golang.org/grpc" "google.golang.org/grpc/reflection" pb "grpc_demo/test" "net")func main(){ end := make(chan bool, 1) go ...
Mac搭建grpc-go环境并测试
GRPC简介GRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
在 GRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
GRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
安装protocprotoc是Protobuf 的编译器
12brew tap grpc/grpcbrew install --with-plugins grpc
安装成功后查看
1protoc --version
显示版本
1libprotoc 3.7.1
可以查 ...
阿里云Docker 容器时间与主机时间不一致
今天使用阿里云Docker容器,发现日志文件时间相差8个小时。
通过date命令查看时间
查看主机时间
12019年 7月23日 星期二 20时15分40秒 CST
查看容器时间
1Tue Jul 23 12:15:40 UTC 2019
可以发现,他们相隔了8小时。
CST应该是指(China Shanghai Time,东八区时间)UTC应该是指(Coordinated Universal Time,标准时间)
解决方案方案一:共享主机的localtime挂载localtime文件到容器内 ,保证两者所采用的时区是一致的
12-v /etc/localtime:/etc/localtime:ro \-v /etc/timezone:/etc/timezone:ro \
方案二:复制主机的localtime1docker cp /etc/localtime:【容器ID或者NAME】/etc/localtime
在完成后,再通过date命令进行查看当前时间。
但是,在容器中运行的程序的时间不一定能更新过来,比如在容器运行的MySQL服务,在更新时间后,通过sql查看MySQ ...
Go invalid memory address or nil pointer dereference错误
Go 指针声明后赋值,出现 panic: runtime error: invalid memory address or nil pointer dereference这种是内存地址错误。
首先我们要了解指针,指针地址在 Go 中 * 代表取指针地址中存的值,& 代表取一个值的地址对于指针,我们一定要明白指针储存的是一个值的地址,但本身这个指针也需要地址来储存
错误示例123456789101112package mainimport "fmt"func main() { var i *int fmt.Println(&i, i) *i = 1 fmt.Println(&i, i, *i)}
错误提示
12340xc00009a008 <nil>panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x ...
Go并发访问变量,异常处理
竟险竟险(竞争条件、Race Condition)是指多个协程(goroutine)同时访问共享数据,其结果取决于指令执行顺序的情况。具体归纳为当有一个变量, 有一个 goroutine 会对它进行写操作, 其他 goroutine 对它进行读操作。 是否需要对这个变量进行加锁保护。
考虑如下售票程序。该程序模拟两个售票窗口,一个执行购票,一个执行退票。
1234567891011121314151617181920212223242526package mainimport ( "fmt" "time")var ticket = 200 // 总票数// 退票func refund() { ticket += 1}// 购票func buy() { ticket -= 1}func main() { go buy() // 购票协程 go refund() // 退票协程 time.Sleep(time.Microsecond * 1) //等待上面两个协程结束 fmt.Println(t ...
Beego提示数据库bad connection
使用Beego开发Go项目中,有时候在有大量操作Mysql时,有时候会发生如下错误。
1"driver: bad connection"
原因这是因为Mysql服务器主动关闭了Mysql链接。在项目中使用了一个mysql链接,同时使用了事务,处理多个表操作。处理时间长。导致空闲链接超时,Mysql关闭了链接。而客户端保持了已经关闭的链接。
具体原因是:beego没有调用db.SetConnMaxLifetime 这个方法,导致客户端保持了已经关闭的链接。
解决Beego调用db.SetConnMaxLifetime(time.Second),设置数据库闲链接超时时间。
1engine.SetConnMaxLifetime(time.Second * 30)
参考文章https://studygolang.com/topics/5576
python3安装pip3
python运行错误python报错ModuleNotFoundError: No module named 'httplib'缺乏’httplib’包 pip install –upgrade pip`响应
12Could not find a version that satisfies the requirement httplib (from versions: )No matching distribution found for httplib
更新pip
1pip install --upgrade pip
查看pip版本pip -V
1pip 19.1.1 from /usr/local/lib/python2.7/site-packages/pip (python 2.7)
更新pip为pip312345curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py# 注意如果python有多个版本,用python3python3 get-pip.pypip -V//pip 19.1.1 fro ...
Go获取当前时间戳
在Go语言上,go语言的time.Now()返回的是当地时区时间,直接用:
1time.Now().Format("2006-01-02 15:04:05")
输出的是当地时区时间2019-05-13 18:00:17。
go语言没有全局设置时区,每次输出时间需要调用一个In()函数改变时区:
12var cstSh, _ = time.LoadLocation("Asia/Shanghai") //上海fmt.Println("SH : ", time.Now().In(cstSh).Format("2006-01-02 15:04:05"))
在windows系统上,没有安装go语言环境的情况下,time.LoadLocation会加载失败。
time.FixedZone12var cstZone = time.FixedZone("CST", 8*3600) // 东八fmt.Println("SH : ", time.Now().In(cstZon ...
压力测试工具wrk
wrk是一个一个简单的 http benchmark 工具, 能做很多基本的 http 性能测试。wrk 的一个很好的特性就是能用很少的线程压出很大的并发量。wrk支持大多数类UNIX系统,不支持windows。
安装Mac安装1brew install wrk
注意: mac 本身连接数有限制,不要做太大的测试
Linux 安装123git clone https://github.com/wg/wrk.gitcd wrkmake
成功以后在目录下有一个 wrk 文件
编译错误可能出现fatalerror: openssl/ssl.h: Nosuchfileor directory错误是因为系统中没有安装openssl的库
123sudo apt-get install libssl-dev# or runsudo yum install openssl-devel
使用参数1234567891011121314使用方法: wrk <选项> <被测HTTP服务的URL> Options: ...
Go包管理工具Glide
Go getGo 语言原生包管理一般用go get但get 子命令管理依赖有很多大缺陷:
能拉取源码的平台很有限,绝大多数依赖的是 github.com
不能区分版本,以至于令开发者以最后一项包名作为版本划分
依赖 列表/关系 无法持久化到本地,需要找出所有依赖包然后一个个 go get
只能依赖本地全局仓库(GOPATH/GOROOT),无法将库放置于局部仓库($PROJECT_HOME/vendor)
GlideGo有很多包管理工具,如godep、govendor、glide、gvt、gopack等。Glide目前比较受关注。 几大主要功能:
持久化依赖列表至配置文件中,包括依赖版本(支持范围限定)以及私人仓库等
持久化关系树至 lock 文件中(类似于 yarn 和 cargo),以重复拉取相同版本依赖
兼容 go get 所支持的版本控制系统:Git, Bzr, HG, and SVN
支持 GO15VENDOREXPERIMENT 特性,使得不同项目可以依赖相同项目的不同版本
可以导入其他工具配置,例如: Godep, GPM, Gom, ...