第三章 微服务框架(go-zero) 更新ing
第一部分 go-zero
一、简介
Go-zero 是一个集成了多种功能的 Go 微服务框架,旨在帮助开发者快速构建高性能、高可用的微服务应用。
其主要特点如下:
- 高性能:Go-zero 通过多种优化手段(如内存池、零拷贝等)来提升性能,适用于高并发场景。
- 高可用:内置了多种中间件和工具(如限流、熔断、重试等),提高了系统的稳定性和可用性。
- 易用性:提供了丰富的工具和脚手架,简化了微服务的开发流程。
- 模块化设计:各个功能模块独立,可根据需要进行组合和扩展。
- 支持多种协议:支持 HTTP、gRPC 等多种通信协议,满足不同场景的需求。
安装命令:
bash
go get -u github.com/zeromicro/go-zero
二、快速入门
1.http服务
go
func main() {
var restConf rest.RestConf
conf.MustLoad("hello/etc/hello-world.yaml", &restConf)
s, err := rest.NewServer(restConf)
if err != nil {
log.Fatal(err)
return
}
s.AddRoute(rest.Route{ // 添加路由
Method: http.MethodGet,
Path: "/hello/world",
Handler: func(writer http.ResponseWriter, request *http.Request) { // 处理函数
httpx.OkJson(writer, "Hello World!")
},
})
defer s.Stop()
s.Start() // 启动服务
}
yaml
Name: Hello.api
Host: 127.0.0.1
Port: 8080
2.grpc
Server(服务端):提供服务,处理业务逻辑,管理数据,确保安全和认证
准备工作
bash
# 创建 demo 服务目录
mkdir demo && cd demo
# go mod 初始化
go mod init demo
# 生成 greet.proto 文件
goctl rpc -o greet.proto
# 生成 pb.go 文件
protoc greet.proto --go_out=. --go-grpc_out=.
# 创建 server 目录
mkdir server && cd server
# 新增配置文件
mkdir etc && cd etc
touch greet-server.yaml
# 新增 server.go 文件
touch server.go
go
func main() {
var serverConf zrpc.RpcServerConf
conf.MustLoad("server/etc/greet-server.yaml", &serverConf)
s := zrpc.MustNewServer(serverConf, func(server *grpc.Server) {
greet.RegisterGreetServer(server, &exampleServer{})
})
defer s.Stop()
s.Start()
}
type exampleServer struct {
greet.UnimplementedGreetServer
}
func (e *exampleServer) Ping(ctx context.Context, request *greet.Request) (*greet.Response, error) {
return &greet.Response{Pong: request.Ping}, nil
}
yaml
Name: greet.rpc
ListenOn: 127.0.0.1:8080 # 监听地址
Client(客户端):发起请求,处理响应,用户交互,错误处理
准备工作
bash
# 创建 demo 服务目录
mkdir demo && cd demo
# go mod 初始化
go mod init demo
# 生成 greet.proto 文件
goctl rpc -o greet.proto
# 生成 pb.go 文件
protoc greet.proto --go_out=. --go-grpc_out=.
# 创建 client 目录
mkdir client && cd client
# 新增配置文件
mkdir etc && cd etc
touch greet-client.yaml
# 新增 client.go 文件
touch client.go
go
func main() {
var clientConf zrpc.RpcClientConf
conf.MustLoad("client/etc/greet-client.yaml", &clientConf) // 读取配置
conn := zrpc.MustNewClient(clientConf) // 根据配置创建连接
client := greet.NewGreetClient(conn.Conn()) // 创建客户端
resp, err := client.Ping(context.Background(), &greet.Request{Ping: "ping"}) // 调用远程服务
if err != nil {
log.Fatal(err)
return
}
log.Printf("%v", resp) // output: pong:"ping"
}
yaml
Target: 127.0.0.1:8080 # 目标端地址
创建Server和Client项目
bash
# 创建 demo 服务目录
mkdir demo && cd demo
# go mod 初始化
go mod init demo
# 生成 greet.proto 文件
goctl rpc -o greet.proto
# 生成 pb.go 文件
protoc greet.proto --go_out=. --go-grpc_out=.
# 创建 server 目录
mkdir server && cd server
# 新增 server.go 文件
touch server.go
# 新增配置文件
mkdir etc && cd etc
touch greet-server.yaml
# 回到 demo 服务目录
cd ../..
# 创建 client 目录
mkdir client && cd client
# 新增 client.go 文件
touch client.go
# 新增配置文件
mkdir etc && cd etc
touch greet-client.yaml
创建Http项目并进行grpc调用
go
type Request struct {
Name string `path:"name"`
}
func main() {
var restConf rest.RestConf
conf.MustLoad("service/etc/service.yaml", &restConf)
s, err := rest.NewServer(restConf)
if err != nil {
return
}
s.AddRoute(rest.Route{ // 添加路由
Method: http.MethodGet,
Path: "/ping/:name",
Handler: func(writer http.ResponseWriter, request *http.Request) { // 处理函数
var req Request
err := httpx.Parse(request, &req)
var clientConf zrpc.RpcClientConf
conf.MustLoad("client/etc/greet-client.yaml", &clientConf) // 读取Client配置
client := greet.NewGreetClient(zrpc.MustNewClient(clientConf).Conn()) // 创建客户端
resp, err := client.Ping(context.Background(), &greet.Request{Ping: req.Name}) // 调用远程服务
if err != nil {
httpx.Ok(writer)
}
httpx.OkJson(writer, resp)
},
})
defer s.Stop()
s.Start() // 启动服务
}
第二部分 goctl
用于生产代码与配置文件的命令行工具
安装命令:
bash
go install github.com/zeromicro/go-zero/tools/goctl@latest