基于GRPC结合Consul实现微服务调用
1 )环境准备
- 基于 go workspace 准备3个包: protos,server, client
- 新建 demo目录,其内部结构如下
├── protos │ ├── go.mod │ └── users │ ├── users.proto │ ├── users.pb.go │ └── users_grpc.pb.go ├── server │ ├── go.mod │ └── main.go ├── client │ ├── go.mod │ └── main.go └── go.work
- 这里可以看出是对用户操作的业务场景
- 其实目前无关业务场景,用一个简单的示例来演示grpc和consul的结合
- 这里可以看到,已经初始化了每个包,同时也基于 go work 处理了3个包之前可以调用的关系
- 这里不再过多阐述,参考之前的博文
- 启动 consul, $
consul agent -dev
2 )准备 protos
- 由上面的目录设计可知,需要 users.proto
syntax="proto3"; option go_package="./users"; service Users { rpc AddUser(AddUserReq) returns (AddUserRes); rpc GetUser(GetUserReq) returns (GetUserRes); } message UsersModel { string name = 1; int32 age = 2; } message AddUserReq { UsersModel user = 1; } message AddUserRes { string message = 1; bool success = 2; } message GetUserReq { } message GetUserRes { repeated UsersModel userList =1 ; }
- 进入 demo/protos/users 目录生成 users.pb.go,users_grpc.pb.go
- 执行
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./users.proto
- 执行
3 )处理 server
-
新建 demo/server/main.go
package main import ( "context" "fmt" "protos/users" "net" "strconv" "google.golang.org/grpc" "github.com/hashicorp/consul/api" ) // 定义通用度变量 var ( host string = "127.0.0.1" port int = 9000 portStr string = strconv.Itoa(port) address = host + ":" + portStr ) type Users struct { users.UnimplementedUsersServer } func (g Users) AddUser(c context.Context, req *users.AddUserReq) (*users.AddUserRes, er