技术阅读周刊第十四期:常用的 Git 配置

技术阅读周刊,每周更新。

历史更新

  • 20231122:第十一期

  • 20231129:第十二期

  • 20240105:第十三期:一些提高生产力的终端命令

  • 20240112:第十四期:Golang 作者 Rob Pike 在 GopherConAU 上的分享

How I write HTTP services in Go after 13 years

aee3860ad2817b1d979fd234c9693b29.png
  1. 使用NewServer函数构建服务实例,利用依赖注入方式将所有的依赖参数包含进来。

func NewServer(logger *Loggerconfig *ConfigcommentStore *commentStoreanotherStore *anotherStore
) http.Handler {mux := http.NewServeMux()addRoutes(mux,Logger,Config,commentStore,anotherStore,)var handler http.Handler = muxhandler = someMiddleware(handler)handler = someMiddleware2(handler)handler = someMiddleware3(handler)return handler
}
  1. 在routes.go文件中统一定义所有路由函数。

func addRoutes(mux                 *http.ServeMux,logger              *logging.Logger,config              Config,tenantsStore        *TenantsStore,commentsStore       *CommentsStore,conversationService *ConversationService,chatGPTService      *ChatGPTService,authProxy           *authProxy
) {mux.Handle("/api/v1/", handleTenantsGet(logger, tenantsStore))mux.Handle("/oauth2/", handleOAuth2Proxy(logger, authProxy))mux.HandleFunc("/healthz", handleHealthzPlease(logger))mux.Handle("/", http.NotFoundHandler())
}
  1. 主函数只调用run函数来运行服务

func run(ctx context.Context, w io.Writer, args []string) error {ctx, cancel := signal.NotifyContext(ctx, os.Interrupt)defer cancel()// ...
}func main() {ctx := context.Background()if err := run(ctx, os.Stdout, os.Args); err != nil {fmt.Fprintf(os.Stderr, "%s\n", err)os.Exit(1)}
}
  1. 返回闭包 handle

// handleSomething handles one of those web requests
// that you hear so much about.
func handleSomething(logger *Logger) http.Handler {thing := prepareThing()return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// use thing to handle requestlogger.Info(r.Context(), "msg", "handleSomething")})
}
  1. 定义通用的encode和decode函数

func encode[T any](w http.ResponseWriter, r *http.Request, status int, v T) error {w.Header().Set("Content-Type", "application/json")w.WriteHeader(status)if err := json.NewEncoder(w).Encode(v); err != nil {return fmt.Errorf("encode json: %w", err)}return nil
}func decode[T any](r *http.Request) (T, error) {var v Tif err := json.NewDecoder(r.Body).Decode(&v); err != nil {return v, fmt.Errorf("decode json: %w", err)}return v, nil
}
  1. 提供一个抽象的 Validator 接口用于验证

// Validator is an object that can be validated.
type Validator interface {// Valid checks the object and returns any// problems. If len(problems) == 0 then// the object is valid.Valid(ctx context.Context) (problems map[string]string)
}func decodeValid[T Validator](r *http.Request) (T, map[string]string, error) {var v Tif err := json.NewDecoder(r.Body).Decode(&v); err != nil {return v, nil, fmt.Errorf("decode json: %w", err)}if problems := v.Valid(r.Context()); len(problems) > 0 {return v, problems, fmt.Errorf("invalid %T: %d problems", v, len(problems))}return v, nil, nil
}

自定义校验需要实现 Validator 接口。

  1. 使用 Once 延迟调用来提高启动性能。

