-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
60 lines (48 loc) · 1.74 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package main
import (
"github.com/hashicorp/golang-lru/v2/expirable"
"github.com/muchq/moonbase/go/clock"
"github.com/muchq/moonbase/go/mucks"
"github.com/muchq/moonbase/go/resilience4g/rate_limit"
"log"
"net/http"
"time"
)
func MakeShortenerApi(config Config) *ShortenerApi {
shortDB := NewShortDB(config)
cacheConfig := config.CacheConfig
cache := expirable.NewLRU[string, string](cacheConfig.MaxItems, nil, time.Minute*cacheConfig.ExpirationMinutes)
shortener := NewShortener(shortDB, cache)
return NewShortenerApi(clock.NewSystemUtcClock(), shortener)
}
func MakeFallbackLimiterMiddleware(config rate_limit.RateLimiterConfig) mucks.Middleware {
return rate_limit.NewRateLimiterMiddleware(
rate_limit.TokenBucketRateLimiterFactory{},
rate_limit.ConstKeyExtractor{},
config)
}
func MakeIpRateLimiterMiddleware(config rate_limit.RateLimiterConfig) mucks.Middleware {
return rate_limit.NewRateLimiterMiddleware(
rate_limit.TokenBucketRateLimiterFactory{},
rate_limit.RemoteIpKeyExtractor{},
config)
}
func main() {
config := ReadConfig()
shortenerApi := MakeShortenerApi(config)
defer shortenerApi.Close()
router := mucks.NewMucks()
// Add fallback rate-limiter at the router layer
fallbackRateLimiter := MakeFallbackLimiterMiddleware(FallbackRateLimiterConfig)
router.Add(fallbackRateLimiter)
// Ping endpoint
router.HandleFunc("GET /ping", PingHandler)
// Rate-limited Shorten API endpoint
shortenRateLimiter := MakeIpRateLimiterMiddleware(ShortenRateLimiterConfig)
router.HandleFunc("POST /shorten",
shortenRateLimiter.Wrap(shortenerApi.ShortenHandler))
// Non rate-limited Redirect API endpoint
router.HandleFunc("GET /r/{slug}",
shortenerApi.RedirectHandler)
log.Fatal(http.ListenAndServe(":"+config.Port, router))
}