常用的 Git 配置,你知道几个?

开发 前端
OTel 是可观测系统的新标准,基于它可以兼容以前使用的 Prometheus、 victoriametrics、skywalking 等系统,同时还可以灵活扩展,不用与任何但一生态或技术栈进行绑定。
  1. 使用NewServer函数构建服务实例,利用依赖注入方式将所有的依赖参数包含进来。
func NewServer(
 logger *Logger
 config *Config
 commentStore *commentStore
 anotherStore *anotherStore
) http.Handler {
 mux := http.NewServeMux()
 addRoutes(
  mux,
  Logger,
  Config,
  commentStore,
  anotherStore,
 )
 var handler http.Handler = mux
 handler = 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 request
   logger.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 T
 if 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 T
 if 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 接口。

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

func handleTemplate(files string...) http.HandlerFunc {
 var (
  init    sync.Once
  tpl     *template.Template
  tplerr  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?

这是一篇 OTel 的科普文章

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

OpenTelemetry 整合 OpenTracing 和 OpenCensus。

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)。

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

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

Popular git config options

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

  1. pull.ff only 或 pull.rebase true:这两个选项都可以避免在执行git pull时意外创建合并提交,特别是当上游分支已经发生了变化的时候。
  2. merge.conflictstyle diff3:这个选项使得合并冲突更易于阅读,通过在冲突中显示原始代码版本,帮助用户更好地解决冲突。
  3. rebase.autosquash true 和 rebase.autostash true:这些选项使得修改旧提交变得更容易,并且自动处理stash。
  4. push.default simple 或 push.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显示。

文章链接:

责任编辑:武晓燕 来源: crossoverJie
相关推荐

2021-10-12 09:20:02

数据库SQL脚本

2023-10-31 08:23:54

网络命令Linux

2020-02-23 23:29:07

Python编程开发

2021-05-06 15:15:13

Python工具代码

2019-03-05 11:22:17

操作系统调度算法

2023-10-30 18:00:00

Docker命令开源平台

2022-01-07 08:23:38

k8s AnnotationNginx

2024-11-05 08:13:49

python视觉OpenCV

2023-04-11 08:49:42

排序函数SQL

2022-06-30 08:31:54

排序函数SQL

2023-05-17 12:33:11

AI人工智能

2021-11-04 11:54:30

Linux内存系统

2018-06-21 15:17:15

机器学习

2021-02-27 17:13:21

前端代码逻辑

2024-01-18 00:16:07

2023-11-30 07:37:49

MySQL函数

2021-10-14 06:52:47

算法校验码结构

2022-04-13 10:05:48

网关Flowable事件订阅

2022-06-04 08:29:27

awk命令BEGIN

2023-04-27 08:15:09

点赞
收藏

51CTO技术栈公众号