技术阅读周刊第十四期:常用的 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.mzph.cn/news/715583.shtml

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

相关文章

探索Manticore Search:开源全文搜索引擎的强大功能

在当今信息爆炸的时代,数据的快速检索变得至关重要。无论是在电子商务网站、新闻门户还是企业内部文档,高效的搜索引擎都是确保用户满意度和工作效率的关键因素之一。而在搜索引擎领域,Manticore Search 作为一款开源的全文搜索引擎&#xff…

大模型(LLM)的量化技术Quantization原理学习

在自然语言处理领域,大型语言模型(LLM)在自然语言处理领域的应用越来越广泛。然而,随着模型规模的增大,计算和存储资源的需求也急剧增加。为了降低计算和存储开销,同时保持模型的性能,LLM大模型…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数(提供MATLAB代码)

一、鹦鹉优化算法 鹦鹉优化算法(Parrot optimizer,PO)由Junbo Lian等人于2024年提出的一种高效的元启发式算法,该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

c语言--qsort函数(详解)

目录 一、定义二、用qsort函数排序整型数据三、用qsort排序结构数据四、qsort函数的模拟实现 一、定义 二、用qsort函数排序整型数据 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

解决在 Mac 上安装 Adobe 软件弹出提示:安装包已经被损坏并且不能被打开。

问题&#xff1a; “INSTALLER” is damaged and can’t be opened. You should eject the disk image. 解决方法和步骤&#xff1a; 打开安装包&#xff1b;将安装包 “INSTALLER” 拖动复制到某个文件夹&#xff0c;复制后的文件路径例如像这样&#xff1a;/Users/michael…

LLC谐振变换器变频移相混合控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 基本控制原理 为了实现变换器较小的电压增益&#xff0c;同时又有较 高的效率&#xff0c;文中在变频控制的基础上加入移相控制&#xff0c; 在这种控制策略下&#xff0c;变换器通过调节一次侧开关管 的开关…

leetcode 热题 100_盛最多水的容器

题解一&#xff1a; 双指针遍历&#xff1a;容量计算公式为min(左高度&#xff0c;右高度)*底部距离&#xff0c;我们可以令底部距离逐步递减&#xff08;左右两边的指针向中部移动&#xff09;。此时对于min(左高度&#xff0c;右高度)&#xff0c;假设较高的线向中部移动&…

带你玩转数据结构-单链表(适合初学者的文章,讲解的很仔细哦)

前言: &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解数据结构中链表的知识,;链表的分类,c语言实现单链…

腾讯云幻兽帕鲁服务器使用Linux和Windows操作系统的具体性能比较是什么?

腾讯云幻兽帕鲁服务器使用Linux和Windows操作系统的具体性能比较是什么&#xff1f; 首先&#xff0c;从内核效率来看&#xff0c;Linux在同等硬件条件下的性能优于Windows。这是因为Linux内核设计简洁&#xff0c;对服务器工作负载进行了优化&#xff0c;能够更好地利用系统资…

Python学习 day07(JSON)

JSON 各种编程语言存储数据的容器不尽相同&#xff0c;在Python中有字典dict这样的数据类型&#xff0c;而其他语言可能没有对应的字典&#xff0c;为了让不同的语言都能够相互通用的传递数据&#xff0c;JSON就是一种非常良好的中转数据格式&#xff0c;如下&#xff1a; JSON…

mTSL: netty单向/双向TLS连接

创建证书 不管是单向tls还是双向tls(mTLS)&#xff0c;都需要创建证书。 创建证书可以使用openssl或者keytool&#xff0c;openssl 参考 mTLS: openssl创建CA证书 单向/双向tls需要使用到的相关文件: 文件单向tls双向tlsServer端Client端备注ca.key----需要保管好&#xff0…

【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections

sqli-labs-master 38-53 Stacked-Injections 其他关卡和靶场看专栏… 文章目录 sqli-labs-master 38-53 Stacked-Injections第三十八关-报错注入第三十九关-报错注入第四十关-盲注第四十一关-盲注第四十二关-联合报错双查询注入第四十三关-报错注入第四十四关-盲注第四十五关-…

「爬虫职海录」三镇爬虫

HI&#xff0c;朋友们好 「爬虫职海录」第三期更新啦&#xff01; 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主&#xff0c;方便大家了解一下当下的市场行情。 本栏目持续更新&#xff0c;暂定收集国内主要城市的爬虫岗位相关招聘信息&#xff0c;有求职…

【高级数据结构】Trie树

原理 介绍 高效地存储和查询字符串的数据结构。所以其重点在于&#xff1a;存储、查询两个操作。 存储操作 示例和图片来自&#xff1a;https://blog.csdn.net/qq_42024195/article/details/88364485 假设有这么几个字符串&#xff1a;b&#xff0c;abc&#xff0c;abd&…

Vue中如何实现条件渲染?

在Vue中实现条件渲染非常简单且灵活&#xff0c;主要通过Vue的指令来实现。在Vue中&#xff0c;我们可以使用v-if和v-else指令来根据条件来渲染不同的内容。下面就让我们通过一个简单的示例来演示如何在Vue中实现条件渲染&#xff1a; <!DOCTYPE html> <html lang&qu…

GO泛型相关

通过引入 类型形参 和 类型实参 这两个概念&#xff0c;我们让一个函数获得了处理多种不同类型数据的能力&#xff0c;这种编程方式被称为 泛型编程。 2. Go的泛型 类型形参 (Type parameter)类型实参(Type argument)类型形参列表( Type parameter list)类型约束(Type constr…

Pake 轻松构建轻量级多端桌面应用

Pake 利用 Rust 轻松构建轻量级多端桌面应用&#xff0c;支持 Mac / Windows / Linux。 小白用户&#xff1a;可以使用 「常用包下载」 方式来体验 Pake 的能力&#xff0c;也可试试 Action 方式。 开发用户&#xff1a;可以使用 「命令行一键打包」&#xff0c;对 Mac 比较友…

Matlab 机器人工具箱 动力学

文章目录 R.dynR.fdynR.accelR.rneR.gravloadR.inertiaR.coriolisR.payload官网:Robotics Toolbox - Peter Corke R.dyn 查看动力学参数 mdl_puma560; p560.dyn;%查看puma560机械臂所有连杆的动力学参数 p560.dyn(2);%查看puma560机械臂第二连杆的动力学参数 p560.links(2)…

react父子组件传参demo

父组件代码 /* eslint-disable next/next/no-img-element */ "use client"; import React, { useEffect, useState } from "react"; import WxTip from ../components/WxTipconst Download () > {const [showTip, setshowTip] useState<boolean…

javaweb day9 day10

昨天序号标错了 vue的组件库Elent 快速入门 写法 常见组件 复制粘贴 打包部署