Недавно попробовал написать впервые свой сервер для игры, до этого из связанного с серверной только давным-давно писал на PHP под популярные CMS.
1)В качестве платформы для запуска используется OpenShift, на время разработки - бесплатный тариф. Так и смог заставить запуститься этот картридж:
https://github.com/smarterclayton/openshift-go-cart в режиме пакета, а не запуска файла web.go, поэтому пришлось всё писать в одном файле. Это ужасно:) Может быть, есть какой-то пример настроенного для openshift картриджа, который может запускаться в виде пакета?
2)В качестве БД используется PostgreSQL со стандартными запросами вроде select, update и delete. Но периодически возникает ошибка "pq: sorry, too many clients already". Это значит, что нужно использовать другую библиотеку, не
http://github.com/lib/pq? Или функция main выполняется при каждом обращении к серверу, и, таким образом, при каждом запросе образуется новое соединение? Хотя не похоже на это.
dbinfo := fmt.Sprintf("user=%s password=%s dbname=%s host=%s port=%s sslmode=disable",
DB_USER, DB_PASSWORD, DB_NAME, os.Getenv("OPENSHIFT_POSTGRESQL_DB_HOST"), os.Getenv("OPENSHIFT_POSTGRESQL_DB_PORT"))
var err error
DatabaseConnection, err = sql.Open("postgres", dbinfo)
handleError(err, nil)
createDatabase()
router := httprouter.New()
router.GET("/", index)
router.GET("/config/:action", configManage)
router.POST("/user/:action", userManage)
router.POST("/event/:action", eventUnlock)
router.GET("/event/:userid", eventsList)
router.GET("/bonus/:userid", bonusesList)
router.POST("/bonus/use/:bonus", decreaseBonus)
router.GET("/resources/:userid", resourcesList)
router.POST("/tramlives/decrease", decreaseTramLives)
router.GET("/tramlives/get/:userid", checkTramLives)
router.POST("/combination/:action", combinationManage)
bind := fmt.Sprintf("%s:%s", os.Getenv("OPENSHIFT_GO_IP"), os.Getenv("OPENSHIFT_GO_PORT"))
fmt.Printf("listening on %s...", bind)
log.Fatal(http.ListenAndServe(bind, router))