使用gRPC在容器之间进行通信

我正在实现运行在两个不同容器上的两个服务(服务器和客户端),并尝试使用gRPC在它们之间进行通信。

如果我将服务器部署为一个容器,而不是运行在一个容器上的客户端,一切正常。 但是,如果我将客户端部署在不同的容器上,则会收到Error #01: could not retrieve restaurant's list: rpc error: code = Unavailable desc = grpc: the connection is unavailable错误。

我错过了什么步骤沟通两个不同的容器使用gRPC?

PS:我现在想尝试没有Kubernetes。

服务器

 func Serve() { log.Println("serving...") port := ":50051" lis, err := net.Listen("tcp", port) if err != nil { log.Fatalf("failed to listen on port %s: %v", port, err) } s := grpc.NewServer() server := server{} RegisterNeo4BaconServer(s, server) if err := s.Serve(lis); err != nil { log.Fatal("could not serve: ", err) } } 

Makefile文件

 image: ## build docker image and push image to registry @docker build -t neo4bacon -f resources/prod/Dockerfile . run: ## deploy application container @docker run --rm -d --name neo4bacon neo4bacon 

客户

 func Get() (*api.RestaurantList, error) { // Neo4bacon backend backendPort := ":50051" conn, err := grpc.Dial(backendPort, grpc.WithInsecure()) if err != nil { &api.RestaurantList{}, fmt.Errorf("could not connect to backend %s: %s", backendPort, err) } defer conn.Close() client := api.NewNeo4BaconClient(conn) restaurantList, err := client.List(context.Background(), &api.Empty{}) if err != nil { return &api.RestaurantList{}, fmt.Errorf("could not retrieve restaurant's list: %s", err) } return restaurantList, nil } 

Makefile文件

 image: ## build docker image and push image to registry @docker build -t alesr/bacon-api -f resources/prod/Dockerfile . run: ## deploy docker container @docker run --rm -d -p 8080:8080 --name bacon-api bacon-api 

你需要在dial函数中包含主机名,否则就是查看每个容器唯一的localhost(默认情况下,docker为容器创build一个单独的networking命名空间)。 更改以下内容:

 backendPort := "neo4bacon:50051" 

编辑:您还需要设置一个networking,并将容器连接到该networking,因为默认网桥不包括DNS发现:

 docker network create baconnet docker run --rm -d --net baconnet --name neo4bacon neo4bacon docker run --rm -d --net baconnet -p 8080:8080 --name bacon-api bacon-api