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
|
// 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
|
||||||
|
Loading…
Reference in New Issue
Block a user