golang高性能Web和RPC框架插件库go-zero的使用
golang高性能Web和RPC框架插件库go-zero的使用
什么是go-zero?
go-zero是一个集成了许多工程实践的Web和RPC框架。它旨在通过弹性设计确保繁忙服务的稳定性,多年来一直为数千万用户的站点提供服务。
go-zero的优势
- 提高了日活跃用户数达数千万的服务的稳定性
- 内置链式超时控制、并发控制、速率限制、自适应熔断器、自适应负载均衡,甚至无需配置
- 内置中间件也可以集成到您的框架中
- 简单的API语法,一个命令即可生成多种不同语言的代码
- 自动验证来自客户端的请求参数
- 大量内置的微服务管理和并发工具包
架构图
安装
在您的项目下运行以下命令:
go get -u github.com/zeromicro/go-zero
快速开始
1. 安装goctl
# 对于Go
go install github.com/zeromicro/go-zero/tools/goctl@latest
# 对于Mac
brew install goctl
# 适用于所有平台的docker
docker pull kevinwan/goctl
# 运行goctl
docker run --rm -it -v `pwd`:/app kevinwan/goctl --help
2. 创建API文件
创建一个名为greet.api
的文件:
type (
Request {
Name string `path:"name,options=[you,me]"` // 参数会自动验证
}
Response {
Message string `json:"message"`
}
)
service greet-api {
@handler GreetHandler
get /greet/from/:name(Request) returns (Response)
}
或者使用goctl生成.api文件:
goctl api -o greet.api
3. 生成Go服务器端代码
goctl api go -api greet.api -dir greet
生成的文件结构如下:
├── greet
│ ├── etc
│ │ └── greet-api.yaml // 配置文件
│ ├── greet.go // 主文件
│ └── internal
│ ├── config
│ │ └── config.go // 配置定义
│ ├── handler
│ │ ├── greethandler.go // 定义get/put/post/delete路由
│ │ └── routes.go // 路由列表
│ ├── logic
│ │ └── greetlogic.go // 可以在这里编写请求逻辑
│ ├── svc
│ │ └── servicecontext.go // 服务上下文,可以传入mysql/redis等
│ └── types
│ └── types.go // 定义请求/响应
└── greet.api // api描述文件
4. 运行代码
cd greet
go mod tidy
go run greet.go -f etc/greet-api.yaml
默认监听8888端口,可以通过配置文件修改。
5. 测试API
curl -i http://localhost:8888/greet/from/you
响应示例:
HTTP/1.1 200 OK
Date: Sun, 30 Aug 2020 15:32:35 GMT
Content-Length: 0
6. 编写业务逻辑代码
- 依赖项可以通过servicecontext.go传入逻辑中,如mysql、redis等
- 根据.api文件在logic包中添加逻辑代码
7. 从api文件生成其他语言代码
goctl api java -api greet.api -dir greet
goctl api dart -api greet.api -dir greet
...
性能基准测试
文档
云原生景观
go-zero已列入CNCF云原生景观。
更多关于golang高性能Web和RPC框架插件库go-zero的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高性能Web和RPC框架插件库go-zero的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-zero 高性能Web和RPC框架使用指南
go-zero 是一个集成了各种工程实践的 Web 和 RPC 框架,它具有高性能、易扩展、简单易用等特点。下面我将介绍 go-zero 的核心功能和使用方法,并提供相应的示例代码。
安装 go-zero
go get -u github.com/zeromicro/go-zero
快速创建API服务
1. 使用goctl工具创建项目
# 安装goctl工具
go install github.com/zeromicro/go-zero/tools/goctl@latest
# 创建API服务
goctl api new greet
cd greet
go mod tidy
2. 编写API定义文件
在 greet.api
文件中定义API:
type (
Request {
Name string `path:"name,options=you|me"`
}
Response {
Message string `json:"message"`
}
)
service greet-api {
@handler GreetHandler
get /from/:name (Request) returns (Response)
}
3. 生成代码
goctl api go -api greet.api -dir .
4. 修改业务逻辑
编辑 internal/logic/greetlogic.go
:
func (l *GreetLogic) Greet(req *types.Request) (*types.Response, error) {
return &types.Response{
Message: fmt.Sprintf("Hello, %s!", req.Name),
}, nil
}
5. 运行服务
go run greet.go
RPC服务开发
1. 创建RPC服务
goctl rpc new user
cd user
go mod tidy
2. 修改proto文件
编辑 user.proto
:
syntax = "proto3";
package user;
message UserRequest {
string id = 1;
}
message UserResponse {
string name = 1;
int32 age = 2;
}
service User {
rpc GetUser(UserRequest) returns (UserResponse);
}
3. 生成代码
goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
4. 实现业务逻辑
编辑 internal/logic/getuserlogic.go
:
func (l *GetUserLogic) GetUser(in *user.UserRequest) (*user.UserResponse, error) {
// 这里应该是从数据库或其他服务获取用户信息
return &user.UserResponse{
Name: "John Doe",
Age: 30,
}, nil
}
5. 运行RPC服务
go run user.go
数据库操作
go-zero 提供了强大的数据库操作支持,以下是使用示例:
1. 定义模型
# 从数据库生成模型
goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="user" -dir="./model"
2. 使用模型
// 查询示例
func (l *GetUserLogic) GetUser(in *user.UserRequest) (*user.UserResponse, error) {
u, err := l.svcCtx.UserModel.FindOne(l.ctx, in.Id)
if err != nil {
return nil, err
}
return &user.UserResponse{
Name: u.Name,
Age: u.Age,
}, nil
}
中间件使用
go-zero 支持中间件机制,可以方便地添加日志、鉴权等功能:
// 在main函数中添加中间件
func main() {
flag.Parse()
c := rest.RestConf{
Host: "0.0.0.0",
Port: 8888,
}
server := rest.MustNewServer(c)
defer server.Stop()
// 全局中间件
server.Use(func(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
logx.Info("request incoming")
next(w, r)
}
})
handler.RegisterHandlers(server, svcCtx)
fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
server.Start()
}
配置管理
go-zero 使用 yaml 文件进行配置管理:
Name: greet-api
Host: 0.0.0.0
Port: 8888
Log:
Mode: file
Path: ./logs
在代码中读取配置:
var configFile = flag.String("f", "etc/greet-api.yaml", "the config file")
func main() {
flag.Parse()
var c config.Config
conf.MustLoad(*configFile, &c)
// 使用配置...
}
性能优化
go-zero 内置了多种性能优化技术:
- 自适应降载:当系统负载过高时自动拒绝部分请求
- 自适应熔断:当依赖服务出现问题时自动熔断
- 缓存控制:内置缓存机制减少数据库访问
监控与链路追踪
go-zero 内置了 Prometheus 和 Jaeger 支持:
Prometheus:
Host: 0.0.0.0
Port: 9080
Path: /metrics
Telemetry:
Name: greet-api
Endpoint: http://jaeger:14268/api/traces
Sampler: 1.0
Batcher: jaeger
总结
go-zero 是一个功能强大且高性能的微服务框架,它提供了:
- 快速API开发
- 高性能RPC支持
- 完善的数据库操作
- 中间件机制
- 配置管理
- 监控和链路追踪
- 多种性能优化技术
通过上述示例,您可以快速上手 go-zero 开发高性能的 Web 和 RPC 服务。更多高级功能和最佳实践可以参考官方文档。