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  }