Golang 单元测试与基准测试
前言 “没测试的代码 = 不知道能不能跑的代码”。Go 把测试做成语言级公民:go test 开箱即用,没有选择困难。这篇从规范到进阶一次讲清。 ...
前言 “没测试的代码 = 不知道能不能跑的代码”。Go 把测试做成语言级公民:go test 开箱即用,没有选择困难。这篇从规范到进阶一次讲清。 ...
前言 几十台机器各自 tail -f 的日子该结束了。集中式日志的价值:一处搜索全部日志、跨服务排障关联、图表化趋势、留存审计。ELK 是这个领域的经典答案。 一、架构与组件分工 应用/中间件 │ 输出日志文件 ▼ Filebeat(轻量采集器, 装在每台机器) │ 汇聚 / 容错缓冲 ▼ [可选] Kafka(削峰 / 解耦 / 丢不起的日志) │ ▼ Logstash(解析: grok 拆字段、过滤、富化) │ ▼ Elasticsearch(索引 + 全文检索) │ ▼ Kibana(查询 / 可视化 / 告警) 组件选型说明: ...
前言 “改个数据库地址要重新打镜像?"——配置与代码分离是十二要素应用的核心原则。K8s 用 ConfigMap(普通配置)+ Secret(敏感配置) 承载这一切。 ...
前言 虚拟化基础篇讲了 KVM 原理,这篇进入实战进阶:用 cloud-init 云镜像几分钟拉起一台可 SSH 的虚拟机,玩转快照、克隆、桥接——自建小私有云/Malloc 一套测试环境的完整技能。 ...
前言 “最小权限原则"落地的第一站就是账号体系:日常用普通用户 + 按需 sudo,而不是人人 root。这篇把用户、组、sudo 的管理一次讲全。 ...
前言 运维和后端日常都绕不开"用程序取数据":调 API、抓页面、做监控探测。这篇把 Python 网络请求从入门到工程化讲一遍。 一、requests:把 HTTP 写成人话 import requests # GET(永远带 timeout!) r = requests.get( "https://httpbin.org/get", params={"page": 2, "size": 10}, # ?page=2&size=10 headers={"User-Agent": "my-spider/1.0"}, timeout=5, ) r.status_code # 200 r.json() # 解析响应体 r.text # 文本 r.headers["Content-Type"] # POST JSON r = requests.post( "https://httpbin.org/post", json={"name": "zy", "level": 5}, # 自动序列化 + Content-Type timeout=5, ) # POST 表单 / 文件上传 requests.post(url, data={"k": "v"}, timeout=5) requests.post(url, files={"f": open("a.png", "rb")}, timeout=5) # 常见 HTTP 动词 requests.put(url, json={...}); requests.delete(url); requests.head(url) 没有 timeout 的请求 = 随机挂死的脚本。timeout=(3, 10) 分别指连接和读取超时。 ...
前言 标准库 net/http 就能写出生产级 Web 服务。这篇从路由到优雅关停走一遍,再聊什么时候需要框架。 一、五分钟起步 package main import ( "encoding/json" "log" "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintln(w, "ok") }) // JSON API mux.HandleFunc("GET /api/users/{id}", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") // go1.22+ 原生路径参数! json.NewEncoder(w).Encode(map[string]string{ "id": id, "name": "zy", }) }) log.Println("listening :8080") log.Fatal(http.ListenAndServe(":8080", mux)) } curl http://localhost:8080/healthz curl http://localhost:8080/api/users/42 Go 1.22 后 ServeMux 支持方法限定 + 路径参数(GET /users/{id}),日常路由基本不用框架了。 ...
前言 手工部署的痛苦:SSH → 拉代码 → 编译 → 覆盖文件 → 重启 → 祈祷。CI/CD 把这一切变成"git push 后自动完成"。这篇讲概念、工具链和一条可落地的流水线。 ...
前言 压测时出现 Too many open files、大量 TIME_WAIT、连接队列溢出——这些都不是应用 bug,是内核默认参数太保守。生产服务器上线清单里,sysctl 调优应有一席之地。 ...
前言 Pod 会生会死,IP 说变就变——“怎么找到服务"是分布式系统的第一问题。K8s 的答案是 Service(四层)+ Ingress(七层) 双层体系。这篇把流量链路彻底打通。 ...