You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Curl或Postman调用Docker内的Go-micro(v2)服务?

Go-micro(v2)容器部署后本地调用失败的解决方法

问题背景

使用Go-micro(v2)通过docker-compose部署服务,服务启动日志显示正常,但本地用Curl或Postman调用接口时失败,报错Parse Error: Expected HTTP/。以下是相关配置与调用信息:

Docker-compose配置

user-service:
  build:
    context: ./user-service
  restart: always
  ports:
    - "8086:8086"
  deploy:
    mode: replicated
    replicas: 1
  environment:....

服务配置代码

srv = micro.NewService(
            micro.Name("my.user"),
            micro.Address("127.0.0.1:8086"))

容器启动日志

2022-07-31 05:43:53  file=v2@v2.9.1/service.go:200 level=info Starting [service] my.user
2022-07-31 05:43:53  file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:8086
2022-07-31 05:43:53  file=grpc/grpc.go:697 level=info Registry [mdns] Registering node: my.user-00ee4795-06df-47f1-a07a-cc362e135864

调用失败示例

Postman请求

GET http://127.0.0.1:8086/my.user/Get
Error: Parse Error: Expected HTTP/
Request Headers
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Postman-Token: b5ab718a-341b-40ff-81fa-37c66fd4d9f2
Host: 127.0.0.1:8086
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Request Body


GET http://127.0.0.1:8086/my.user/userService/Get // same error

Curl请求

curl --header "Content-Type:application/json" --http0.9 --output GET http://localhost:8086/my.user/Get
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    15    0    15    0     0  10638      0 --:--:-- --:--:-- --:--:-- 15000

curl --header "Content-Type:application/json" --http0.9 --output GET http://localhost:8086/my.user/userService/Get
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    15    0    15    0     0  13550      0 --:--:-- --:--:-- --:--:-- 15000

注:Get接口本身功能正常。

问题原因

从启动日志可看出,Go-micro默认使用gRPC协议监听端口,而Curl/Postman发送的是标准HTTP请求,协议不匹配导致解析失败。gRPC基于HTTP/2实现,但并非标准HTTP接口,无法直接用HTTP客户端调用。

解决方法

方法1:添加HTTP网关(推荐)

利用Go-micro自带的HTTP网关,将gRPC服务转换为HTTP接口对外提供:

  1. 安装go-micro网关工具:
go get github.com/micro/micro/v2/cmd/micro
  1. 启动HTTP网关,指定gRPC handler与监听端口:
micro api --handler=grpc --address=:8087
  1. 此时可通过HTTP请求调用,格式为http://localhost:8087/my.user/Get,需用POST方法,将JSON参数放入请求体。

方法2:修改服务为HTTP协议(不推荐,损失gRPC性能优势)

初始化服务时指定使用HTTP Server:

import "github.com/micro/go-micro/v2/server/http"

srv = micro.NewService(
    micro.Name("my.user"),
    micro.Address("127.0.0.1:8086"),
    micro.Server(http.NewServer()),
)

修改后服务直接监听HTTP端口,可直接用Curl/Postman调用。

方法3:使用gRPC客户端调用

直接编写Go代码通过gRPC客户端调用,或使用grpcurl工具:

  1. 安装grpcurl:
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
  1. 调用接口(需服务开启反射或提供proto文件):
grpcurl -plaintext localhost:8086 my.user/Get

查看服务列表:

grpcurl -plaintext localhost:8086 list

内容的提问来源于stack exchange,提问作者Jerome

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:24:27