Add example dc filter
This commit is contained in:
		
							
								
								
									
										84
									
								
								examples/client/dc_filter/dc_filter.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								examples/client/dc_filter/dc_filter.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/rand" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/micro/go-micro/client" | ||||
| 	"github.com/micro/go-micro/cmd" | ||||
| 	c "github.com/micro/go-micro/context" | ||||
| 	example "github.com/micro/go-micro/examples/server/proto/example" | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| 	"golang.org/x/net/context" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	rand.Seed(time.Now().Unix()) | ||||
| } | ||||
|  | ||||
| // A Wrapper that creates a Datacenter Selector Option | ||||
| type dcWrapper struct { | ||||
| 	client.Client | ||||
| } | ||||
|  | ||||
| func (dc *dcWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { | ||||
| 	md, _ := c.GetMetadata(ctx) | ||||
|  | ||||
| 	filter := func(services []*registry.Service) []*registry.Service { | ||||
| 		for _, service := range services { | ||||
| 			var nodes []*registry.Node | ||||
| 			for _, node := range service.Nodes { | ||||
| 				if node.Metadata["datacenter"] == md["datacenter"] { | ||||
| 					nodes = append(nodes, node) | ||||
| 				} | ||||
| 			} | ||||
| 			service.Nodes = nodes | ||||
| 		} | ||||
| 		return services | ||||
| 	} | ||||
|  | ||||
| 	callOptions := append(opts, client.WithSelectOption(registry.SelectFilter(filter))) | ||||
|  | ||||
| 	fmt.Printf("[DC Wrapper] filtering for datacenter %s\n", md["datacenter"]) | ||||
| 	return dc.Client.Call(ctx, req, rsp, callOptions...) | ||||
| } | ||||
|  | ||||
| func NewDCWrapper(c client.Client) client.Client { | ||||
| 	return &dcWrapper{c} | ||||
| } | ||||
|  | ||||
| func call(i int) { | ||||
| 	// Create new request to service go.micro.srv.example, method Example.Call | ||||
| 	req := client.NewRequest("go.micro.srv.example", "Example.Call", &example.Request{ | ||||
| 		Name: "John", | ||||
| 	}) | ||||
|  | ||||
| 	// create context with metadata | ||||
| 	ctx := c.WithMetadata(context.Background(), map[string]string{ | ||||
| 		"datacenter": "local", | ||||
| 	}) | ||||
|  | ||||
| 	rsp := &example.Response{} | ||||
|  | ||||
| 	// Call service | ||||
| 	if err := client.Call(ctx, req, rsp); err != nil { | ||||
| 		fmt.Println("call err: ", err, rsp) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	fmt.Println("Call:", i, "rsp:", rsp.Msg) | ||||
| } | ||||
|  | ||||
| func main() { | ||||
| 	cmd.Init() | ||||
|  | ||||
| 	client.DefaultClient = client.NewClient( | ||||
| 		client.Wrap(NewDCWrapper), | ||||
| 	) | ||||
|  | ||||
| 	fmt.Println("\n--- Call example ---\n") | ||||
| 	for i := 0; i < 10; i++ { | ||||
| 		call(i) | ||||
| 	} | ||||
| } | ||||
| @@ -31,9 +31,13 @@ func main() { | ||||
| 	// optionally setup command line usage | ||||
| 	cmd.Init() | ||||
|  | ||||
| 	md := server.Config().Metadata() | ||||
| 	md["datacenter"] = "local" | ||||
|  | ||||
| 	server.DefaultServer = server.NewServer( | ||||
| 		server.WrapHandler(logWrapper), | ||||
| 		server.WrapSubscriber(logSubWrapper), | ||||
| 		server.Metadata(md), | ||||
| 	) | ||||
|  | ||||
| 	// Initialise Server | ||||
|   | ||||
		Reference in New Issue
	
	Block a user