ETCD 和 GRPC
GRPC 的服务发现
docker pull bitnami/etcd
App (root)
├─ client
│ └─ client.go
├─ server
│ ├─ service
│ │ ├─ Hello.go
│ │ └─ server.go
│ └─ server.go
└─ scripts
├─ server.proto
└─ gen.sh
GRPC Proto File
syntax = "proto3";
option go_package = ".;pb";
message HelloResponse {
string msg = 1;
}
message Empty {}
service Server {
rpc Hello(Empty) returns(HelloResponse);
}
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
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
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
}
package server
type Server struct {
}
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