mrkeyoor.com_
Tue 01 Sept 17:21 UTC
Webevaluationupdated 30 Aug 2026

go-zero review

go-zero is a Go framework for HTTP APIs and RPC services, paired with the `goctl` code generator. It turns a project-specific API description into server and client code, and supplies middleware for timeouts, rate limits, load shedding, circuit breaking, service discovery, tracing, caching, and metrics.

+8 / 1dstars / 7d
Verdict

Our go-zero run installed 230 packages and built in 131 seconds, but 3 of 147 tests failed, so the measured commit does not earn a clean source-health result. Use it when your team wants one Go microservice convention, generated code, and built-in failure controls across many services. For a small HTTP API or an OpenAPI-first organization, the framework's private schema and broad surface are likely more commitment than help.

We ran it

Lab card: what happened when we ran go-zeroScreenshot of go-zero (go-zero.dev)
Install✓ · 48s230 packages
Build✓ · 131s
Tests✗ · 108s144 passed · 3 failed of 147 (go test)
Repo1375 files~156,575 lines of source · 20.4 MB · 6 CI workflows

Answers from our run

Does go-zero build from source?

Dependencies installed in 48 seconds (230 packages), and the build succeeded in 131 seconds. We cloned commit 411181e into a clean Debian container with 3 CPUs and no project-specific setup.

Do go-zero's tests pass?

Not all of them: 144 of 147 passed and 3 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use go-zero?

Teams standardized on OpenAPI as the source definition: go-zero uses its own .api syntax, and issue 5309 asks for native OpenAPI-to-API generation.

What are the alternatives to go-zero?

Kratos, Go kit, Hertz. Our go-zero run installed 230 packages and built in 131 seconds, but 3 of 147 tests failed, so the measured commit does not earn a clean source-health result.

Setup3/5Build passed, but 3 of 147 tests failed after 108 seconds
Docs4/5Quick start is concrete; deeper behavior can require source reading
Community5/533,290 stars and an August 30 push with active issues
Maturity4/5v1.10.3 is active, though our suite had 3 failures

Discussed on

  1. hnShow HN: A microservice framework, listed in CNCF Landscape, 1 year 10k+ stars65 points
  2. hnShow HN: Go-zero (a cloud-native microservice framework) is now two years old4 points
  3. hnGo-zero v1.3.0 is released – a simple Go microservice framework4 points
  4. hnGo-zero: A cloud-native Go microservices framework with CLI tool3 points

Who it’s for

Go teams building several HTTP and gRPC services under one set of conventions.
Organizations that want generated handlers, types, configuration, and clients from an API file.
Backend groups willing to adopt go-zero's project layout and goctl workflow.
Services that need failure controls and observability hooks supplied by the framework.

Who it’s NOT for

Teams standardized on OpenAPI as the source definition: go-zero uses its own .api syntax, and issue 5309 asks for native OpenAPI-to-API generation.
Projects that need generated Dart clients with embedded structs today: issue 4777 reports a goctl api dart template failure for that case.
Small services whose developers prefer plain net/http plus selected middleware: go-zero brings 230 installed packages and a large framework surface.
Buyers who require a clean upstream suite on the measured commit: our run had 144 passing tests and 3 failures, while the supplied log tail did not name the failed cases.
Teams unwilling to inspect framework internals when documentation runs out: issue 4716 cites hard-coded HTTP parsing and error-response behavior that the reporter found in source.

Setup reality

Our sandbox installed 230 Go packages in 48 seconds and built successfully in 131 seconds. Tests failed with exit 1 after 108 seconds: 144 passed and 3 failed of 147. The supplied tail shows several zrpc packages passing, then only the aggregate FAIL, so it does not establish which tests failed or why.

The basic HTTP example needs Go and the separate goctl binary, then writes a YAML configuration and listens on port 8888. Real services may add MySQL, Redis, service discovery, tracing, and deployment credentials according to the generated service context and chosen integrations.

Adoption means accepting .api files, generated directories, and framework middleware choices. There is no root Dockerfile in our scan. The README links separate AI context, skills, and MCP projects; those are extra repositories, not capabilities proven by this build.

go-zero joins API generation with service middleware

go-zero is both a web and RPC framework and a way of organizing services. Its goctl tool reads a .api definition and generates the Go server entry point, configuration type, routes, handlers, logic files, service context, and request and response types. It can also generate clients for iOS, Android, Kotlin, Dart, TypeScript, and JavaScript according to the README.

The runtime side bundles timeout propagation, concurrency limits, rate limiting, circuit breaking, load shedding, request validation, caching, service discovery, load balancing, tracing, metrics, and monitoring hooks. That saves integration work when a company wants the same rules across many services. It also places more behavior inside the framework, which can make an unfamiliar failure harder to trace than a small net/http stack.

A generated service starts on port 8888

