概述
- 现在,我们使用consul客户端的api来把GRPC服务实现注册到consul上,非Go-Micro的形式
- 其实,consul官方提供了对应的接口调用来实现,golang中的consul/api包对其进行了封装
- 我们使用consul/api来进行展示
目录结构
gitee.com/go-micro-services/consul-grpc├── protos│ └── users│ ├── users.proto│ ├── users.pb.go│ └── users_grpc.pb.go├── main.go└── go.mod
1 ) protos 相关
- 这里,protos 相关,参考之前的文章:https://blog.csdn.net/Tyro_java/article/details/136632015
2 )main.go
package mainimport ("context""fmt""net""strconv""gitee.com/go-micro-services/consul-grpc/protos/users""github.com/hashicorp/consul/api""google.golang.org/grpc""google.golang.org/grpc/health""google.golang.org/grpc/health/grpc_health_v1"
)// 定义通用度变量, 这里以后可以做成配置,仅做简单举例
var (host string = "127.0.0.1"port int = 9000portStr string = strconv.Itoa(port)address = host + ":" + portStr
)type Users struct {users.UnimplementedUsersServer
}func (g Users) AddUser(c context.Context, req *users.AddUserReq) (*users.AddUserRes, error) {fmt.Println(req)return &users.AddUserRes{Success: true,Message: "增加用户成功",}, nil
}func (g Users) GetUser(c context.Context, req *users.GetUserReq) (*users.GetUserRes, error) {var tempList []*users.UsersModelfor i := 0; i < 10; i++ {tempList = append(tempList, &users.UsersModel{Name: "商品" + strconv.Itoa(i),Age: int32(i),})}return &users.GetUserRes{UserList: tempList,}, nil
}func main() {// ----------------------- 1. 注册consul服务 -----------------------// 1、初始化consul配置consulConfig := api.DefaultConfig()consulConfig.Address = "127.0.0.1:8500" // consul服务的默认地址可省略,如果不是本机,需要补充// 2、获取consul操作对象consulClient, _ := api.NewClient(consulConfig)// 3、配置注册服务的参数agentService := api.AgentServiceRegistration{ID: "uuu-1", // 不要重复Tags: []string{"test"},Name: "Users-Service",Port: port, // 和下面 grpc server 的配置相同, 否则就连接不上微服务Address: host, // 同上Check: &api.AgentServiceCheck{GRPC: address,Timeout: "3s",Interval: "1s",DeregisterCriticalServiceAfter: "5s",},}// 4、注册服务到consul上consulClient.Agent().ServiceRegister(&agentService)// ----------------------- 2. 注册GRPC -----------------------// 1、获取Grpc示例grpcServer := grpc.NewServer()// 2、注册服务users.RegisterUsersServer(grpcServer, &Users{})// 3. 健康检查grpc_health_v1.RegisterHealthServer(grpcServer, health.NewServer())// 4、监听端口listener, err := net.Listen("tcp", address)if err != nil {fmt.Println(err)}// 5、退出服务的时候关闭监听defer listener.Close()// 6、启动服务grpcServer.Serve(listener)
}
- 主要关注 main 函数中的注册和健康检查的配置
运行效果
- 可见,运行和健康检查都正常
其他
- 源码: https://gitee.com/go-micro-services/consul-grpc
- consul文档:https://developer.hashicorp.com/consul/docs/services/usage/checks#grpc-checks