Migrating from v5 to v6
v6 is a small, mechanical upgrade. The bulk of it is the Go module path; the behavioral changes are two, both with a one-line fix.
1. Module path: go-micro.dev/v6
Go puts the major version in the import path, so every import changes:
// before
import "go-micro.dev/v5"
import "go-micro.dev/v5/server"
// after
import "go-micro.dev/v6"
import "go-micro.dev/v6/server"
A repo-wide find/replace does it:
grep -rl 'go-micro.dev/v5' --include='*.go' . \
| xargs sed -i 's|go-micro.dev/v5|go-micro.dev/v6|g'
go mod tidy
Update the CLI too:
go install go-micro.dev/v6/cmd/micro@latest
2. TLS is verified by default
In v5, TLS certificate verification was off by default (you opted in with
MICRO_TLS_SECURE=true). In v6 it is on by default — the safe choice now
that an agent, not just a human on a trusted network, can reach an endpoint.
- Production: nothing to do. Verification is on.
MICRO_TLS_SECUREis gone — remove it; it’s the default now.- Self-signed certs (local/dev): opt out with
MICRO_TLS_INSECURE=true, or calltls.InsecureConfig()directly.
3. NewService is the service constructor
The service constructor is now symmetric with NewAgent and NewFlow:
service := micro.NewService("greeter", micro.Address(":8080"))
agent := micro.NewAgent("task-mgr", micro.AgentServices("task"))
flow := micro.NewFlow("onboard", micro.FlowTrigger("events.user.created"))
micro.New("greeter", ...)still works as a deprecated alias — no rush, but preferNewService.- The old name-less form
micro.NewService(micro.Name("greeter"), ...)is removed; pass the name positionally:micro.NewService("greeter", ...).
Generated services already use NewService — re-running micro new or
micro run --prompt emits the v6 form.
That’s it
No other API changed. Agents, services, flows, the registry/broker/store
interfaces, MCP, A2A, and x402 all work as they did — just under
go-micro.dev/v6 and secure by default.
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.