78 lines
2.4 KiB
Go
78 lines
2.4 KiB
Go
package cache_test
|
|
|
|
import (
|
|
"time"
|
|
|
|
"go-common/library/cache/memcache"
|
|
"go-common/library/container/pool"
|
|
"go-common/library/ecode"
|
|
"go-common/library/net/http/blademaster"
|
|
"go-common/library/net/http/blademaster/middleware/cache"
|
|
"go-common/library/net/http/blademaster/middleware/cache/store"
|
|
xtime "go-common/library/time"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// This example create a cache middleware instance and two cache policy,
|
|
// then attach them to the specified path.
|
|
//
|
|
// The `PageCache` policy will attempt to cache the whole response by URI.
|
|
// It usually used to cache the common response.
|
|
//
|
|
// The `Degrader` policy usually used to prevent the API totaly unavailable if any disaster is happen.
|
|
// A succeeded response will be cached per 600s.
|
|
// The cache key is generated by specified args and its values.
|
|
// You can using file or memcache as cache backend for degradation currently.
|
|
//
|
|
// The `Cache` policy is used to work with multilevel HTTP caching architecture.
|
|
// This will cause client side response caching.
|
|
// We only support weak validator with `ETag` header currently.
|
|
func Example() {
|
|
mc := store.NewMemcache(&memcache.Config{
|
|
Config: &pool.Config{
|
|
Active: 10,
|
|
Idle: 2,
|
|
IdleTimeout: xtime.Duration(time.Second),
|
|
},
|
|
Name: "test",
|
|
Proto: "tcp",
|
|
Addr: "172.16.33.54:11211",
|
|
DialTimeout: xtime.Duration(time.Second),
|
|
ReadTimeout: xtime.Duration(time.Second),
|
|
WriteTimeout: xtime.Duration(time.Second),
|
|
})
|
|
ca := cache.New(mc)
|
|
deg := cache.NewDegrader(10)
|
|
pc := cache.NewPage(10)
|
|
ctl := cache.NewControl(10)
|
|
filter := func(ctx *blademaster.Context) bool {
|
|
if ctx.Request.Form.Get("cache") == "false" {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
engine := blademaster.Default()
|
|
engine.GET("/users/profile", ca.Cache(deg.Args("name", "age"), nil), func(c *blademaster.Context) {
|
|
values := c.Request.URL.Query()
|
|
name := values.Get("name")
|
|
age := values.Get("age")
|
|
|
|
err := errors.New("error from others") // error from other call
|
|
if err != nil {
|
|
// mark this response should be degraded
|
|
c.JSON(nil, ecode.Degrade)
|
|
return
|
|
}
|
|
c.JSON(map[string]string{"name": name, "age": age}, nil)
|
|
})
|
|
engine.GET("/users/index", ca.Cache(pc, nil), func(c *blademaster.Context) {
|
|
c.String(200, "%s", "Title: User")
|
|
})
|
|
engine.GET("/users/list", ca.Cache(ctl, filter), func(c *blademaster.Context) {
|
|
c.JSON([]string{"user1", "user2", "user3"}, nil)
|
|
})
|
|
engine.Run(":18080")
|
|
}
|