【问题标题】:nestjs grpc client cannot resolve dns to grpc service inside docker containernestjs grpc 客户端无法将 dns 解析为 docker 容器内的 grpc 服务
【发布时间】:2023-01-23 00:12:05
【问题描述】:

我有一个 grpc 服务和一个用作 grpc 客户端的简单 http 服务器。它们在本地运行时工作正常。但是,一旦放入单独的 docker 容器中,它们就无法建立连接。 grpc 服务运行并暴露端口:5001。

在 nestjs grpc 客户端应用程序中注册 grpc 服务

  ClientsModule.register([
      {
        name: "TOKEN_NAME",
        transport: Transport.GRPC,
        options: {
           ...GRPC_OPTIONS,
           url: process.env.GRPC_SERVICE_URL
        },
      },
    ]),

我试过使用容器名称作为 URL:

version: '3.9'
services:
  grpc-service:
    restart: always
    build: ./grpc-service
    container_name: grpc-service
  grpc-client:
    restart: always
    build: ./backend
    container_name: grpc-client
#    links:
#      - "grpc-service:service"
    depends_on:
      - grpc-service
    ports:
      - "3000:3000"
    environment:
      - GRPC_SERVICE_URL=http://grpc-service:5001
#     - GRPC_SERVICE_URL=http://service:5001

还尝试创建网络并分配 IP 地址:

version: '3.9'
networks:
  mynetwork:
    driver: bridge
    ipam:
      config:
        - subnet: 179.20.0.0/24

services:
  grpc-service:
    restart: always
    build: ./grpc-service
    container_name: grpc-service
    networks:
      mynetwork:
        ipv4_address: 179.20.0.5
  grpc-client:
    restart: always
    build: ./backend
    container_name: grpc-client
    networks:
      mynetwork:
        ipv4_address: 179.20.0.6

    depends_on:
      - grpc-service
    ports:
      - "3000:3000"
    environment:
      - GRPC_SERVICE_URL=179.20.0.5:5001

错误:

使用 http://grpc-service:5001

grpc-client       | [Nest] 1  - 09/20/2022, 12:20:14 PM   ERROR [ExceptionsHandler] 14 UNAVAILABLE: Name resolution failed for target dns:http://grpc-service:5001
grpc-client       | Error: 14 UNAVAILABLE: Name resolution failed for target dns:http://grpc-service:5001
grpc-client       |     at Object.callErrorFromStatus (/node_modules/@grpc/grpc-js/build/src/call.js:31:19)
grpc-client       |     at Object.onReceiveStatus (/node_modules/@grpc/grpc-js/build/src/client.js:190:52)
grpc-client       |     at Object.onReceiveStatus (/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:365:141)
grpc-client       |     at Object.onReceiveStatus (/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:328:181)
grpc-client       |     at /node_modules/@grpc/grpc-js/build/src/call-stream.js:188:78
grpc-client       |     at processTicksAndRejections (node:internal/process/task_queues:78:11)
grpc-client       | for call at
grpc-client       |     at ServiceClientImpl.makeUnaryRequest (/node_modules/@grpc/grpc-js/build/src/client.js:160:30)
grpc-client       |     at ServiceClientImpl.<anonymous> (/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)
grpc-client       |     at Observable._subscribe (/node_modules/@nestjs/microservices/client/client-grpc.js:177:35)
grpc-client       |     at Observable._trySubscribe (/node_modules/rxjs/dist/cjs/internal/Observable.js:41:25)
grpc-client       |     at /node_modules/rxjs/dist/cjs/internal/Observable.js:35:31
grpc-client       |     at Object.errorContext (/node_modules/rxjs/dist/cjs/internal/util/errorContext.js:22:9)
grpc-client       |     at Observable.subscribe (/node_modules/rxjs/dist/cjs/internal/Observable.js:26:24)
grpc-client       |     at /node_modules/rxjs/dist/cjs/internal/lastValueFrom.js:10:16
grpc-client       |     at new Promise (<anonymous>)
grpc-client       |     at lastValueFrom (/node_modules/rxjs/dist/cjs/internal/lastValueFrom.js:7:12)

使用 179.20.0.5:5001

