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


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

    历史更新

    How I write HTTP services in Go after 13 years

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

    1. func NewServer(
    2.  logger *Logger
    3.  config *Config
    4.  commentStore *commentStore
    5.  anotherStore *anotherStore
    6. ) http.Handler {
    7.  mux := http.NewServeMux()
    8.  addRoutes(
    9.   mux,
    10.   Logger,
    11.   Config,
    12.   commentStore,
    13.   anotherStore,
    14.  )
    15.  var handler http.Handler = mux
    16.  handler = someMiddleware(handler)
    17.  handler = someMiddleware2(handler)
    18.  handler = someMiddleware3(handler)
    19.  return handler
    20. }
    1. 在routes.go文件中统一定义所有路由函数。

    1. func addRoutes(
    2.  mux                 *http.ServeMux,
    3.  logger              *logging.Logger,
    4.  config              Config,
    5.  tenantsStore        *TenantsStore,
    6.  commentsStore       *CommentsStore,
    7.  conversationService *ConversationService,
    8.  chatGPTService      *ChatGPTService,
    9.  authProxy           *authProxy
    10. ) {
    11.  mux.Handle("/api/v1/", handleTenantsGet(logger, tenantsStore))
    12.  mux.Handle("/oauth2/", handleOAuth2Proxy(logger, authProxy))
    13.  mux.HandleFunc("/healthz", handleHealthzPlease(logger))
    14.  mux.Handle("/", http.NotFoundHandler())
    15. }
    1. 主函数只调用run函数来运行服务

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

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

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

    1. // Validator is an object that can be validated.
    2. type Validator interface {
    3.  // Valid checks the object and returns any
    4.  // problems. If len(problems) == 0 then
    5.  // the object is valid.
    6.  Valid(ctx context.Context) (problems map[string]string)
    7. }
    8. func decodeValid[T Validator](r *http.Request) (T, map[string]stringerror) {
    9.  var v T
    10.  if err := json.NewDecoder(r.Body).Decode(&v); err != nil {
    11.   return v, nil, fmt.Errorf("decode json: %w", err)
    12.  }
    13.  if problems := v.Valid(r.Context()); len(problems) > 0 {
    14.   return v, problems, fmt.Errorf("invalid %T: %d problems", v, len(problems))
    15.  }
    16.  return v, nilnil
    17. }

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

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

    1. func handleTemplate(files string...) http.HandlerFunc {
    2.  var (
    3.   init    sync.Once
    4.   tpl     *template.Template
    5.   tplerr  error
    6.  )
    7.  return func(w http.ResponseWriter, r *http.Request) {
    8.   init.Do(func(){
    9.    tpl, tplerr = template.ParseFiles(files...)
    10.   })
    11.   if tplerr != nil {
    12.    http.Error(w, tplerr.Error(), http.StatusInternalServerError)
    13.    return
    14.   }
    15.   // use tpl
    16.  }
    17. }

    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

    点在看

  • 相关阅读:
    数据库MYSQL面试篇(1)
    部署K3s工作节点 --- 树莓派
    闪存 64TQFP CY8C6244AZI-S4D92 32 位双核微控制器
    js回调函数
    算法-堆结构和堆排序
    基于视频技术与AI检测算法的体育场馆远程视频智能化监控方案
    安卓期末大作业——图书信息管理系统
    主键、外键和索引的区别
    php以半小时为单位,输出指定的时间范围
    【Python】批量下载素材酷视频资源
  • 原文地址:https://blog.csdn.net/qq_18661793/article/details/136408858