< Back

consul+grpc使用

创建grpc服务

安装protobuf,然后clone一份示例代码

https://github.com/grpc/grpc-go.git

cd grpc-go/examples/helloworld/

向consul注册服务和查找服务

// greeter_server/main.go import "github.com/hashicorp/consul/api" func main() { registry, err := api.NewClient(api.DefaultConfig()) if err != nil { fmt.Println("NewClient err", err) return } // 告诉consul,即将注册的服务的配置信息 reg := api.AgentServiceRegistration{ ID: "service_id", Name: "service_name", Tags: []string{"shou", "consul"}, Port: 8080, Address: "127.0.0.1", Check: &api.AgentServiceCheck{ TCP: "127.0.0.1:8080", CheckID: "consul check id", Interval: "5s", // 每5秒检测一次,超时1秒判定不健康 Timeout: "1s", }, } err = registry.Agent().ServiceRegister(&reg) if err != nil { fmt.Println("service reg failed", err) return } // 下面就是常规的监听端口,注册grpc等操作 lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 8080)) if err != nil { log.Fatalf("failed to listen: %v", err) } // ... }
// greeter_client/main.go func main() { // 这里和server一样 registry, err := api.NewClient(api.DefaultConfig()) if err != nil { fmt.Println("NewClient err", err) return } // 去找到一个健康的服务 services, _, err := registry.Health().Service("sev_name", "shou", true, nil) if err != nil { fmt.Println("Health.service error", err) return } // 这里就取第一个,然后拼接一个地址,然后Dial的时候就不再是写死地址了 addr := services[0].Service.Address + ":" + strconv.Itoa(services[0].Service.Port) // Set up a connection to the server. conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() // ... }

验证

  • 启动consul

    就用默认的配置: consul agent -dev

  • 启动server和客户端

    go run greeter_client/main.go
    go run greeter_server/main.go
  • 客户端的终端应该能看到 Greeting: Hello world