/** 服务提供者样例 */ package main import ( "app.yhyue.com/BP/servicerd/proto" "context" "flag" "fmt" "google.golang.org/grpc" "log" "net" "os" "os/signal" "time" ) //服务地址配置 var ( ip = flag.String("ip", "192.168.20.100", "本机ip") port = flag.Int("port", 20153, "服务端口") rdserver = flag.String("rd", "127.0.0.1:10021", "服务治理地址") serviceName = flag.String("name", "demo", "服务名称") ) type DemoService struct { } // func (s *DemoService) Say(ctx context.Context, in *proto.DemoReq) (*proto.DemoRep, error) { return &proto.DemoRep{Data: in.Name}, nil } // func heartbeat() { conn, err := grpc.Dial(*rdserver, grpc.WithInsecure()) if err != nil { return } defer conn.Close() client := proto.NewHeartBeatClient(conn) //调用服务端推送流 resp, _ := client.PutStream(context.Background()) tm := time.NewTicker(20 * time.Second) for { select { case <-tm.C: reqstreamData := &proto.StreamReqData{ServiceName: *serviceName, ServiceAddr: fmt.Sprintf("%s:%d", *ip, *port)} _ = resp.Send(reqstreamData) } } } //服务注册 func registe() { conn, err := grpc.Dial(*rdserver, grpc.WithInsecure()) if err != nil { return } defer conn.Close() client := proto.NewServiceClient(conn) ret, err := client.Registe(context.TODO(), &proto.ServiceMeta{ Name: *serviceName, Ip: *ip, Port: int32(*port), Balance: 0, Workers: 5, }) if err != nil { log.Println(err.Error()) } else { log.Println(ret) } } //服务注销 func destory() { conn, err := grpc.Dial(*rdserver, grpc.WithInsecure()) if err != nil { return } defer conn.Close() client := proto.NewServiceClient(conn) ret, err := client.Destory(context.TODO(), &proto.ServiceMeta{ Name: *serviceName, Ip: *ip, Port: int32(*port), Balance: 0, Workers: 5, }) if err != nil { log.Println(err.Error()) } else { log.Println(ret) } } //服务启动 func startServer() { //监听端口 lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port)) if err != nil { log.Fatalln(err.Error()) return } //创建一个grpc 服务器 s := grpc.NewServer() //注册事件 proto.RegisterDemoServiceServer(s, &DemoService{}) //处理链接 _ = s.Serve(lis) } func init() { flag.Parse() } func main() { go startServer() go heartbeat() //心跳 registe() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, os.Kill) <-c log.Println("服务注销") destory() }