Go does not have a built-in gRPC load balancer; you must configure one in your http.Transport or use an external service like Envoy. For client-side round-robin or least-request balancing, set the Dial function in your http.Transport to connect to a list of backend addresses and cycle through them manually, or use the golang.org/x/net/http2 package with a custom DialTLS implementation that selects the next available server.
import (
"context"
"crypto/tls"
"net"
"net/http"
"sync/atomic"
"time"
)
var serverIndex uint64
var servers = []string{"addr1:50051", "addr2:50051", "addr3:50051"}
func dialFunc(ctx context.Context, network, addr string) (net.Conn, error) {
idx := atomic.AddUint64(&serverIndex, 1) % uint64(len(servers))
return net.DialTimeout(network, servers[idx], 5*time.Second)
}
func main() {
tr := &http.Transport{
DialContext: dialFunc,
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
// Use client for gRPC over HTTP/2 requests
}