func handleTemplate(files string...) http.HandlerFunc {var (init    sync.Oncetpl     *template.Templatetplerr  error)return func(w http.ResponseWriter, r *http.Request) {init.Do(func(){tpl, tplerr = template.ParseFiles(files...)})if tplerr != nil {http.Error(w, tplerr.Error(), http.StatusInternalServerError)return}// use tpl}
}

What is OpenTelemetry?

4af3466fe33155004dd50cfcd1617624.png

这是一篇 OTel 的科普文章

OpenTelemetry 提供一个统一、可扩展的框架,用于收集、分析和观察分布式系统的性能数据。它包括一组API、库、代理和收集器,这些组件可以跨多种编程语言和平台实现对应用程序的监控。

OpenTelemetry 整合 OpenTracing 和 OpenCensus。

bd1d227ae648690929efec3f34683c31.png

2019年,两个社区进行了合并。

同时 OTel 具备以下特征:

  1. 统一性:OpenTelemetry 提供了一个统一的API,使得开发者可以在不同的编程语言和框架中以一致的方式实现监控。

  2. 可扩展性:可以编写自己的扩展来满足个性化需要

  3. 跨平台:OpenTelemetry 支持多种编程语言,如 Java、Python、Go、.NET 等,以及多种云服务和容器平台。

  4. 社区驱动:作为一个开源项目,OpenTelemetry 由一个活跃的社区支持,社区成员贡献代码、文档和最佳实践。

  5. 与现有工具的兼容性:OpenTelemetry 设计时考虑了与现有监控工具的兼容性,如 Prometheus、Jaeger、Zipkin 等,这使得它可以轻松地集成到现有的监控基础设施中。

提供了一种名为:OTLP(OpenTelemetry Protocol)的通讯协议,基于 gRPC。

使用该协议用于客户端与 Collector 采集器进行交互。

Collector 是 OpenTelemetry 架构中的一个关键组件,它负责接收、处理和导出数据(Trace/log/metrics)。

b052e87393a8432ebdce87caf99ddfdc.png

它可以接受从客户端发出的数据进行处理,同时可以导出为不同格式的数据。

总的来说 OTel 是可观测系统的新标准,基于它可以兼容以前使用的 Prometheus、 victoriametrics、skywalking 等系统,同时还可以灵活扩展,不用与任何但一生态或技术栈进行绑定。

Popular git config options

e08078f69b7a7b48cb84dc00d008e0b8.png

本文总结了一些常用的 git 配置

  1. pull.ff onlypull.rebase true:这两个选项都可以避免在执行git pull时意外创建合并提交,特别是当上游分支已经发生了变化的时候。

  2. merge.conflictstyle diff3:这个选项使得合并冲突更易于阅读,通过在冲突中显示原始代码版本,帮助用户更好地解决冲突。

  3. rebase.autosquash truerebase.autostash true:这些选项使得修改旧提交变得更容易,并且自动处理stash。

  4. push.default simplepush.default current:这些选项告诉git push自动推送当前分支到同名的远程分支。

  5. init.defaultBranch main:创建新仓库时,默认创建main分支而不是master分支。

  6. commit.verbose true:在提交时显示整个提交差异。

  7. rerere.enabled true:启用rerere功能,自动解决冲突

  8. help.autocorrect:设置自动矫正的级别,以自动运行建议的命令。

  9. core.pager delta:设置Git使用的分页器,例如使用delta来查看带有语法高亮的diff。

  10. diff.algorithm histogram:设置Git的diff算法,以改善函数重排时的diff显示。

文章链接:

  • https://grafana.com/blog/2024/02/09/how-i-write-http-services-in-go-after-13-years/

  • https://codeboten.medium.com/what-is-opentelemetry-6a7e5c6901c5

  • https://jvns.ca/blog/2024/02/16/popular-git-config-options/

往期推荐

【译】Apache Pulsar 3.2.0 发布

我的 2023

手把手教你为开源项目贡献代码

得物云原生全链路追踪Trace2.0架构实践

ccb79a6cd13b612b92914eede35708bd.gif

点分享

0e2d462e2444ebc890c95d3c084bde56.gif

点收藏

90d4ad3d384931eb177d178de49e2e4d.gif

点点赞

da22917d5e67552ba9886c9ba970908d.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/505656.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第19章-IPv6基础

1. IPv4的缺陷 2. IPv6的优势 3. 地址格式 3.1 格式 3.2 长度 4. 地址书写压缩 4.1 段内前导0压缩 4.2 全0段压缩 4.3 例子1 4.4 例子 5. 网段划分 5.1 前缀 5.2 接口标识符 5.3 前缀长度 5.4 地址规模分类 6. 地址分类 6.1 单播地址 6.2 组播地址 6.3 任播地址 6.4 例子 …

计算机网络(4)----局域网与广域网

目录 1.局域网 (1)局域网拓扑结构 (2)局域网的传输介质 (3)局域网介质访问控制方法 (4)局域网的分类 (5)IEEE 802标准 (6)MAC子层与LLC子层 (7)常用的局域网技术---以太网 (8)以太网传输介质与拓扑结构的发展 (9)常用的以太网---10BASE-T以太网 (10)适配器与MAC地址…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告,笔者利用周末休息时间也研究了一下,就算是做一个笔记了,分享给大家一起学习下,目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

在github的README.md中插入视频;在github的README.md中添加gif演示动画

最近需要再github中上传项目的源代码,应导师的要求,需要再README中加入对实验视频的展示,但是github的README.md其实就是一个markdown文件,据我的理解这个文件里应该无法直接插入视频吧?(如果后续有办法直接…

BUGKU 网站被黑

打开环境,什么都没发现,使用蚁剑扫描一下,发现shell.php,打开 使用BP抓包,进行爆破 得到密码:hack 进去得到flag

嵌入式中汇编语言的基本实现

大家好,今天给大家分享,GNU汇编的语法。 第一:汇编简介 GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成, 每行一条语句,每条语句有三个可选部分,如下…

Python爬虫Cookies 池的搭建

Cookies 池的搭建 很多时候,在爬取没有登录的情况下,我们也可以访问一部分页面或请求一些接口,因为毕竟网站本身需要做 SEO,不会对所有页面都设置登录限制。 但是,不登录直接爬取会有一些弊端,弊端主要有…

【分布式websocket】RocketMQ发送消息保证消息最终一致性需要做哪些处理?【第15期】

前言 发送消息的逻辑在发给mq后消息链路就直接结束了。那么消息在mq收到后我们该如何保证后面消息一定能存储呢?执行业务逻辑出错了怎么办呢?当然这期只是IM特定场景下的一致性哈,不是分布式事务哈,有点小区别?使用MQ…

linux系统Jenkins工具流水线项目发布

流水线发布 pipline语法介绍阶段指令 创建流水线项目流水线脚本基础框架 pipline语法介绍 声明式的pipeline语法格式 1. 所有的声明都必须包含在pipeline{}中 2. 块只能有节段,指令,步骤或者赋值语句组成 3. 阶段:agent,stages&a…

手动实现一个简单的 HTTP 请求

本文我们通过 Socket,写一个 HTTP 协议,直观的感受一下上篇文章中的请求和响应。 定义 socket server 通过上篇文章,我们知道 HTTP 协议底层是通过 Socket 实现的,所以我们先通过 socket 定义一个 server import socket#初始化 …

如何将一个远程git的所有分支推到另一个远程分支上

如何将一个远程git的所有分支推到另一个远程分支上 最初有 12 个分支 执行 git remote add 远程名 远程git地址 git push 远程名 --tags "refs/remotes/origin/*:refs/heads/*"之后就变成 26个分支

STM32单片机示例:ETH_DP83848_DHCP_NonOS_Poll_F407

文章目录 目的基础说明主要配置关键代码示例演示示例链接关于中断总结 目的 以太网是比较常用到的功能,这篇文章讲演示在STM32F407上启用以太网功能,使之能够加入网络中,通过DHCP获得IP地址,可以被Ping通。 基础说明 STM32F407…