snapshot of https://github.com/grpc/grpc-go.git (master, 2026-09-15; blobs > 131072B omitted)
Some checks failed
codecov / upload (push) Failing after 13m59s
CodeQL / Analyze (push) Failing after 1s
Testing / vet-proto (push) Failing after 1s
Testing / tests (arm, latest) (push) Waiting to run
Testing / extras (latest) (push) Failing after 1s
Testing / static checks (latest-1) (push) Failing after 1s
Testing / tests (-race, latest) (push) Failing after 1s
Testing / tests (i386, latest) (push) Failing after 1s
Testing / tests (latest) (push) Failing after 1s
Testing / tests (latest-1) (push) Failing after 1s
Lock Threads / lock (push) Failing after 1s
govulncheck / govulncheck (.) (push) Failing after 1s
govulncheck / govulncheck (./cmd/protoc-gen-go-grpc) (push) Failing after 1s
govulncheck / govulncheck (./gcp/observability) (push) Failing after 1s
govulncheck / govulncheck (./security/advancedtls) (push) Failing after 1s
govulncheck / govulncheck (./stats/opencensus) (push) Failing after 1s
Stale bot / stale (push) Failing after 1s

This commit is contained in:
upstream-mirror
2026-09-15 20:40:15 +05:00
commit e241b33f26
1365 changed files with 339570 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
# gRPC xDS example
xDS is the protocol initially used by Envoy, that is evolving into a universal
data plane API for service mesh.
The xDS example is a Hello World client/server capable of being configured with
the XDS management protocol. Out-of-the-box it behaves the same as [our other
hello world
example](https://github.com/grpc/grpc-go/tree/master/examples/helloworld). The
server replies with responses including its hostname.
## xDS environment setup
This example doesn't include instructions to setup xDS environment. Please refer
to documentation specific for your xDS management server. Examples will be added
later.
The client also needs a bootstrap file. See [gRFC
A27](https://github.com/grpc/proposal/blob/master/A27-xds-global-load-balancing.md#xdsclient-and-bootstrap-file)
for the bootstrap format.
## The client
The client application needs to import the xDS package to install the resolver and balancers:
```go
_ "google.golang.org/grpc/xds" // To install the xds resolvers and balancers.
```
Then, use `xds` target scheme for the ClientConn.
```
$ export GRPC_XDS_BOOTSTRAP=/path/to/bootstrap.json
$ go run client/main.go "xDS world" xds:///target_service
```

View File

@@ -0,0 +1,73 @@
/*
*
* Copyright 2020 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
// Binary main implements a client for Greeter service using gRPC's client-side
// support for xDS APIs.
package main
import (
"context"
"flag"
"log"
"strings"
"time"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
xdscreds "google.golang.org/grpc/credentials/xds"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
_ "google.golang.org/grpc/xds" // To install the xds resolvers and balancers.
)
var (
target = flag.String("target", "xds:///localhost:50051", "uri of the Greeter Server, e.g. 'xds:///helloworld-service:8080'")
name = flag.String("name", "world", "name you wished to be greeted by the server")
xdsCreds = flag.Bool("xds_creds", false, "whether the server should use xDS APIs to receive security configuration")
)
func main() {
flag.Parse()
if !strings.HasPrefix(*target, "xds:///") {
log.Fatalf("-target must use a URI with scheme set to 'xds'")
}
creds := insecure.NewCredentials()
if *xdsCreds {
log.Println("Using xDS credentials...")
var err error
if creds, err = xdscreds.NewClientCredentials(xdscreds.ClientOptions{FallbackCreds: insecure.NewCredentials()}); err != nil {
log.Fatalf("failed to create client-side xDS credentials: %v", err)
}
}
conn, err := grpc.NewClient(*target, grpc.WithTransportCredentials(creds))
if err != nil {
log.Fatalf("grpc.NewClient(%s) failed: %v", *target, err)
}
defer conn.Close()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
c := pb.NewGreeterClient(conn)
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
}

View File

@@ -0,0 +1,107 @@
/*
*
* Copyright 2020 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
// Binary server demonstrated gRPC's support for xDS APIs on the server-side. It
// exposes the Greeter service that will response with the hostname.
package main
import (
"context"
"flag"
"fmt"
"log"
rand "math/rand/v2"
"net"
"os"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
xdscreds "google.golang.org/grpc/credentials/xds"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/health"
healthgrpc "google.golang.org/grpc/health/grpc_health_v1"
healthpb "google.golang.org/grpc/health/grpc_health_v1"
"google.golang.org/grpc/xds"
)
var (
port = flag.Int("port", 50051, "the port to serve Greeter service requests on. Health service will be served on `port+1`")
xdsCreds = flag.Bool("xds_creds", false, "whether the server should use xDS APIs to receive security configuration")
)
// server implements helloworld.GreeterServer interface.
type server struct {
pb.UnimplementedGreeterServer
serverName string
}
// SayHello implements helloworld.GreeterServer interface.
func (s *server) SayHello(_ context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.GetName())
return &pb.HelloReply{Message: "Hello " + in.GetName() + ", from " + s.serverName}, nil
}
func determineHostname() string {
hostname, err := os.Hostname()
if err != nil {
log.Printf("Failed to get hostname: %v, will generate one", err)
return fmt.Sprintf("generated-%03d", rand.Int()%100)
}
return hostname
}
func main() {
flag.Parse()
greeterPort := fmt.Sprintf(":%d", *port)
greeterLis, err := net.Listen("tcp4", greeterPort)
if err != nil {
log.Fatalf("net.Listen(tcp4, %q) failed: %v", greeterPort, err)
}
creds := insecure.NewCredentials()
if *xdsCreds {
log.Println("Using xDS credentials...")
var err error
if creds, err = xdscreds.NewServerCredentials(xdscreds.ServerOptions{FallbackCreds: insecure.NewCredentials()}); err != nil {
log.Fatalf("failed to create server-side xDS credentials: %v", err)
}
}
greeterServer, err := xds.NewGRPCServer(grpc.Creds(creds))
if err != nil {
log.Fatalf("Failed to create an xDS enabled gRPC server: %v", err)
}
pb.RegisterGreeterServer(greeterServer, &server{serverName: determineHostname()})
healthPort := fmt.Sprintf(":%d", *port+1)
healthLis, err := net.Listen("tcp4", healthPort)
if err != nil {
log.Fatalf("net.Listen(tcp4, %q) failed: %v", healthPort, err)
}
grpcServer := grpc.NewServer()
healthServer := health.NewServer()
healthServer.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
healthgrpc.RegisterHealthServer(grpcServer, healthServer)
log.Printf("Serving GreeterService on %s and HealthService on %s", greeterLis.Addr().String(), healthLis.Addr().String())
go func() {
greeterServer.Serve(greeterLis)
}()
grpcServer.Serve(healthLis)
}