The quick start installs goctl, creates a greet.api file, and generates a service directory from it. The generated YAML controls the service, which listens on port 8888 in the example. Business dependencies such as MySQL or Redis are passed through the generated service context. The handler calls logic code rather than asking users to write route and parsing boilerplate by hand.

This approach works best when the .api file is accepted as a source of truth. Open issue 5309 asks why go-zero cannot generate that file from OpenAPI, arguing that a private syntax can block adoption. That concern is specific and fair: an organization with an existing OpenAPI review, documentation, and client pipeline would either duplicate definitions or build a conversion step.

What happened when we ran it

Our sandbox installed 230 Go packages in 48 seconds at commit 411181e. The checkout had 1,375 files, about 156,575 lines of source, and occupied 20.4 MB. Building succeeded in 131 seconds. The dependency and build results show that the repository compiles in the stated Go 1.24 Bookworm container without extra service credentials.

Tests ran for 108 seconds and exited with code 1. The harness counted 144 passed and 3 failed out of 147. The supplied end of the log lists successful packages under zrpc, including authentication, balancing, interceptors, and resolver packages, followed by the aggregate word FAIL. It does not include the names or errors of the 3 failed cases, so attributing a cause would be guesswork.

Our scan found 6 CI workflow files, no Dockerfile, and no separate tests directory. Go projects commonly keep test files beside the code, so that directory result does not conflict with 147 test outcomes. The useful conclusion is narrower: installation and compilation passed, but the complete command the lab ran did not. A buyer should reproduce those failures on the target operating system before choosing a workaround.

The framework makes resilience choices on your behalf

Timeouts, rate limits, circuit breakers, and load shedding are valuable only when their defaults match a service's traffic and failure modes. The README advertises adaptive behavior with little configuration. That is convenient for a first service, but production owners still need to know which requests are rejected, how thresholds move, what metrics expose the decision, and how retries interact with downstream timeouts.

Release v1.10.3 includes a Redis circuit-breaker fix for high concurrency and incompatible servers, which shows that these mechanisms continue to change. It also adds a consumer-group ID operation and fixes pointer-to-slice mapping, substring boundaries, and queue growth. Pinning the framework and reviewing release notes matters because a middleware change can alter behavior across every generated service.

Code generation saves typing and creates a contract

Generated files give teams a repeatable directory and keep request validation close to the API definition. The benefit grows when many services share the same conventions. The cost appears when a generator cannot express a case. Issue 4777 reports that Dart generation fails when a response embeds a common struct, with the template unable to find a property name. The report concerns that shape, not all Dart output.

Issue 5721 reports another boundary in v1.10.2: httpx.Parse rejected an interface{} field whose JSON value could be a string or number, while direct encoding/json decoding worked. That example tells adopters to test polymorphic request bodies, custom error responses, field tags, and generated clients before committing an API contract. Generated code removes repetition; it does not remove schema edge cases.

Documentation covers the path, but not every hidden decision

The English README provides installation, a complete small service, generated file layout, configuration, execution, and a curl request. English is the primary page, with Chinese and Korean translations linked. Longer examples and a separate documentation site cover multi-service work. A competent Go developer can get from an API definition to a running handler without reverse-engineering the first step.

Issue 4716 describes the harder phase of maintaining an older go-zero service. The reporter cites an 8 MB request-body parsing limit and default HTTP error behavior discovered in source rather than documentation. The issue is labeled stale and represents one user's experience, but the named examples are useful evaluation targets. Check limits, error formats, middleware order, and configuration overrides before standardizing a platform.

Same-day code activity outweighs the failed lab suite

GitHub recorded 33,290 stars, 259 combined open issues and pull requests, and a last push on August 30, 2026. Release v1.10.3 was published on August 1, while open issues received updates through August 29. That combination shows current code and issue activity; it does not explain the 3 failures in our separate sandbox.

go-zero makes sense for a team that wants a firm service template more than library-level freedom. The successful 131-second build and broad generated structure support a serious trial, while the failed suite requires investigation before approval. Build one representative service with the hardest request schema, downstream dependency, and client target, then decide whether the conventions remove more work than they create.

Alternatives

ProjectWhat it isPick it when
Kratos gh↗A Go microservices framework with transport, configuration, discovery, and code-generation conventions.pick this instead when protobuf-led service definitions and the Kratos project structure fit your organization better.
Go kitA set of Go packages for composing microservices without one prescribed application layout.pick this instead when you want to assemble transports, endpoints, and middleware yourself rather than adopt generated scaffolding.
HertzA Go HTTP framework focused on web service routing, middleware, and protocol performance.pick this instead when HTTP is the main requirement and go-zero's RPC, discovery, and code-generation system would be excess structure.

What people are saying

  1. [github-trending] zeromicro/go-zero

Sources

  1. go-zero README
  2. go-zero v1.10.3 release
  3. OpenAPI generation request
  4. Dart embedded-struct generation report
  5. Mixed JSON value parsing report
  6. Documentation and maintenance report

More web reviews

axios · super-productivity · Graphite · fastify · tabler · ruffle · the whole board →