概述
- 現在,我們使用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