github.com/micro/go-micro/examples@v0.0.0-20210105173217-bf4ab679e18b/client/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 6 "context" 7 example "github.com/micro/go-micro/examples/server/proto/example" 8 "github.com/micro/go-micro/v2" 9 "github.com/micro/go-micro/v2/client" 10 "github.com/micro/go-micro/v2/metadata" 11 ) 12 13 // publishes a message 14 func pub(p micro.Publisher) { 15 msg := &example.Message{ 16 Say: "This is an async message", 17 } 18 19 if err := p.Publish(context.TODO(), msg); err != nil { 20 fmt.Println("pub err: ", err) 21 return 22 } 23 24 fmt.Printf("Published: %v\n", msg) 25 } 26 27 func call(i int, c client.Client) { 28 // Create new request to service go.micro.srv.example, method Example.Call 29 req := c.NewRequest("go.micro.srv.example", "Example.Call", &example.Request{ 30 Name: "John", 31 }) 32 33 // create context with metadata 34 ctx := metadata.NewContext(context.Background(), map[string]string{ 35 "X-User-Id": "john", 36 "X-From-Id": "script", 37 }) 38 39 rsp := &example.Response{} 40 41 // Call service 42 if err := c.Call(ctx, req, rsp); err != nil { 43 fmt.Println("call err: ", err, rsp) 44 return 45 } 46 47 fmt.Println("Call:", i, "rsp:", rsp.Msg) 48 } 49 50 func stream(i int, c client.Client) { 51 // Create new request to service go.micro.srv.example, method Example.Call 52 // Request can be empty as its actually ignored and merely used to call the handler 53 req := c.NewRequest("go.micro.srv.example", "Example.Stream", &example.StreamingRequest{}) 54 55 stream, err := c.Stream(context.Background(), req) 56 if err != nil { 57 fmt.Println("err:", err) 58 return 59 } 60 if err := stream.Send(&example.StreamingRequest{Count: int64(i)}); err != nil { 61 fmt.Println("err:", err) 62 return 63 } 64 for stream.Error() == nil { 65 rsp := &example.StreamingResponse{} 66 err := stream.Recv(rsp) 67 if err != nil { 68 fmt.Println("recv err", err) 69 break 70 } 71 fmt.Println("Stream: rsp:", rsp.Count) 72 } 73 74 if stream.Error() != nil { 75 fmt.Println("stream err:", err) 76 return 77 } 78 79 if err := stream.Close(); err != nil { 80 fmt.Println("stream close err:", err) 81 } 82 } 83 84 func pingPong(i int, c client.Client) { 85 // Create new request to service go.micro.srv.example, method Example.Call 86 // Request can be empty as its actually ignored and merely used to call the handler 87 req := c.NewRequest("go.micro.srv.example", "Example.PingPong", &example.StreamingRequest{}) 88 89 stream, err := c.Stream(context.Background(), req) 90 if err != nil { 91 fmt.Println("err:", err) 92 return 93 } 94 95 for j := 0; j < i; j++ { 96 if err := stream.Send(&example.Ping{Stroke: int64(j + 1)}); err != nil { 97 fmt.Println("err:", err) 98 return 99 } 100 rsp := &example.Pong{} 101 err := stream.Recv(rsp) 102 if err != nil { 103 fmt.Println("recv err", err) 104 break 105 } 106 fmt.Printf("Sent ping %v got pong %v\n", j+1, rsp.Stroke) 107 } 108 109 if stream.Error() != nil { 110 fmt.Println("stream err:", err) 111 return 112 } 113 114 if err := stream.Close(); err != nil { 115 fmt.Println("stream close err:", err) 116 } 117 } 118 119 func main() { 120 service := micro.NewService() 121 service.Init() 122 123 p := micro.NewPublisher("topic.example", service.Client()) 124 125 fmt.Println("\n--- Publisher example ---") 126 pub(p) 127 128 fmt.Println("\n--- Call example ---") 129 for i := 0; i < 10; i++ { 130 call(i, service.Client()) 131 } 132 133 fmt.Println("\n--- Streamer example ---") 134 stream(10, service.Client()) 135 136 fmt.Println("\n--- Ping Pong example ---") 137 pingPong(10, service.Client()) 138 139 }