Protocol Buffers是一种跨平台的序列化数据结构协议,通过.proto
文件作为DSL
描述,并且将数据以二进制方式字节流方式编码。了解protobuf
的编码方式,对于合理组织自己的协议,以及优化业务代码都比较有帮助。
使用Kind在windows上搭建个人用的k8s
在学习k8s的过程中,出于实践的需要,我们经常需要对k8s集群做一些敏感操作,例如使用hostpath,安装daemonset。所以在自己的开发机上组建一个简单的k8s集群是很必要的。本文将会介绍如何使用wsl+Kind搭建一个k8s集群。
wire使用技巧
在写go
项目时,我们一般对于一些依赖的资源和类会通过依赖注入的方式来解决对象初始化流程耦合的问题。不同于dig
和inject
这两个工具通过反射来实现依赖注入,wire
是通过代码生成的方式。相比之下整体流程更加易懂直观。
protoc插件编写
利用protoc
,可以解析protobuf
文件生成。一般来说都是通过自定义插件,调用库方法来实现。官方的protobuf
解析实际上也是利用插件完成的,例如protoc-gen-go
。
早先使用c++
版本书写的时候需要从stdin
里获取pb
文件的数据,之后再根据descriptor
生成代码片段(或者是别的文本片段,txt
,json
或者别的你需要的文本,根据需求而定),最后把文本输出到stdout
里。我们可以理解为实际上protoc
就是把proto
文件通过标准输入喂给了插件,之后截取标准输出作为生成的文件。这里实际上步骤是很繁琐的,所以之前很多同学宁可用点第三方的parser
。
不过官方后续给go
提供了一个比较好使的库,google.golang.org/protobuf/compiler/protogen
,因此后续写插件我都推荐用go
加上这个库来写。虽然用的是go
,但是写出来的插件可以生成各种代码,只要是文本格式就可以(事实上不是文本也毫无问题)。
ADL,CPO和tag_invoke
在executor
提案出现之后,有关于cpo
和tag_invoke
的话题就变得很常见。这几个功能,包括ADL
都是为了解决在不同的namespace
下如何正确的匹配到对应的方法的问题。
linux进程内存占用分析
线上服务一般都会遇到因为代码bug或者逻辑不合理导致内存占用暴涨的情况(例如内存泄露),也有可能在线上环境发现内存占用太高和预估不符的情况。单纯分析代码人肉查问题不总是靠谱,此时最直观的方式就是profile进程的内存占用问题。如果遇到了c/c++
开发的服务,或者需要分析类似java
堆外内存泄露的问题,gperf(tcmalloc)
是一个比较好的选择。