v1.9.0
🆕 새 기능
섹션 제목: “🆕 새 기능”1. 데이터 Masking 에서 로깅 (logx)
섹션 제목: “1. 데이터 Masking 에서 로깅 (logx)”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)) // 출력 예시입니다}2. 필드 Tag Skip 로직 에서 sqlx
섹션 제목: “2. 필드 Tag Skip 로직 에서 sqlx”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 Usererr := sqlx.QueryRow(&user, "SELECT id, name, email FROM users WHERE id = ?", 1)3. MongoDB Driver v2 업그레이드
섹션 제목: “3. MongoDB Driver v2 업그레이드”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()}6. Redis Consumer Groups
섹션 제목: “6. Redis Consumer Groups”고급 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)}7. Gateway Request Parsing Enhancement
섹션 제목: “7. Gateway Request Parsing Enhancement”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 예시입니다}8. Gateway gRPC Metadata Forwarding
섹션 제목: “8. Gateway gRPC Metadata Forwarding”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🐛 버그 수정
섹션 제목: “🐛 버그 수정”1. ETCD Auto-Registration Fix
섹션 제목: “1. ETCD Auto-Registration Fix”Resolved 서비스 디스커버리 reliability issues
Impact: Improved 서비스 디스커버리 reliability과 자동 recovery.
전에 vs 후에:
// Before, Manual 예시입니다// After, Automatic 예시입니다config := etcd.EtcdConf{ Hosts: []string{"localhost:2379"}, Key: "user.rpc", // 자동 생성 코드}2. SSE 타임아웃 설정
섹션 제목: “2. SSE 타임아웃 설정”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)})3. 환경 Variable Unmarshaling
섹션 제목: “3. 환경 Variable Unmarshaling”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.
5. JSON Serialization HTML Escaping
섹션 제목: “5. JSON Serialization HTML Escaping”Fixed HTML escaping issues 에서 httpx 응답
전에:
{"message": "Hello \\u003cworld\\u003e"} // Incorrect 예시입니다후에:
{"message": "Hello <world>"} // Correct 예시입니다6. Concurrent Resource 접근 Fix
섹션 제목: “6. Concurrent Resource 접근 Fix”Fixed race conditions 에서 ImmutableResource
Problem Fixed: Concurrent 접근 로 ImmutableResource could lead 로 empty results.
⚡ 성능 개선
섹션 제목: “⚡ 성능 개선”Optimized 필드 로깅
섹션 제목: “Optimized 필드 로깅”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()),)🎯 마이그레이션 가이드
섹션 제목: “🎯 마이그레이션 가이드”에서 v1.8.5 로 v1.9.0
섹션 제목: “에서 v1.8.5 로 v1.9.0”- 업데이트 의존성:
go get github.com/zeromicro/go-zero@v1.9.0-
MongoDB Driver:
- 업데이트 imports 에서 zero-contrib 경우 사용하여 MongoDB v1
- Consider migrating 로 v2 위한 better 성능
-
Consumer Groups:
- 업데이트 Redis stream processing 로 사용 새로운 consumer group APIs
🙏 새로운 기여자
섹션 제목: “🙏 새로운 기여자”- @Twilikiss - 문서화 improvements
- @charmfocus - sqlx 필드 tagging enhancement
- @csbzy - SSE 타임아웃 fix
- @DengY11 - Gateway 미들웨어 아키텍처
- @queryfast - 성능 optimizations
- @sunhao1296 - Concurrent resource fix
- @ipinak - 테스트 improvements
📚 Additional Resources
섹션 제목: “📚 Additional Resources”- 완전한 튜토리얼 Collection
- Code 예제 Repository
- 마이그레이션 가이드
- 모범 사례
🔗 Links
섹션 제목: “🔗 Links”- 전체 변경 로그: https://github.com/zeromicro/go-zero/compare/v1.8.5…v1.9.0
- 문서화: https://go-zero.dev/
- 커뮤니티: https://github.com/zeromicro/go-zero/discussions
Happy coding 사용하여 go-zero v1.9.0! 🎉