콘텐츠로 이동

v1.10.2

릴리스 날짜: 2026-05-31 - GitHub Release

MCP: tool handler용 선택적 HTTP 요청 메타데이터 전달 (#5550)

섹션 제목: “MCP: tool handler용 선택적 HTTP 요청 메타데이터 전달 (#5550)”

MCP server에 WithRequestMetadataExtractor 옵션이 추가되었습니다. 이 옵션을 설정하면 HTTP 요청 메타데이터(header, query parameter, path variable)가 추출되어 각 handler의 context.Context에 주입됩니다. handler는 제공되는 context helper로 값을 읽을 수 있습니다.

server := mcp.NewMcpServer(conf, mcp.WithRequestMetadataExtractor(mcp.DefaultRequestMetadataExtractor))
server.AddTool(tool, func(ctx context.Context, req *mcp.ServerRequest) (*mcp.ToolResult, error) {
tenantID, _ := mcp.HeaderFromContext(ctx, "X-Tenant-ID")
userID, _ := mcp.QueryFromContext(ctx, "user_id")
// ...
})

사용 가능한 helper는 RequestMetadataFromContext, HeaderFromContext, QueryFromContext, PathFromContext입니다. 기존 NewMcpServer(c) 호출에는 영향을 주지 않으므로 완전히 하위 호환됩니다.

Go 1.26은 RFC 3986 URI parsing을 엄격히 적용하여 URI authority component의 쉼표로 구분된 host를 거부합니다. 이전 BuildDiscovTargetetcd://host1:2379,host2:2379/key 형식의 URI를 생성했으며, 이로 인해 여러 endpoint를 사용하는 etcd 서비스 탐색 기반 gRPC service가 Go 1.26 이상에서 동작하지 않았습니다.

etcd target URL은 이제 host를 path에, etcd key를 query parameter에 넣습니다.

# 이전 형식(Go 1.26에서 동작하지 않음):
etcd://host1:2379,host2:2379/my-service-key
# 변경 후(RFC 3986 준수, 모든 Go 버전에서 동작):
etcd:///host1:2379,host2:2379?key=my-service-key

discov: 중복 etcd PUT event의 무제한 메모리 증가 (#5580)

섹션 제목: “discov: 중복 etcd PUT event의 무제한 메모리 증가 (#5580)”

장기간 실행되는 zRPC service에서 메모리가 계속 증가하던 두 가지 문제를 수정했습니다.

  • 중복 OnAdd 호출: handleWatchEvents는 lease refresh나 watch reconnect처럼 값이 바뀌지 않은 경우에도 모든 etcd PUT event에서 OnAdd를 호출했습니다. 이제 중복 PUT을 건너뛰고, 값이 변경되면 listener 상태를 일관되게 유지하도록 OnDelete(old) 다음에 OnAdd(new)를 호출합니다.
  • addKv의 무제한 slice 증가: key를 내부 container.values slice에 무조건 추가하여 하나의 etcd key가 수천 개의 중복 항목을 쌓을 수 있었습니다. addKv는 이제 완전히 중복된 항목을 즉시 건너뛰고 key가 새 server address로 이동하면 오래된 항목을 정리합니다.

전체 변경 로그: https://github.com/zeromicro/go-zero/compare/v1.10.1…v1.10.2