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 | 	// optionally setup command line usage | ||||||
| 	cmd.Init() | 	cmd.Init() | ||||||
|  |  | ||||||
|  | 	md := server.Config().Metadata() | ||||||
|  | 	md["datacenter"] = "local" | ||||||
|  |  | ||||||
| 	server.DefaultServer = server.NewServer( | 	server.DefaultServer = server.NewServer( | ||||||
| 		server.WrapHandler(logWrapper), | 		server.WrapHandler(logWrapper), | ||||||
| 		server.WrapSubscriber(logSubWrapper), | 		server.WrapSubscriber(logSubWrapper), | ||||||
|  | 		server.Metadata(md), | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	// Initialise Server | 	// Initialise Server | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user