Skip to content

第三章 微服务框架(go-zero) 更新ing

第一部分 go-zero

一、简介

Go-zero 是一个集成了多种功能的 Go 微服务框架,旨在帮助开发者快速构建高性能、高可用的微服务应用。
其主要特点如下:

  1. 高性能:Go-zero 通过多种优化手段(如内存池、零拷贝等)来提升性能,适用于高并发场景。
  2. 高可用:内置了多种中间件和工具(如限流、熔断、重试等),提高了系统的稳定性和可用性。
  3. 易用性:提供了丰富的工具和脚手架,简化了微服务的开发流程。
  4. 模块化设计:各个功能模块独立,可根据需要进行组合和扩展。
  5. 支持多种协议:支持 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

一、http服务

二、grpc服务(Server)

三、grpc服务(Client)