mse-go-demo/grpc/b-server/main.go (86 lines of code) (raw):
// Package main implements a server for Greeter service.
package main
import (
"context"
"io/ioutil"
"log"
"net"
"os"
"regexp"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
b_api_pb "github.com/aliyun/alibabacloud-microservice-demo/mse-go-demo/grpc/b-server/proto/b_api"
c_api_pb "github.com/aliyun/alibabacloud-microservice-demo/mse-go-demo/grpc/b-server/proto/c_api"
)
const (
port = ":50052"
address = "go-c-service:50053"
)
// server is used to implement helloworld.GreeterServer.
type server struct {
b_api_pb.UnimplementedBServiceServer
}
func (s *server) BMethod(ctx context.Context, req *b_api_pb.BRequest) (*b_api_pb.BReply, error) {
conn, err := grpc.DialContext(
ctx,
address,
grpc.WithInsecure(),
grpc.WithBlock(),
)
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
cClient := c_api_pb.NewCServiceClient(conn)
cReply, err := cClient.CMethod(ctx, &c_api_pb.CRequest{})
if err != nil {
return nil, err
}
reply := &b_api_pb.BReply{
Message: generateMessage("B") + "->" + cReply.GetMessage(),
}
return reply, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
b_api_pb.RegisterBServiceServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
// Register reflection service on gRPC server.
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
func generateMessage(message string) string {
tag := parseTag()
if tag != "" {
message += "-" + tag
}
hostname, err := os.Hostname()
if err == nil {
message += "[" + hostname + "]"
}
return message
}
func parseTag() string {
var re = regexp.MustCompile(`(?m)alicloud\.service\.tag="(?P<tag>.*)"`)
bs, err := ioutil.ReadFile("/etc/podinfo/labels")
if err != nil {
return ""
}
content := string(bs)
result := re.FindStringSubmatch(content)
groupNames := re.SubexpNames()
index := 0
for i, name := range groupNames {
if name == "tag" {
index = i
break
}
}
if len(result) <= index {
return ""
}
return result[index]
}