0%

Protocol Buffers是一种跨平台的序列化数据结构协议,通过.proto文件作为DSL描述,并且将数据以二进制方式字节流方式编码。了解protobuf的编码方式,对于合理组织自己的协议,以及优化业务代码都比较有帮助。

阅读全文 »

在学习k8s的过程中,出于实践的需要,我们经常需要对k8s集群做一些敏感操作,例如使用hostpath,安装daemonset。所以在自己的开发机上组建一个简单的k8s集群是很必要的。本文将会介绍如何使用wsl+Kind搭建一个k8s集群。

阅读全文 »

Uploading file...ma4oe

在写go项目时,我们一般对于一些依赖的资源和类会通过依赖注入的方式来解决对象初始化流程耦合的问题。不同于diginject这两个工具通过反射来实现依赖注入,wire是通过代码生成的方式。相比之下整体流程更加易懂直观。

阅读全文 »

利用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,但是写出来的插件可以生成各种代码,只要是文本格式就可以(事实上不是文本也毫无问题)。

阅读全文 »

executor提案出现之后,有关于cpotag_invoke的话题就变得很常见。这几个功能,包括ADL都是为了解决在不同的namespace下如何正确的匹配到对应的方法的问题。

阅读全文 »

线上服务一般都会遇到因为代码bug或者逻辑不合理导致内存占用暴涨的情况(例如内存泄露),也有可能在线上环境发现内存占用太高和预估不符的情况。单纯分析代码人肉查问题不总是靠谱,此时最直观的方式就是profile进程的内存占用问题。如果遇到了c/c++开发的服务,或者需要分析类似java堆外内存泄露的问题,gperf(tcmalloc)是一个比较好的选择。

阅读全文 »

C++模板参数类型推导

c++模板中,可以使用以下代码来根据类型推导来定制模板代码:

1
2
3
4
5
6
7
8
9
10
template<typename T>
void foo(T t) {
// c++17之后生效,如果版本更旧可以换成std::is_integral<T>::value
if constexpr (std::is_integral_v<T>) {
// int 类型的特殊实现
}
else if constexpr (std::is_floating_point_v<T>) {
// float double类型的特殊实现
}
}

但是我们不能够根据返回值类型来特殊定制代码。

阅读全文 »