跳到內容

內建組件

先取得模組:go get github.com/yshengliao/gortexa@v0.27.0。以下片段皆對 v0.27.0 編譯驗證過。

NATS 系的 pluggable pub/sub。cfg.MQ.Drivernats(core、at-most-once)或 jetstream(durable、at-least-once、handler 須冪等)。group_id 空 = fan-out、非空 = load-balance。

import "github.com/yshengliao/gortexa/mq"
pub, sub, err := mq.New(cfg.MQ)
if err != nil {
return err
}
err = sub.Subscribe(ctx, "orders", func(ctx context.Context, m mq.Message) error {
return handle(m.Value)
})
err = pub.Publish(ctx, "orders", mq.Message{Value: []byte("hello")})

MessageKeyValueHeaders。也可直接用 mq.NewNATSmq.NewJetStream 指定 driver。

預設 process-local in-memory,cfg.Cache.Driver: redis 可換分散式後端。

import (
"errors"
"github.com/yshengliao/gortexa/cache"
)
c, err := cache.New(cfg.Cache)
if err != nil {
return err
}
defer c.Close()
if err := c.Set(ctx, "k", []byte("v"), time.Minute); err != nil {
return err
}
b, err := c.Get(ctx, "k")
if errors.Is(err, cache.ErrCacheMiss) {
// key 不存在
}

建立 PgBouncer-safe 的 pgx 連線池,並附一個發 OTel DB span 的 query tracer。回傳 *pgxpool.Pool

import (
"go.opentelemetry.io/otel"
"github.com/yshengliao/gortexa/storage"
)
tracer := storage.NewDBTracer(otel.GetTracerProvider())
pool, err := storage.NewPool(ctx, cfg.DB, tracer) // tracer 傳 nil 則不發 span
if err != nil {
return err
}
defer pool.Close()

已接好 OTel 儀表的對外 client 建構子。

import "github.com/yshengliao/gortexa/client"
conn, err := client.NewGRPCConn(client.GRPCClientConfig{Target: "svc:50051", Insecure: true})
if err != nil {
return err
}
defer conn.Close()
hc := client.NewHTTPClient(client.HTTPClientConfig{Timeout: 5 * time.Second}) // 零值預設 30s

Insecure: true 只適用本機開發;正式環境走 TLS。