如何用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接口对外提供:
- 安装go-micro网关工具:
go get github.com/micro/micro/v2/cmd/micro
- 启动HTTP网关,指定gRPC handler与监听端口:
micro api --handler=grpc --address=:8087
- 此时可通过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工具:
- 安装grpcurl:
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
- 调用接口(需服务开启反射或提供proto文件):
grpcurl -plaintext localhost:8086 my.user/Get
查看服务列表:
grpcurl -plaintext localhost:8086 list
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

