콘텐츠로 이동

v1.9.0

Enhanced 보안 위한 sensitive 데이터 로깅

What’s 새로운: 지원 위한 masking sensitive 데이터 에서 로그 출력 통해 implementing MaskSensitive() any 메서드 에서 데이터 타입.

빠른 시작:

package main
import "github.com/zeromicro/go-zero/core/logx"
// 정의합니다
type UserInfo struct {
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
}
// Implement, MaskSensitive 예시입니다
func (u UserInfo) MaskSensitive() any {
return UserInfo{
Username: u.Username,
Password: "***", // Mask 예시입니다
Email: maskEmail(u.Email), // Partially 예시입니다
}
}
func maskEmail(email string) string {
parts := strings.Split(email, "@")
if len(parts) != 2 {
return "***"
}
return parts[0][:1] + "***@" + parts[1]
}
func main() {
user := UserInfo{
Username: "john",
Password: "secret123",
Email: "john@example.com",
}
// MaskSensitive 예시입니다
logx.Infow("User login", logx.Field("user", user))
// 출력 예시입니다
}

Improved 데이터베이스 필드 handling 사용하여 skip tags

What’s 새로운: 지원 위한 - 필드 tag 로 skip 필드 during 데이터베이스 operations.

빠른 시작:

type User struct {
ID int64 `db:"id"`
Name string `db:"name"`
Password string `db:"-"` // 예시입니다
Internal string `db:"-"` // 예시입니다
Email string `db:"email"`
}
// 예시입니다
var user User
err := sqlx.QueryRow(&user, "SELECT id, name, email FROM users WHERE id = ?", 1)

Modern MongoDB integration 사용하여 improved 성능

마이그레이션 가이드:

// Old way (v1 - now in zero-contrib)
import "github.com/zeromicro/zero-contrib/stores/mongo"
// New way (v2 - built-in)
import "github.com/zeromicro/go-zero/core/stores/mongo"
func main() {
// New, API 예시입니다
client := mongo.MustNewModel("mongodb:// 예시입니다
// Enhanced 예시입니다
var users []User
err := client.Find(context.Background(), &users, bson.M{"status": "active"})
}

4. Generic TypedSet 사용하여 2x 성능

섹션 제목: “4. Generic TypedSet 사용하여 2x 성능”

High-performance generic set implementation

What’s 새로운: Generic TypedSet 사용하여 compile-time safety과 2x 성능 improvement.

빠른 시작:

import "github.com/zeromicro/go-zero/core/collection"
func main() {
// 생성합니다
stringSet := collection.NewTypedSet[string]()
// Add items
stringSet.Add("user1", "user2", "user3")
// 확인합니다
if stringSet.Contains("user1") {
fmt.Println("User found!")
}
// Work 예시입니다
intSet := collection.NewTypedSet[int]()
intSet.Add(1, 2, 3)
// Set operations
union := stringSet.Union(otherStringSet)
intersection := stringSet.Intersect(otherStringSet)
}

5. Gateway Custom 미들웨어 (Onion 모델)

섹션 제목: “5. Gateway Custom 미들웨어 (Onion 모델)”

Flexible 미들웨어 아키텍처 위한 API gateways

What’s 새로운: 지원 위한 custom 미들웨어 사용하여 onion 모델 아키텍처 에서 API gateways.

빠른 시작:

import "github.com/zeromicro/go-zero/gateway"
// 정의합니다
func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Authentication 예시입니다
token := r.Header.Get("Authorization")
if !validateToken(token) {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next(w, r)
}
}
func rateLimitMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Rate 예시입니다
if !checkRateLimit(r.RemoteAddr) {
http.Error(w, "Rate limit exceeded", http.StatusTooManyRequests)
return
}
next(w, r)
}
}
// Configure 예시입니다
func main() {
gw := gateway.MustNewServer(gateway.GatewayConf{
Name: "api-gateway",
Port: 8080,
Upstreams: []gateway.Upstream{
{
Name: "user-service",
Mapping: "/api/users",
Target: "http://localhost:8081",
},
},
// Middleware 예시입니다
Middlewares: []gateway.Middleware{
rateLimitMiddleware, // Outer 예시입니다
authMiddleware, // Inner 예시입니다
},
})
gw.Start()
}

고급 Redis stream processing 사용하여 consumer groups

빠른 시작:

