18年初,晓黑板后端在经过频繁的宕机后,决定从Java+MongoDB的单体架构迁移到微服务架构,经过仔细思考和对比,我们决定:
对于微服务框架的设计,我们期望保障微服务稳定性的同时,也要特别注重研发效率。所以设计之初,我们就有如下一些准则:
我们经历不到半年时间,彻底完成了从Java+MongoDB到Golang+MySQL为主的微服务体系迁移,并于18年8月底完全上线,稳定保障了晓黑板后续增长,确保了整个服务的高可用。
go-zero是一个集成了各种工程实践的包含web和rpc框架,有如下主要特点:
如下图,我们从多个层面保障了整体服务的高可用:
go get -u github.com/tal-tech/go-zero
import "github.com/tal-tech/go-zero"
go build tools/goctl/goctl.go
把goctl放到$PATH的目录下,确保goctl可执行
goctl插件,支持api语法 type Request struct {
Name string `path:"name"`
}
type Response struct {
Message string `json:"message"`
}
service greet-api {
@server(
handler: GreetHandler
)
get /greet/from/:name(Request) returns (Response);
}
也可以通过goctl生成api模本文件,命令如下:
goctl api -o greet.api
goctl api go -api greet.api -dir greet
生成的文件结构如下:
.
├── greet
│ ├── etc
│ │ └── greet-api.json
│ ├── greet.go
│ └── internal
│ ├── config
│ │ └── config.go
│ ├── handler
│ │ ├── greethandler.go
│ │ └── routes.go
│ ├── logic
│ │ └── greetlogic.go
│ ├── svc
│ │ └── servicecontext.go
│ └── types
│ └── types.go
└── greet.api
8 directories, 9 files
生成的代码可以直接运行:
cd greet
go run greet.go -f etc/greet-api.json
可以根据api文件生成前端需要的Java, TypeScript, Dart, JavaScript代码。