1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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")
- }
|