func main() {
	addr := flag.String("listen", "0.0.0.0:9003", "Endpoint address")
	redisEndpoint := flag.String("redis", "127.0.0.1:6379", "Redis endpoint")
	services.ParseBalanceEndpointsFlags()
	flag.Parse()
	services.ParseLoadBalanceConfig()
	services.EnableResponseLogging()
	golib.ConfigureOpenFilesLimit()

	redisClient, err := services.ConnectRedis(*redisEndpoint)
	if err != nil {
		log.Fatalln(err)
	}

	if err := services.RegisterLockScripts(redisClient); err != nil {
		log.Fatalln("Failed to register redis scripts", err)
	}

	catalog := &Catalog{
		redis:          redisClient,
		redisLockValue: services.EndpointLockValue(*addr),
	}
	if err := fillDefaultCatalog(catalog); err != nil {
		log.Fatalln("Error filling default catalog:", err)
	}
	go catalog.RefillItems(refill_timeout, map[string]uint64{
		"DVD":       500,
		"Toaster":   100,
		"Laptop":    50,
		"TV":        10,
		"Spaceship": 1,
	})

	mux := mux.NewRouter()
	mux.HandleFunc("/items", catalog.show_items).Methods("GET")
	mux.HandleFunc("/item/{name}", catalog.show_item).Methods("GET")
	mux.HandleFunc("/item/{name}/ship", catalog.ship_item).Methods("POST").MatcherFunc(services.MatchFormKeys("user", "qty", "ts"))
	mux.HandleFunc("/shipment/{id}", catalog.show_shipment).Methods("GET")
	mux.HandleFunc("/shipment/{id}/commit", catalog.commit_shipment).Methods("POST")
	mux.HandleFunc("/shipment/{id}/cancel", catalog.cancel_shipment).Methods("POST")
	mux.HandleFunc("/shipment/{id}/deliver", catalog.deliver_shipment).Methods("POST")
	services.L.Warnf("Running on " + *addr)
	if err := http.ListenAndServe(*addr, mux); err != nil {
		log.Fatal(err)
	}
}
func main() {
	addr := flag.String("listen", "0.0.0.0:9004", "Endpoint address")
	redisEndpoint := flag.String("redis", "127.0.0.1:6379", "Redis endpoint")
	paymentEndpoint := flag.String("payment", "localhost:9002", "Endpoint for payment service")
	catalogEndpoint := flag.String("catalog", "localhost:9003", "Endpoint for catalog service")
	services.ParseBalanceEndpointsFlags()
	flag.Parse()
	services.ParseLoadBalanceConfig()
	services.EnableResponseLogging()
	golib.ConfigureOpenFilesLimit()

	redisClient, err := services.ConnectRedis(*redisEndpoint)
	if err != nil {
		log.Fatalln(err)
	}

	if err := services.RegisterLockScripts(redisClient); err != nil {
		log.Fatalln("Failed to register redis scripts", err)
	}

	shop := &Shop{
		redis:           redisClient,
		redisLockValue:  services.EndpointLockValue(*addr),
		catalogEndpoint: *catalogEndpoint,
		paymentEndpoint: *paymentEndpoint,
	}
	launchOrderProcessing(shop)

	mux := mux.NewRouter()
	mux.HandleFunc("/shop", shop.show_items).Methods("GET")
	mux.HandleFunc("/order", shop.order_item).Methods("POST").MatcherFunc(services.MatchFormKeys("user", "item", "qty"))
	mux.HandleFunc("/order/{order}", shop.get_order).Methods("GET")
	mux.HandleFunc("/orders/{user}", shop.show_orders).Methods("GET")

	services.L.Warnf("Running on " + *addr)
	if err := http.ListenAndServe(*addr, mux); err != nil {
		log.Fatal(err)
	}
}
func main() {
	execFolder, err := osext.ExecutableFolder()
	check(err)
	configFile := flag.String("conf", execFolder+"/isolator.ini", "Config containing isolated external services")
	statsAddr := flag.String("stats", ":7777", "Address to serve statistics (HTTP+JSON on "+stats_path+" and "+runtime_path+")")
	dialTimeout := flag.Duration("timeout", 5*time.Second, "Timeout for outgoing TCP connections")
	flag.Parse()
	golib.ConfigureOpenFilesLimit()

	confIni, err := ini.Load(*configFile)
	check(err)

	p := proxy.NewIsolationProxy(
		loadServiceRegistry(confIni),
		*dialTimeout,
	)
	services.EnableResponseLogging()
	p.ServeStats(stats_path)
	proxy.ServeRuntimeStats(runtime_path)
	handleServices(confIni, p)
	check(http.ListenAndServe(*statsAddr, nil))
}
func main() {
	addr := flag.String("listen", "0.0.0.0:9002", "Endpoint address")
	redisEndpoint := flag.String("redis", "127.0.0.1:6379", "Redis endpoint")
	bankEndpoint := flag.String("bank", "localhost:9001", "Endpoint for bank service")
	services.ParseBalanceEndpointsFlags()
	flag.Parse()
	services.ParseLoadBalanceConfig()
	services.EnableResponseLogging()
	golib.ConfigureOpenFilesLimit()

	bank := bankApi.NewHttpBank(*bankEndpoint)
	redisClient, err := services.ConnectRedis(*redisEndpoint)
	if err != nil {
		log.Fatalln(err)
	}

	if err := services.RegisterLockScripts(redisClient); err != nil {
		log.Fatalln("Failed to register redis scripts", err)
	}

	payments := &Payments{
		bank:           bank,
		redis:          redisClient,
		accountName:    "store",
		redisLockValue: services.EndpointLockValue(*addr),
	}
	mux := mux.NewRouter()
	mux.HandleFunc("/payment", payments.new_payment).Methods("POST").MatcherFunc(services.MatchFormKeys("user", "value", "ts"))
	mux.HandleFunc("/payment/{id}", payments.show_payment).Methods("GET")
	mux.HandleFunc("/payment/{id}/commit", payments.commit_payment).Methods("POST")
	mux.HandleFunc("/payment/{id}/cancel", payments.cancel_payment).Methods("POST")

	services.L.Warnf("Running on " + *addr)
	if err := http.ListenAndServe(*addr, mux); err != nil {
		log.Fatal(err)
	}
}
func main() {
	golib.ConfiguredOpenFilesLimit = 40000
	addr := flag.String("listen", "0.0.0.0:9001", "Endpoint address")
	flag.Parse()
	services.EnableResponseLogging()
	golib.ConfigureOpenFilesLimit()

	store := NewAccountStore(1000, 200)

	mux := mux.NewRouter()
	mux.HandleFunc("/stats", store.show_stats).Methods("GET")
	mux.HandleFunc("/account/{id}", store.show_account).Methods("GET")
	mux.HandleFunc("/account/{id}/deposit", store.handle_deposit).Methods("POST").MatcherFunc(services.MatchFormKeys("value"))
	mux.HandleFunc("/account/{id}/transfer", store.handle_transfer).Methods("POST").MatcherFunc(services.MatchFormKeys("value", "target"))
	mux.HandleFunc("/transaction/{id}", store.show_transaction).Methods("GET")
	mux.HandleFunc("/transaction/{id}/cancel", store.cancel_transaction).Methods("POST")
	mux.HandleFunc("/transaction/{id}/revert", store.revert_transaction).Methods("POST")
	mux.HandleFunc("/transaction/{id}/commit", store.commit_transaction).Methods("POST")

	services.L.Warnf("Running on " + *addr)
	if err := http.ListenAndServe(*addr, mux); err != nil {
		log.Fatal(err)
	}
}