Strip cache from the client. Its only used externally in a wrapper
This commit is contained in:
parent
82e8298b73
commit
f55701b374
@ -1,66 +0,0 @@
|
|||||||
package client
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"hash/fnv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/micro/go-micro/v3/metadata"
|
|
||||||
cache "github.com/patrickmn/go-cache"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewCache returns an initialised cache.
|
|
||||||
func NewCache() *Cache {
|
|
||||||
return &Cache{
|
|
||||||
cache: cache.New(cache.NoExpiration, 30*time.Second),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cache for responses
|
|
||||||
type Cache struct {
|
|
||||||
cache *cache.Cache
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a response from the cache
|
|
||||||
func (c *Cache) Get(ctx context.Context, req Request) (interface{}, bool) {
|
|
||||||
return c.cache.Get(key(ctx, req))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set a response in the cache
|
|
||||||
func (c *Cache) Set(ctx context.Context, req Request, rsp interface{}, expiry time.Duration) {
|
|
||||||
c.cache.Set(key(ctx, req), rsp, expiry)
|
|
||||||
}
|
|
||||||
|
|
||||||
// List the key value pairs in the cache
|
|
||||||
func (c *Cache) List() map[string]string {
|
|
||||||
items := c.cache.Items()
|
|
||||||
|
|
||||||
rsp := make(map[string]string, len(items))
|
|
||||||
for k, v := range items {
|
|
||||||
bytes, _ := json.Marshal(v.Object)
|
|
||||||
rsp[k] = string(bytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
return rsp
|
|
||||||
}
|
|
||||||
|
|
||||||
// key returns a hash for the context and request
|
|
||||||
func key(ctx context.Context, req Request) string {
|
|
||||||
ns, _ := metadata.Get(ctx, "Micro-Namespace")
|
|
||||||
|
|
||||||
bytes, _ := json.Marshal(map[string]interface{}{
|
|
||||||
"namespace": ns,
|
|
||||||
"request": map[string]interface{}{
|
|
||||||
"service": req.Service(),
|
|
||||||
"endpoint": req.Endpoint(),
|
|
||||||
"method": req.Method(),
|
|
||||||
"body": req.Body(),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
h := fnv.New64()
|
|
||||||
h.Write(bytes)
|
|
||||||
return fmt.Sprintf("%x", h.Sum(nil))
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
package client
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/micro/go-micro/v3/metadata"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestCache(t *testing.T) {
|
|
||||||
ctx := context.TODO()
|
|
||||||
req := &testRequest{service: "go.micro.service.foo", method: "Foo.Bar"}
|
|
||||||
|
|
||||||
t.Run("CacheMiss", func(t *testing.T) {
|
|
||||||
if _, ok := NewCache().Get(ctx, req); ok {
|
|
||||||
t.Errorf("Expected to get no result from Get")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("CacheHit", func(t *testing.T) {
|
|
||||||
c := NewCache()
|
|
||||||
|
|
||||||
rsp := "theresponse"
|
|
||||||
c.Set(ctx, req, rsp, time.Minute)
|
|
||||||
|
|
||||||
if res, ok := c.Get(ctx, req); !ok {
|
|
||||||
t.Errorf("Expected a result, got nothing")
|
|
||||||
} else if res != rsp {
|
|
||||||
t.Errorf("Expected '%v' result, got '%v'", rsp, res)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCacheKey(t *testing.T) {
|
|
||||||
ctx := context.TODO()
|
|
||||||
|
|
||||||
req1 := &testRequest{service: "go.micro.service.foo", method: "Foo.Bar"}
|
|
||||||
req2 := &testRequest{service: "go.micro.service.foo", method: "Foo.Baz"}
|
|
||||||
req3 := &testRequest{service: "go.micro.service.foo", method: "Foo.Bar", body: "customquery"}
|
|
||||||
|
|
||||||
t.Run("IdenticalRequests", func(t *testing.T) {
|
|
||||||
key1 := key(ctx, req1)
|
|
||||||
key2 := key(ctx, req1)
|
|
||||||
if key1 != key2 {
|
|
||||||
t.Errorf("Expected the keys to match for identical requests and context")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("DifferentRequestEndpoints", func(t *testing.T) {
|
|
||||||
key1 := key(ctx, req1)
|
|
||||||
key2 := key(ctx, req2)
|
|
||||||
|
|
||||||
if key1 == key2 {
|
|
||||||
t.Errorf("Expected the keys to differ for different request endpoints")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("DifferentRequestBody", func(t *testing.T) {
|
|
||||||
key1 := key(ctx, req2)
|
|
||||||
key2 := key(ctx, req3)
|
|
||||||
|
|
||||||
if key1 == key2 {
|
|
||||||
t.Errorf("Expected the keys to differ for different request bodies")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("DifferentMetadata", func(t *testing.T) {
|
|
||||||
mdCtx := metadata.Set(context.TODO(), "Micro-Namespace", "bar")
|
|
||||||
key1 := key(mdCtx, req1)
|
|
||||||
key2 := key(ctx, req1)
|
|
||||||
|
|
||||||
if key1 == key2 {
|
|
||||||
t.Errorf("Expected the keys to differ for different metadata")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
@ -36,9 +36,6 @@ type Options struct {
|
|||||||
PoolSize int
|
PoolSize int
|
||||||
PoolTTL time.Duration
|
PoolTTL time.Duration
|
||||||
|
|
||||||
// Response cache
|
|
||||||
Cache *Cache
|
|
||||||
|
|
||||||
// Middleware for client
|
// Middleware for client
|
||||||
Wrappers []Wrapper
|
Wrappers []Wrapper
|
||||||
|
|
||||||
@ -55,8 +52,6 @@ type CallOptions struct {
|
|||||||
Address []string
|
Address []string
|
||||||
// Backoff func
|
// Backoff func
|
||||||
Backoff BackoffFunc
|
Backoff BackoffFunc
|
||||||
// Duration to cache the response for
|
|
||||||
CacheExpiry time.Duration
|
|
||||||
// Transport Dial Timeout
|
// Transport Dial Timeout
|
||||||
DialTimeout time.Duration
|
DialTimeout time.Duration
|
||||||
// Number of Call attempts
|
// Number of Call attempts
|
||||||
@ -109,7 +104,6 @@ type RequestOptions struct {
|
|||||||
|
|
||||||
func NewOptions(options ...Option) Options {
|
func NewOptions(options ...Option) Options {
|
||||||
opts := Options{
|
opts := Options{
|
||||||
Cache: NewCache(),
|
|
||||||
Context: context.Background(),
|
Context: context.Background(),
|
||||||
ContentType: "application/protobuf",
|
ContentType: "application/protobuf",
|
||||||
Codecs: make(map[string]codec.NewCodec),
|
Codecs: make(map[string]codec.NewCodec),
|
||||||
@ -357,14 +351,6 @@ func WithAuthToken() CallOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithCache is a CallOption which sets the duration the response
|
|
||||||
// shoull be cached for
|
|
||||||
func WithCache(c time.Duration) CallOption {
|
|
||||||
return func(o *CallOptions) {
|
|
||||||
o.CacheExpiry = c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithNetwork is a CallOption which sets the network attribute
|
// WithNetwork is a CallOption which sets the network attribute
|
||||||
func WithNetwork(n string) CallOption {
|
func WithNetwork(n string) CallOption {
|
||||||
return func(o *CallOptions) {
|
return func(o *CallOptions) {
|
||||||
|
Loading…
Reference in New Issue
Block a user