micro
曾经最优秀的,最有前途的 Go 微服务框架。
但是后来发生了一些事...
框架的所有者是 Micro 公司,在 v3 的时候(2020 年下半年),他们决定更改项目定位。
公司运营一个云平台,叫做 m3o,专门提供 micro 项目托管,概念叫做 Micro as a Service。
新版本 micro/micro 目标由
微服务框架改成云原生平台,并且协议由 Apache License 2.0 变更成了 Polyform Shield License(我查了一下,这个协议大意是说如果使用者和所有者发生竞争,则授权取消)。
原项目 microhq/go-micro 进行归档,不再维护。
后来项目转给了他们公司 CTO 账户下 asim/go-micro ,继续维护。
再后来项目更名为 nitro (asim/nitro, gonitro/nitro),还搞了官网啥的。
再后来又放弃了,退回 asim/go-micro。
乱!
云原生就云原生,原有项目没有精力维护也没什么关系,做出这些决定一会儿一变,真是作得一批。
新协议更加是令人无语,杜绝竞争这一条就是堵住了所有商业使用的可能性(据说 nitro 时期也曾一度变更为 Polyform 协议)。
总之,我觉得这个框架要被玩死。
如果像我一样刚接触 Go 微服务,我觉得可以跳过 micro,或者仅用于学习参考。
gokit
A standard library for microservices.
https://github.com/go-kit/kit
它的定位和 micro 不一样,micro 是一个大而全的微服务框架,而 gokit 是一些在微服务中有用的工具,用于开发自己的框架。
国产项目
kratos
go-kratos 是一个基于 Go 语言的轻量级微服务开发框架,由 Bilibili 交给开源社区维护,采用 MIT 开源协议。项目致力于提供云原生应用开发所需的基础能力,帮助开发团队快速构建结构清晰、易于测试和维护的后端服务。
核心功能包括:HTTP/gRPC 双协议支持,通过 Protocol Buffers(Protobuf)定义 API 并生成代码;提供中间件机制,支持日志、认证、参数校验、链路追踪和指标监控;支持可插拔的配置管理、服务注册与发现,以及统一的错误处理机制。框架不强制绑定数据库、ORM 或特定基础设施,便于按需集成现有技术栈。
go-kratos 适合构建微服务、内部 API 服务及大型后端系统。项目还提供 kratos-layout 参考模板,包含分层架构、依赖注入和代码生成示例,可作为新项目的脚手架。需要注意的是,Kratos 主要解决服务端基础架构问题,并不直接提供完整的用户中心、权限管理或管理后台。
项目地址:github.com/go-kratos/kratos
Kratos 的设计核心是:框架提供统一接口和基础机制,具体基础设施通过标准库、独立 Go Module 或外部服务接入。它不是开箱即用的完整业务后台,也不会强制绑定数据库、缓存或注册中心。
| 功能模块 | 核心技术 / 依赖 | 实现方案 |
|---|---|---|
| HTTP 服务 | net/http、Kratos HTTP Transport |
封装 HTTP Server、路由、请求上下文和中间件 |
| gRPC 服务 | google.golang.org/grpc |
基于 gRPC Server、Interceptor 和 Protobuf 生成代码 |
| API 定义与代码生成 | Protobuf、protoc、protoc-gen-go、Kratos CLI |
先定义 .proto,再生成请求结构、客户端及服务端接口 |
| 依赖注入 | Google Wire(脚手架常用) | 在启动阶段组装 Repository、Service、Transport 等对象 |
| 日志 | Kratos Log 接口、Go log/slog |
统一日志接口,具体输出后端可以替换 |
| 请求校验 | Protobuf 校验规则、Validate Middleware | 根据请求结构执行参数校验,失败时返回统一错误 |
| 身份认证 | JWT Middleware(Contrib) | 校验 Token、提取身份信息;用户登录和 Token 签发由业务实现 |
| 授权 | Casbin | - |
| 权限控制 | Middleware、业务授权逻辑 | 在接口层进行访问控制;复杂 RBAC 需要自行集成授权组件 |
| 链路追踪 | OpenTelemetry | 通过 Middleware 传播 Trace Context,采集跨服务调用链 |
| 指标监控 | OpenTelemetry Metrics、Prometheus 等 | 采集请求数量、耗时、错误率等指标,并接入监控系统 |
| 配置管理 | Kratos Config、YAML 等 | 统一加载配置;远程配置通过独立适配模块(Apollo、etcd、Nacos、Consul)接入 |
| 服务注册与发现 | registry 接口、etcd / Consul / Nacos 等 |
实现注册、服务发现和实例变更监听 |
| 限流与熔断 | Kratos Middleware | 服务端限流、客户端熔断;分布式限流通常需要额外实现或集成 |
| 错误处理 | Kratos Errors、HTTP/gRPC 状态映射 | 统一错误码和错误信息,映射为协议对应的响应 |
| 编码与序列化 | JSON Codec、Protobuf | 统一请求和响应编码,可扩展其他 Codec |
| 数据持久化 | 自选 SQL 驱动、数据库或 ORM | Kratos 不内置业务 Repository,应用自行实现数据访问层 |
- Transport 层:HTTP / gRPC · Middleware · API 校验
- Service 层:业务逻辑 · 认证授权 · 错误处理
- Data / Repository 层:数据库 · 缓存 · 外部 API · 消息队列
- 基础设施:配置、日志、指标、链路追踪、服务发现
业务层依赖抽象接口,基础设施层负责具体实现,启动入口负责依赖组装:
type UserRepository interface {
Create(ctx context.Context, name string) error
}
// ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
// 用户业务逻辑
type UserService struct {
repo UserRepository
}
func NewUserService(repo UserRepository) *UserService {
return &UserService{repo: repo}
}
func (s *UserService) CreateUser(
ctx context.Context, name string,
) error {
return s.repo.Create(ctx, name)
}
// ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
type MySQLUserRepository struct {
db *sql.DB
}
func (r *MySQLUserRepository) Create(
ctx context.Context, name string,
) error {
_, err := r.db.ExecContext(
ctx,
"INSERT INTO users (name) VALUES (?)",
name,
)
return err
}
Jupiter
注意:这个项目 2024 年开始就不怎么活跃了。
Jupiter 是斗鱼开源的 Go 微服务治理框架,项目地址:douyu/jupiter。它不仅提供 HTTP、gRPC 等服务开发能力,更注重微服务在生产环境中的运行、监控与治理,适用于中大型后端系统和分布式业务平台。
Jupiter 的核心功能包括:服务通信与治理,支持 HTTP、gRPC、服务注册发现、负载均衡、限流、超时和重试等机制;可观测性,提供统一日志、指标采集、分布式链路追踪和错误处理能力;配置管理,支持配置驱动的组件初始化与运行时管理;开发工具链,提供项目脚手架、标准化项目模板和开发调试工具,降低项目搭建与维护成本。
其设计理念是以应用为中心,对常用第三方组件进行统一封装,减少基础设施差异对业务代码的影响,并将监控、配置和治理能力整合到应用运行时中。
适用场景: 需要统一技术栈、完善可观测性和服务治理能力的 Go 微服务体系。相比 Gin、Echo 等侧重 HTTP 请求处理的 Web 框架,Jupiter 的定位更偏向企业级微服务基础设施。代价是引入的组件和治理体系更多,轻量级单体应用未必需要完整采用。
go-zero
其作者在知乎上比较活跃:万俊峰Kevin, Title 是晓黑板 CTO。
go-zero 是一个基于 Go 语言开发的开源微服务框架,旨在帮助开发者快速构建高性能、高可用、易于维护的分布式系统。它提供 API 网关、RPC 服务、服务发现、负载均衡、限流熔断、超时控制、缓存、链路追踪等能力,覆盖微服务从开发到运行的主要环节。
go-zero 的核心特点是 API 定义驱动开发:开发者可以通过 .api 文件描述 HTTP 接口,并使用 goctl 自动生成路由、控制器、逻辑层及相关代码;对于 RPC 服务,则可通过 Protocol Buffers 定义接口并生成代码,减少重复劳动,统一项目结构。框架内置服务治理机制,能够降低分布式系统的开发与运维复杂度。
在架构设计上,go-zero 强调分层组织、依赖隔离和工程规范,适合构建用户服务、订单系统及其他业务微服务。相比轻量级 Web 框架 Gin,go-zero 提供了更完整的微服务基础设施;但对于简单的单体应用,其整体约束和学习成本也相对更高。
参考资料与拓展阅读
- polarisxu, 关于 Go 语言微服务框架 Micro 的一些情况说明
- Micro, FAQ