Add example dc filter
This commit is contained in:
parent
a2c862dd21
commit
066c169845
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
|
||||
|
Loading…
Reference in New Issue
Block a user