kratos 源码解析 TODO

如果是一个简单的需求,那么我们用 Go http、gin、beego 足以 再复杂点呢,接口多起来了,我们寻求团队分工合作,功能解藕,所以按功能、层级将服务进行拆分,服务间使用 http、grpc 进行调用 当服务多起来了,我们需要一个规范统一各个服务的代码,这里的代码是项目层级、中间件调用、日……

阅读全文

一句话总结设计模式

前言:本文目的是学习总结设计模式,提炼每个设计模式最核心的要点。一句话概括设计模式,必然会导致一些知识失真 创建型模式 简单工厂模式(Simple Factory) 在 Go 中,即 NewXXX 方法,返回具体对象 工厂方法模式(Factory Method) 使用接口取代具体对象,不同结构体实现不同的创建对象……

阅读全文

Golang Interface

结论 interface 本质上也是一种类型,所以在判断它是否为 nil 时, 如果是其它类型转成的 interface,其实中间已经包含了结构体信息,所以这时它已经不是 nil 了 背景 此文是由一个 bug 引发的思考,代码如下 业务代码 代码经过精简,请暂时忽略注释的的内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28……

阅读全文

写作流程

写给自己 确定主题 梳理段落结构,段落主题确定,段落间注意承接 文章及段落都采用总分总模式 注意文章的前置知识,尽量提前说明。 参考: 《写作的逻辑》简单读书笔记……

阅读全文

gin 源码探究

官方的 http 包 我们从流量打入端口开始,gin 其实是官方 http 包的封装 1 2 3 4 5 6 7 8 9 // 这里是 gin.Run 的逻辑 func (engine *Engine) Run(addr ...string) (err error) { defer func() { debugPrintError(err) }() address := resolveAddress(addr) debugPrint("Listening and serving HTTP on %s\n", address) err = http.ListenAndServe(address, engine) return } 再回顾下官方 http 包的使用方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 func HelloServer(w http.ResponseWriter, req *http.Request) { io.WriteString(w, "hello, world!\n") } func run() { // 点进去就发现,它使用 DefaultServeMux 注册了路由地址 http.HandleFunc("/hello", HelloServer) // 这里……

阅读全文

vim macro 宏

预设置 vim 宏在 vimrc 中 其实本篇文章核心内容是在预设置宏的时候注意转义问题( vim 中有很多转义问题,以后单独开一篇文章来说) vim 宏的操作可以观看 vim 宏的操作视频可能更直观一些 将如下写入 vimrc 中,重启 vim 即可 let @s="I#\<Esc>A\"" 上述表示:将宏存储在寄存器s中,功能为 光标移动到第一个非空字符前且进入 insert 模式 插入&rdquo……

阅读全文

github action cicd使用

github action 是什么 github actions 由一项或多项作业组成,可以计划或由事件触发。 工作流程可用于在 GitHub 上构建、测试、打包、发布或部署项目。 使用 github action 自动部署博客 我使用的hugo+nginx的博客方案,原本的基本流程为 在本地编辑文稿 使用hugo命令进行编译,生成一个public文件夹 将public文件夹打包压……

阅读全文

在kubernetes下轻松debug

在容器化大行其道的今天,经常有需求要检查容器内部状态,debug容器内的应用。 今天总结介绍一下几个场景与解决方案。 docker debug 有时候我们的容器应用A会有些网络问题,或是cpu memory io占用过高,我们想看看容器内到底什么在作怪。 然而一般的应用镜像的基础镜像是精简镜像,它几乎没什么调试查看工具。……

阅读全文

Delta-of-Delta 算法

提问 有个需求,让你压缩一列时间戳,想一想,怎么做 以下是纳秒精度时间戳 1616047412408692000 1616047412408692001 1616047412408692002 1616047412408692002 1616047412408692005 1616047412408692005 1616047412408692010 … 回答 记录首个时间戳 + 每个时间戳与首个的差值 时间戳 实际记录值 1616047412408692000 1616047412408692000 1616047412408692001 1 1616047412408692002 2 1616047412408692002 2 1616047412408692005 5 1616047412408692005 5 1616047412408692010 10 记录首个时间戳 + 他们与上一个数字的差值 时间戳 实际记录值 1616047412408692000 1616047412408692000 1616047412408692001 1 1616047412408692002 1 1616047412408692002 0 1616047412408692005 3 1616047412408692005 0 1616047412408692010 5 第2种方法明显比第1种更节约……

阅读全文

Debug in container

有时候我们需要对容器内部进程进行debug,当然我们可以直接拷贝delve到容器进行命令行调试, 但是由于缺少源文件会导致无法看见调试的上下文代码,可以配置 ~/.config/dlv/config.yml 中的 substitute-path参数,不过这样就繁琐了。 在容器启动时就使用delve启动debug 1. 下载delve并以容器……

阅读全文