/
main.go
74 lines (66 loc) · 1.69 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"flag"
"fmt"
"log"
"net"
"net/http"
"os"
"os/signal"
"syscall"
"time"
ratelimitkit "github.com/go-kit/kit/ratelimit"
"github.com/juju/ratelimit"
"github.com/matryer/goblueprints/chapter10/vault"
"github.com/matryer/goblueprints/chapter10/vault/pb"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
func main() {
var (
httpAddr = flag.String("http", ":8080", "http listen address")
gRPCAddr = flag.String("grpc", ":8081", "gRPC listen address")
)
flag.Parse()
ctx := context.Background()
srv := vault.NewService()
errChan := make(chan error)
go func() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
errChan <- fmt.Errorf("%s", <-c)
}()
rlbucket := ratelimit.NewBucket(1*time.Second, 5)
hashEndpoint := vault.MakeHashEndpoint(srv)
{
hashEndpoint = ratelimitkit.NewTokenBucketThrottler(rlbucket, time.Sleep)(hashEndpoint)
}
validateEndpoint := vault.MakeValidateEndpoint(srv)
{
validateEndpoint = ratelimitkit.NewTokenBucketThrottler(rlbucket, time.Sleep)(validateEndpoint)
}
endpoints := vault.Endpoints{
HashEndpoint: hashEndpoint,
ValidateEndpoint: validateEndpoint,
}
// HTTP transport
go func() {
log.Println("http:", *httpAddr)
handler := vault.NewHTTPServer(ctx, endpoints)
errChan <- http.ListenAndServe(*httpAddr, handler)
}()
// gRPC transport
go func() {
listener, err := net.Listen("tcp", *gRPCAddr)
if err != nil {
errChan <- err
return
}
log.Println("grpc:", *gRPCAddr)
handler := vault.NewGRPCServer(ctx, endpoints)
gRPCServer := grpc.NewServer()
pb.RegisterVaultServer(gRPCServer, handler)
errChan <- gRPCServer.Serve(listener)
}()
log.Fatalln(<-errChan)
}