使用 gRPC 进行容器间通信
Use gRPC to communicate between containers
我在两个不同的容器上实现两个服务(服务器和客户端)运行并尝试使用 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)
}
}
生成文件
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
}
生成文件
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
您需要在拨号函数中包含主机名,否则它会查看每个容器唯一的本地主机(docker 默认情况下为容器创建一个单独的网络命名空间)。更改以下内容:
backendPort := "neo4bacon:50051"
编辑:您还需要设置网络并将容器连接到该网络,因为默认网桥不包括 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
我在两个不同的容器上实现两个服务(服务器和客户端)运行并尝试使用 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)
}
}
生成文件
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
}
生成文件
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
您需要在拨号函数中包含主机名,否则它会查看每个容器唯一的本地主机(docker 默认情况下为容器创建一个单独的网络命名空间)。更改以下内容:
backendPort := "neo4bacon:50051"
编辑:您还需要设置网络并将容器连接到该网络,因为默认网桥不包括 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