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

Node.js/Python客户端无法连接Go-Micro gRPC服务器报错求助

Fixing "Stream removed" and HTTP/1.x Connection Errors with Go-Micro gRPC Server & Cross-Language Clients

Hey there, let's tackle this issue you're hitting—your Go-Micro gRPC server works fine with Go-based tools like micro web and Iris, but Node.js/Python clients throw "Stream removed" or "Trying to connect an http1.x server" errors. This is almost always due to protocol mismatches, non-standard gRPC configurations, or client-side setup issues. Here's how to fix it:

1. Ensure Your Go-Micro Server Exposes a Standard gRPC Interface

Go-Micro sometimes wraps gRPC with its own service discovery/transport layer, which works great for Go ecosystems but breaks cross-language clients. To make sure your server speaks standard gRPC:

  • Update your server initialization to explicitly use the gRPC transport and bind to a standard port:
package main

import (
    "log"
    "github.com/micro/go-micro/v2"
    "github.com/micro/go-micro/v2/transport/grpc"
    // Import your proto and service handlers here
)

func main() {
    service := micro.NewService(
        micro.Name("your.service.name"),
        micro.Transport(grpc.NewTransport()), // Force standard gRPC transport
        micro.Address(":50051"), // Bind to the default gRPC port
    )

    service.Init()

    // Register your service handler (replace with your actual code)
    // example: yourproto.RegisterYourServiceHandler(service.Server(), &YourService{})

    if err := service.Run(); err != nil {
        log.Fatal(err)
    }
}
  • Verify the server is using standard gRPC with grpcurl (install it first if you haven't):
grpcurl -plaintext localhost:50051 list

If this returns your service methods, you're good to go. If not, double-check your server configuration.

2. Fix Client-Side gRPC Library & Protocol Issues

The "Trying to connect an http1.x server" error means your client is attempting to use HTTP/1.x, but gRPC requires HTTP/2. Here's how to fix this for each client:

Node.js Clients

  • Ditch the old grpc package and use the official @grpc/grpc-js library (it has better HTTP/2 support):
npm uninstall grpc
npm install @grpc/grpc-js @grpc/proto-loader
  • Update your client code to use the new library and disable TLS (if your server isn't using it):
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');

// Load your proto file
const packageDef = protoLoader.loadSync('your_service.proto', {
  keepCase: true,
  longs: String,
  enums: String,
  defaults: true,
  oneofs: true
});
const service = grpc.loadPackageDefinition(packageDef).your.package.path;

// Connect with insecure credentials (no TLS)
const client = new service.YourService('localhost:50051', grpc.credentials.createInsecure());

// Test a method call
client.yourMethod({ param: 'test' }, (err, res) => {
  if (err) console.error(err);
  else console.log('Response:', res);
});

Python Clients

  • Make sure you're using the latest grpcio and grpcio-tools packages:
pip install --upgrade grpcio grpcio-tools
  • Use an insecure channel (if no TLS) and ensure you're not forcing HTTP/1.x:
import grpc
import your_service_pb2
import your_service_pb2_grpc

def main():
    # Connect to the standard gRPC port with insecure channel
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = your_service_pb2_grpc.YourServiceStub(channel)
        response = stub.YourMethod(your_service_pb2.YourRequest(param='test'))
        print(f"Got response: {response.result}")

if __name__ == '__main__':
    main()

3. Check TLS & Proxy Conflicts

  • TLS Mismatch: If your server uses TLS, your client must provide the correct certificates. If it doesn't, ensure clients use insecure credentials (like the examples above).
  • HTTP Proxies: Tools like Charles or Fiddler can interfere with HTTP/2 connections. Disable any local proxies while testing, or configure them to support HTTP/2.

4. Verify Server Listening Address

Make sure your server isn't only listening on 127.0.0.1 (which restricts it to local Go tools). Using micro.Address(":50051") binds to 0.0.0.0, allowing all local clients (including Node.js/Python) to connect.


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:09:48