2017-06-20 3 views
2

Ich implementiere zwei Dienste (Server und Client), die auf zwei verschiedenen Containern ausgeführt werden und versuche, gRPC zu verwenden, um zwischen ihnen zu kommunizieren.Verwenden Sie gRPC, um zwischen Containern zu kommunizieren

Wenn ich den Server als Container bereitstellen und den Client nicht auf einem Container ausführen, funktioniert alles einwandfrei. Aber wenn ich den Client in einem anderen Container bereitstellen, erhalte ich Error #01: could not retrieve restaurant's list: rpc error: code = Unavailable desc = grpc: the connection is unavailable Fehler.

Welche Schritte fehlen mir, um zwei verschiedene Container mit gRPC zu kommunizieren?

PS: Ich möchte jetzt erstmal ohne Kubernetes versuchen.

SERVER

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 

CLIENT

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 
+2

Wo auf der Client-Code, den Sie tun Geben Sie den Server-Host an, mit dem eine Verbindung hergestellt werden soll. Ich sehe das nicht ... –

Antwort

4

Sie müssen die Hostnamen in der Wählfunktion schließen, ist es sonst auf localhost suchen, die zu jedem Behälter eindeutig zuzuordnen ist (Docker erstellt einen separaten Netzwerknamensraum für Container Standard). Ändern Sie die folgenden Schritte aus:

backendPort := "neo4bacon:50051" 

Edit: Sie einrichten müssen, ein Netzwerk und verbinden Sie die Behälter zu diesem Netzwerk, da die Standard Brücke keine DNS-Entdeckung enthält:

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 
Verwandte Themen