![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Golang
金庆
这个作者很懒,什么都没留下…
展开
-
net.LookupSRV()查询k8s无头服务
net.LookupSRV()查询k8s无头服务(金庆的专栏 2021.2)如下创建 StatefulSet 和 Headless Service: test.yamlapiVersion: v1kind: Servicemetadata: name: headless-svc labels: app: headless-svcspec: ports: - port: 80 name: aaaa - port: 20080 name: bbbb s原创 2021-02-22 16:15:39 · 661 阅读 · 2 评论 -
rpc应答太快造成请求超时
rpc应答太快造成请求超时(金庆的专栏 2020.9)在压测中发现总有几个请求超时,超时时长设大也会有,而成功的请求延时远小于超时时间。查错的第一方向是查网络库中有消息丢失。跟踪所有消息,发现超时的消息应该是正常处理并返回了。于是查接收应答消息后的处理,最终找到代码:func (c *Client) onRpcRet(cbIndex uint32, ...) { ii, ok := c.callbacks.Load(cbIndex) if !ok { // logger.Errorf("原创 2020-09-17 15:57:08 · 765 阅读 · 0 评论 -
golang各数值类型的最大最小值
golang各数值类型的最大最小值(金庆的专栏 2020.9)golang 的 math 包已经定义了以下常量:Constantsconst ( E = 2.71828182845904523536028747135266249775724709369995957496696763 // https://oeis.org/A001113 Pi = 3.14159265358979323846264338327950288419716939937510582097494459 /转载 2020-09-11 14:53:13 · 3188 阅读 · 0 评论 -
参数太灵活容易出错
参数太灵活容易出错(金庆的专栏 2020.7)golang中可以将参数类型设为 interface{}, 这样就可以传入任意类型的参数,和 C++ 中 void* 的作用相似。但是这种万能类型应该尽量少用,尽量使用具体的类型,或者使用一个具体的接口类型。主要的原因是, 让编译期的类型检查挡住编码错误,减少运行期的错误。例如,go-mongo-driver 有个创建索引的参数:type IndexModel struct { // A document describing which原创 2020-07-24 09:11:17 · 334 阅读 · 0 评论 -
grpc外部负载均衡器测试
grpc外部负载均衡器测试(金庆的专栏 2020.4)grpc 对每个请求进行负载均衡。负载均衡的方式有:代理模式客户端实现外部负载均衡参考:gRPC LB https://blog.csdn.net/xiaojia1100/article/details/78842295gRPC 中负载均衡的主要机制是外部负载均衡。gRPC 定义了外部负载均衡服务的接口:https://gi...原创 2020-04-17 10:03:58 · 1032 阅读 · 0 评论 -
数组make参数错误
数组make参数错误(金庆的专栏 2020.3)用 mgo 的 Bulk 接口操作 mongodb 的代码,在 mongodb 4.2 正常,而连 mongodb 2.6 报错:error parsing element 0 of field documents :: caused by :: wrong type for '0' field, expected object, found...原创 2020-03-19 13:36:14 · 343 阅读 · 0 评论 -
试用 go test suite
试用 go test suite(金庆的专栏 2020.3)github.com/stretchr/testify/suite 提供了测试套件功能,可以在整个套件开始结束时执行动作,也可以在每个测试开始结束时执行动作。假设有以下2个函数需要测试:func foo() { fmt.Printf("foo...\n")}func goo() { fmt.Printf("goo......原创 2020-03-13 12:03:18 · 3967 阅读 · 0 评论 -
go不要导出channel
go不要导出channel(金庆的专栏 2020.3)导出 channel 的包都比较难用。平常也不会将接口设计成 channel.以下摘自:https://studygolang.com/articles/12135?fr=sidebar不要导出并发原语Go 提供了非常易于使用的并发原语,这也导致了它被过度的使用。我们主要担心的是 channel 和 sync package 。有的...转载 2020-03-10 15:55:42 · 176 阅读 · 0 评论 -
go代码覆盖测试
go代码覆盖测试(金庆的专栏 2020.2)假设应用名为 MyMod, 主函数的文件为 main.go, 那就创建如下的 main_test.go 文件:package main/* 测试整个服务器。 go test -c -covermode=count -coverpkg ./...生成 MyMod.test.exe. 复制到 bin 目录下运行: MyMod.test.exe...原创 2020-02-29 09:07:27 · 273 阅读 · 0 评论 -
考察go一致性hash库
考察go一致性hash库(金庆的专栏 2020.2)github 搜 consistent, 按星数依次察看stathat/consistentConsistent hash package for Go.stathat 应该是个数据统计的云服务。consistent被认为是生产可用的。所有文档都在 godoc. 示例和接口简洁易懂。lafikl/consistentA Go li...原创 2020-02-22 11:38:49 · 605 阅读 · 0 评论 -
将go函数指针转为接口
将go函数指针转为接口(金庆的专栏 2020.2)golang 中的接口如下:type Writer interface { Write func(p []byte) (n int, err error)}一般API参数要求一个接口,而不是一个函数指针,如 io.Copy() 需要输入一个 Writer 和 Reader:func Copy(dst Writer, src R...原创 2020-02-13 14:33:44 · 792 阅读 · 0 评论 -
golang chan 关闭时的原则
golang chan 关闭时的原则(金庆的专栏 2020.X)golang 程序中检测到 DATA RACE, 是 chan 关闭和发送冲突:==================WARNING: DATA RACEWrite at 0x00c000098010 by goroutine 68: runtime.closechan() /usr/lib/golang/sr...原创 2020-01-08 19:42:59 · 2171 阅读 · 0 评论 -
golang net Windows 还不支持自定义dns
golang net Windows 还不支持自定义dns(金庆的专栏 2019.4)See: https://github.com/golang/go/issues/29621使用 consul 注册服务,可使用 consul 的 DNS 解析到服务的地址。但是 golang 直到 1.12 仍然在 Windows 上无法使用自定义的 DNS 服务,并且没有计划支持。例如本机 127....原创 2019-04-20 10:49:50 · 514 阅读 · 0 评论 -
Golang的包名
Golang的包名(金庆的专栏 2018.6)摘自:https://talks.golang.org/2014/organizeio.slide#1The name of a packageKeep package names short and meaningful. Don’t use underscores, they make package names long....转载 2018-06-25 16:49:10 · 2045 阅读 · 0 评论 -
用目录结构表示go包依赖关系
用目录结构表示go包依赖关系(金庆的专栏 2018.6)摘自: https://www.ardanlabs.com/blog/2017/02/package-oriented-design.htmlIf a package wants to import another package at the same level:Question the current design ...转载 2018-06-25 17:14:30 · 1013 阅读 · 0 评论 -
k8s集群外go客户端示例
k8s集群外go客户端示例(金庆的专栏 2018.7)集群内客户端需要打包成docker镜像,上传镜像,然后用 kubectl run 运行, 还要设置用户角色,太麻烦,还是用集群外客户端测试比较方便。客户端库使用 ericchiang/k8s, 比官方的 client-go 要简单许多。集群内客户端使用k8s.NewInClusterClient()创建, 集群外客户端使用 ...原创 2018-07-22 10:57:53 · 2010 阅读 · 0 评论 -
grpc中的dns负载均衡
grpc中的dns负载均衡(金庆的专栏 2018.8)grpc-go 中如下连接服务器,请求将在多个IP之间轮转。 conn, err := grpc.Dial( "dns:///rng-headless:8081", grpc.WithBalancerName(roundrobin.Name), grpc.WithInsecu...原创 2018-08-29 10:53:27 · 3596 阅读 · 0 评论 -
K8s获取NodePort
K8s获取NodePort(金庆的专栏 2018.9)将服务用NodePort暴露到外网,为避免端口冲突,不指定NodePort, 而是让k8s自动选择一个端口。$ cat get_node_port.yamlkind: ServiceapiVersion: v1metadata: name: jq-servicespec: type: NodePort s...原创 2018-09-04 15:12:04 · 2941 阅读 · 0 评论 -
K8s获取NodePort
K8s获取NodePort(金庆的专栏 2018.9)将服务用NodePort暴露到外网,为避免端口冲突,不指定NodePort, 而是让k8s自动选择一个端口。$ cat get_node_port.yamlkind: ServiceapiVersion: v1metadata: name: jq-servicespec: type: NodePort s...原创 2018-09-04 15:12:05 · 3825 阅读 · 0 评论 -
gotest 是有缓存的
gotest 是有缓存的(金庆的专栏 2018.X)用 gotest 运行一个测试,往 mongodb 中插入一条,发现有时灵,有时不灵。因为错误地怀疑 mgo 用错了,耗费了不少时间。最终发现是因为 gotest 是有缓存的,输出的是上次运行的结果,但是并没有实际运行代码。运行有效是因为代码刚改过,测试时会实际运行。最终也是无意间发现的。给 mgo 开启了调试日志,然后比较2次运行,...原创 2018-10-29 18:45:03 · 3738 阅读 · 1 评论 -
grpc加TLS加密和令牌认证
grpc加TLS加密和令牌认证(金庆的专栏 2018.11)用 golang 创建 grpc 服务,开启 TLS 加密,并采用令牌认证。然后用 C++ 和 golang 分别创建客户端连接服务器。参考:https://segmentfault.com/a/1190000007933303服务器import ( ... grpc_auth "github.com/grpc-ecos...原创 2018-11-26 10:32:20 · 7086 阅读 · 20 评论 -
试用 go mod
试用 go modGo 1.11 支持 module.代码不需要在 GOPATH/src 目录下。先初始化模块,生成 go.modE:\tempλ mkdir -p testmod\helloE:\tempλ cd testmod\hello\E:\temp\testmod\helloλ go mod init github.com/jinq0123/hellogo: cr...原创 2018-12-26 10:00:42 · 4934 阅读 · 0 评论 -
open-match匹配流程
open-match匹配流程(金庆的专栏 2019.1)https://github.com/GoogleCloudPlatform/open-matchopen-match 是一个通用的游戏匹配框架。由游戏提供自定义的匹配算法(以docker镜像的方式提供)。分为多个进程,各进程之间共享一个 redis.前端, 接收玩家加入 redis,成功后通知玩家房间服地址后端,设置一局游戏...原创 2019-01-31 10:18:19 · 2017 阅读 · 0 评论 -
grpc-go与actor模式
grpc-go与actor模式(金庆的专栏 2018.6)grpc-go服务器的每个请示都在一个独立的协程中执行。 网游服务器中,一般请求会调用游戏房间的方法,而房间是一个独立的协程。 可以将房间实现为actor,grpc请求通过Call()或Post()方法来执行。 其中Call()会等待返回,而Post()会异步执行无返回值。type Room struct { ...原创 2018-06-12 11:09:23 · 1645 阅读 · 0 评论