grpc-client       | [Nest] 1  - 09/20/2022, 12:22:14 PM   ERROR [ExceptionsHandler] 14 UNAVAILABLE: No connection established
grpc-client       | Error: 14 UNAVAILABLE: No connection established
grpc-client       |     at Object.callErrorFromStatus (/node_modules/@grpc/grpc-js/build/src/call.js:31:19)
grpc-client       |     at Object.onReceiveStatus (/node_modules/@grpc/grpc-js/build/src/client.js:190:52)
grpc-client       |     at Object.onReceiveStatus (/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:365:141)
grpc-client       |     at Object.onReceiveStatus (/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:328:181)
grpc-client       |     at /node_modules/@grpc/grpc-js/build/src/call-stream.js:188:78
grpc-client       |     at processTicksAndRejections (node:internal/process/task_queues:78:11)
grpc-client       | for call at
grpc-client       |     at ServiceClientImpl.makeUnaryRequest (/node_modules/@grpc/grpc-js/build/src/client.js:160:30)
grpc-client       |     at ServiceClientImpl.<anonymous> (/node_modules/@grpc/grpc-js/build/src/make-client.js:105:19)
grpc-client       |     at Observable._subscribe (/node_modules/@nestjs/microservices/client/client-grpc.js:177:35)
grpc-client       |     at Observable._trySubscribe (/node_modules/rxjs/dist/cjs/internal/Observable.js:41:25)
grpc-client       |     at /node_modules/rxjs/dist/cjs/internal/Observable.js:35:31
grpc-client       |     at Object.errorContext (/node_modules/rxjs/dist/cjs/internal/util/errorContext.js:22:9)
grpc-client       |     at Observable.subscribe (/node_modules/rxjs/dist/cjs/internal/Observable.js:26:24)
grpc-client       |     at /node_modules/rxjs/dist/cjs/internal/lastValueFrom.js:10:16
grpc-client       |     at new Promise (<anonymous>)
grpc-client       |     at lastValueFrom (/node_modules/rxjs/dist/cjs/internal/lastValueFrom.js:7:12)

编辑

我还尝试使用端口映射 5001:5001 在 docker 中运行 grpc 服务,并在本地运行 http 客户端,尝试连接 localhost:5001 上的 grpc 服务。在这种情况下,我得到connection dropped error

  [Nest] 93680  - 09/24/2022, 2:52:50 PM   ERROR [ExceptionsHandler] 14 UNAVAILABLE: Connection dropped
Error: 14 UNAVAILABLE: Connection dropped
         at Object.callErrorFromStatus (/Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/call.ts:81:17)
         at Object.onReceiveStatus (/Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/client.ts:352:36)
         at Object.onReceiveStatus (/Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/client-interceptors.ts:462:34)
         at Object.onReceiveStatus (/Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/client-interceptors.ts:424:48)
         at /Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/call-stream.ts:330:24
         at processTicksAndRejections (node:internal/process/task_queues:78:11)
  for call at
  at ServiceClientImpl.makeUnaryRequest (/Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/client.ts:324:26)
  at ServiceClientImpl.<anonymous> (/Users/grpc-docker/backend/node_modules/@grpc/grpc-js/src/make-client.ts:189:15)
  at Observable._subscribe (/Users/grpc-docker/backend/node_modules/@nestjs/microservices/client/client-grpc.js:177:35)
  at Observable._trySubscribe (/Users/grpc-docker/backend/node_modules/rxjs/src/internal/Observable.ts:245:19)
  at /Users/grpc-docker/backend/node_modules/rxjs/src/internal/Observable.ts:235:18
  at Object.errorContext (/Users/grpc-docker/backend/node_modules/rxjs/src/internal/util/errorContext.ts:29:5)
  at Observable.subscribe (/Users/grpc-docker/backend/node_modules/rxjs/src/internal/Observable.ts:221:5)
  at /Users/grpc-docker/backend/node_modules/rxjs/src/internal/lastValueFrom.ts:59:12
  at new Promise (<anonymous>)
  at lastValueFrom (/Users/grpc-docker/backend/node_modules/rxjs/src/internal/lastValueFrom.ts:56:10)

【问题讨论】:

  • 你得到的确切错误是什么?
  • @OneCricketeer 更新了帖子以包含错误。基本上要么Connection没有建立,要么DNS解析不了
  • 您的撰写文件中没有任何内容称为comments-service,因此错误是“正确的”
  • @OneCricketeer 是,名称因堆栈溢出而更改。没有这样做是为了错误。
  • 知道了。那么,您是否尝试过从第一种方法中删除 http 协议,因为您没有在第二种方法中使用它?

标签: typescript docker nestjs grpc grpc-node


【解决方案1】:

基本上,问题在于 grpc 服务是如何启动的。

Nestjs的createMicroservice方法接受grpc options,其中一个是url。 我的设置为localhost:5001,但是,显然这并不能从容器外部访问它。将其更改为0.0.0.0:5001 后,建立连接就没有问题了。弄清楚这一点后,我找到了一个 stack exchange thread 来更详细地解释它。

【讨论】:

    【解决方案2】:

    我有像你一样的问题。更改为 0.0.0.0:5001 和 gRPC 后,我可以查看你的配置 docker 文件吗?客户端配置或者你能帮我吗

    My issue

    这是我的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 2020-09-09
      • 1970-01-01
      • 2020-10-18
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      相关资源
      最近更新 更多