import "github.com/zeromicro/go-zero/core/stores/redis"
func main() {
rds := redis.MustNewRedis(redis.RedisConf{
Host: "localhost:6379",
})
// 생성합니다
err := rds.XGroupCreate("events", "processors", "0", true)
if err != nil {
log.Fatal(err)
}
// Consumer 예시입니다
go func() {
for {
// Read 예시입니다
streams, err := rds.XReadGroup(&redis.XReadGroupArgs{
Group: "processors",
Consumer: "worker-1",
Streams: []string{"events", ">"},
Count: 10,
Block: time.Second * 5,
})
if err != nil {
log.Printf("Error reading: %v", err)
continue
}
// Process 예시입니다
for _, stream := range streams {
for _, message := range stream.Messages {
processMessage(message)
// Acknowledge 예시입니다
rds.XAck("events", "processors", message.ID)
}
}
}
}()
}
func processMessage(msg redis.XMessage) {
fmt.Printf("Processing message %s: %v\n", msg.ID, msg.Values)
}

Improved flexibility 사용하여 unknown 필드 handling

Benefits:

  • Backward Compatibility: Older clients can send 요청 사용하여 deprecated 필드
  • Graceful Degradation: 서비스 continue 작동 despite 스키마 mismatches

예제:

// Service 예시입니다
type UserRequest struct {
Name string `json:"name"`
Email string `json:"email"`
}
// Client 예시입니다
{
"name": "John Doe",
"email": "john@example.com",
"deprecated_field": "old_value", // Ignored 예시입니다
"future_field": "new_value" // Ignored 예시입니다
}

Enhanced gRPC metadata forwarding 로 HTTP 헤더 에서 gateway

Benefits:

  • 전체 Metadata 전파: 모든 gRPC 헤더과 trailers are forwarded 로 HTTP clients
  • 추적 지원: 추적 IDs과 debugging information flow 통해 gateway
  • Seamless Integration: 작동합니다 사용하여 existing gateway configurations

빠른 시작:

// 백엔드 예시입니다
func (s *Service) SomeMethod(ctx context.Context, req *pb.Request) (*pb.Response, error) {
// 설정합니다
err := grpc.SendHeader(ctx, metadata.Pairs(
"X-Custom-Header", "custom-value",
"X-Trace-ID", "trace-12345",
))
if err != nil {
return nil, err
}
// 설정합니다
grpc.SetTrailer(ctx, metadata.Pairs(
"X-Server-Info", "grpc-backend-v1",
"X-Processing-Time", "150ms",
))
return &pb.Response{}, nil
}
// Frontend, HTTP 관련 코드
// X, Custom, Header 예시입니다
// X, Trace, ID 예시입니다
// X, Server, Info 예시입니다
// X-Processing-Time: 150ms

Resolved 서비스 디스커버리 reliability issues

Impact: Improved 서비스 디스커버리 reliability과 자동 recovery.

전에 vs 후에:

// Before, Manual 예시입니다
// After, Automatic 예시입니다
config := etcd.EtcdConf{
Hosts: []string{"localhost:2379"},
Key: "user.rpc",
// 자동 생성 코드
}

Fixed Server-Sent Events 타임아웃 handling

// SSE 예시입니다
server := &http.Server{
WriteTimeout: 10 * time.Second, // Won't affect SSE
}
// SSE 예시입니다
http.HandleFunc("/events", func(w http.ResponseWriter, r *http.Request) {
// SSE, WriteTimeout 예시입니다
sse.StreamEvents(w, r, eventSource)
})

Fixed 설정 loading 에서 환경 variables

Problem Fixed: Issues 사용하여 unmarshaling 환경 variables 위한 타입 time.Duration.

예제 Fix:

type Config struct {
Timeout time.Duration `json:",env=TIMEOUT"` // Now 예시입니다
}

4. 메모리 Optimization 위한 큰 요청

섹션 제목: “4. 메모리 Optimization 위한 큰 요청”

Reduced 메모리 usage 에서 detailed Request 로깅

Problem Fixed: 큰 메모리 consumption 때 로깅 POST Request details.


Fixed HTML escaping issues 에서 httpx 응답

전에:

{"message": "Hello \\u003cworld\\u003e"} // Incorrect 예시입니다

후에:

{"message": "Hello <world>"} // Correct 예시입니다

Fixed race conditions 에서 ImmutableResource

Problem Fixed: Concurrent 접근 로 ImmutableResource could lead 로 empty results.

Enhanced 로깅 성능 사용하여 structured 필드 handling.

Improvement: Faster 로그 processing 사용하여 reduced allocations.

Usage:

// Optimized 예시입니다
logx.Infow("User action",
logx.Field("user_id", userID),
logx.Field("action", "login"),
logx.Field("timestamp", time.Now()),
)
  1. 업데이트 의존성:
Terminal window
go get github.com/zeromicro/go-zero@v1.9.0
  1. MongoDB Driver:

    • 업데이트 imports 에서 zero-contrib 경우 사용하여 MongoDB v1
    • Consider migrating 로 v2 위한 better 성능
  2. Consumer Groups:

    • 업데이트 Redis stream processing 로 사용 새로운 consumer group APIs

Happy coding 사용하여 go-zero v1.9.0! 🎉