map记了一下,还有个sync.Map,其中对 atomic 包和锁的配合使用,很有代表性
go版本为1.18.1
go map 的复习
go通过grpc-gateway同时提供grpc/http服务的示例
新项目开发决定使用proto来定义api,服务同时提供grpc/http接口
然后通过proto生成swagger文件,导入到yapi中实现自动接口维护
由于之前项目未应用,于是写了个demo以作内部演示用,主要是介绍http rest接口的定义与请求的传参和 message 定义之间的关联
在go的protobuf中进行自定义json tag标记及使用
在使用grpc-gateway的时候,测试时发现HTTP接口返回给前端的json数据的字段格式很不统一,所以需要标准化protobuf->json的映射关系
grpc中使用fieldmask以提升接口的灵活性
最近刷到一篇Netflix的技术博客,提到用 FieldMask 在grpc中实现类似 GraphQL 中的 field selectors 或 Json Api 标准中的 Sparse Fieldsets
http请求响应头缺失Content-Length头信息的问题
对接第三方对象存储的服务最近总是有warning日志,远程上传的对象get请求返回的响应头中缺失content-length信息
go程序中获取到的content-length值为-1
go判断实现接口的方法 var _ Interface = (*Type)(nil)
阅读源码过程中发现很多var _ Interface = (*Type)(nil)
写法,对于接口实现情况的判断十分优雅,而自己编写代码过程中鲜有涉及。
使用grpc时proto的一些问题
服务新版本更新后grpc接口报错 did not read entire message
通过import的方式复用proto来使用grpc
需求是多个后端服务提供grpc接口及proto文件,之前上层服务各自调用,分散且难以管理
所以选择重构,后端服务据说没有人手,不会做任何改动,但目标是实现故障转移、服务注册发现、负载均衡、任务泄露检测等
其中就涉及要复用proto的要求,本来简单的事由于掉进前人坑中,也只好记录下,增加点教训
使用dumb-init来实现docker中运行多个进程并处理SIGTERM信号
最近重构一些老项目,为此实现了一个基于etcd的grpc服务注册、发现及负载均衡的中间件
服务注册嘛,无论docker还是k8s部署,都需要服务在监听到系统信号 SIGTERM
,实现标准的优雅停机
,摘除注册
之前的服务启动命令是一个脚本,看似实现了,但没有完全实现