ETCD 和 GRPC

GRPC 的服务发现

shell
docker pull bitnami/etcd
file system
App (root)
├─ client
│  └─ client.go
├─ server
│  ├─ service
│  │  ├─ Hello.go
│  │  └─ server.go
│  └─ server.go
└─ scripts
   ├─ server.proto
   └─ gen.sh

GRPC Proto File

server.proto
syntax = "proto3";

option go_package = ".;pb";

message HelloResponse {
  string msg = 1;
}

message Empty {}

service Server {
  rpc Hello(Empty) returns(HelloResponse);
}
gen.sh
CLIENT_OUT=../client/pb
protoc \
--go_out=${CLIENT_OUT} \
--go-grpc_out=${CLIENT_OUT} \
--go-grpc_opt=require_unimplemented_servers=false \
server.proto

SERVER_OUT=../server/pb
protoc \
--go_out=${SERVER_OUT} \
--go-grpc_out=${SERVER_OUT} \
--go-grpc_opt=require_unimplemented_servers=false \
server.proto

client

client.go
package main

import (
   "context"
   "fmt"
   helper_grpc "github.com/langwan/langgo/helpers/grpc"
   "langwan/langgo-examples/Advanced/Grpc/ETCD-And-GRPC/client/pb"

   clientv3 "go.etcd.io/etcd/client/v3"
   "go.etcd.io/etcd/client/v3/naming/resolver"
   "google.golang.org/grpc"
   "google.golang.org/grpc/balancer/roundrobin"
   "google.golang.org/grpc/credentials/insecure"
   "log"
   "time"
)

const etcdHost = "http://localhost:2379"
const serviceName = "langgo/server"

func main() {

   etcdClient, err := clientv3.NewFromURL(etcdHost)
   if err != nil {
      panic(err)
   }
   etcdResolver, err := resolver.NewBuilder(etcdClient)

   conn, err := helper_grpc.NewClient(nil, fmt.Sprintf("etcd:///%s", serviceName), grpc.WithResolvers(etcdResolver), grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultServiceConfig(fmt.Sprintf(`{"LoadBalancingPolicy": "%s"}`, roundrobin.Name)))
   if err != nil {
      panic(err)

   }

   ServerClient := pb.NewServerClient(conn)

   for {
      helloRespone, err := ServerClient.Hello(context.Background(), &pb.Empty{})
      if err != nil {
         fmt.Printf("err: %v", err)
         return
      }

      log.Println(helloRespone, err)
      time.Sleep(500 * time.Millisecond)
   }

}

server

service/Hello.go
package server

import (
   "context"
   "langwan/langgo-examples/Advanced/Grpc/Single-Service/server/pb"
)

func (s Server) Hello(ctx context.Context, request *pb.Empty) (*pb.HelloResponse, error) {
   return &pb.HelloResponse{Msg: "hello"}, nil
}
service/server.go
package server

type Server struct {
}
server.go
package main

import (
   "github.com/langwan/langgo"
   helper_grpc "github.com/langwan/langgo/helpers/grpc"
   "langwan/langgo-examples/Advanced/Grpc/Single-Service/server/pb"
   "langwan/langgo-examples/Advanced/Grpc/Single-Service/server/service/server"
)

const addr = "localhost:8000"

func main() {
   langgo.Run()
   cg := helper_grpc.NewServer(nil)
   cg.Use(helper_grpc.LogUnaryServerInterceptor())
   gs, err := cg.Server()
   if err != nil {
      panic(err)
   }
   pb.RegisterServerServer(gs, server.Server{})
   err = cg.Run(addr)
   if err != nil {
      panic(err)
   }
}

Last updated