Сегодня мы создадим несложное веб-приложение, в котором по списку авторов будет производится поиск их произведений с помощью Google Books API.
Подготовка
Для начала установите утилиту командной строки для Google Cloud SDK.
Создание проекта Google Cloud
С помощью команды gcloud alpha create создадим новый проект. Так как это пока альфа-релиз утилиты, её поведение может измениться в будущем. Другой способ — с помощью веб-сайта https://console.cloud.google.com.
$ gcloud alpha projects create go-serverless
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/go-serverless].
Waiting for [operations/pc.7509198304344852511] to finish…done.
Если это не первый ваш проект в Google Cloud, есть замечательная команда для просмотра всех ваших проектов:
$ gcloud projects list
PROJECT_ID NAME PROJECT_NUMBER
bespokemirrorapi bespokemirrorapi 811093430365
gdgnoco-fortune gdgnoco-fortune 861018601285
go-serverless go-serverless 49448245715
…
Выбор проекта по-умолчанию
Все последующие вызовы команды gcloud будут ассоциироваться с определённым проектом, поэтому будет лучше если мы сконфигурируем созданный проект как основной. При создании проекта он автоматически не становится основным.
Выведем все имеющиеся проекты командой gcloud config list и установим нужный командой gcloud set ….
Установим свойство core/project в go-serverless:
$ gcloud config set core/project go-serverless
Updated property [core/project].
$ gcloud config list
[compute]
zone = us-central1-c
[core]
account = ghchinoy@gmail.com
disable_usage_reporting = False
project = go-serverless
Your active configuration is: [default]
Создание локального приложения
- Создадим папку проекта
- Создадим файл для деплоя app.yaml
Обычно проекты Go создают в папке $GOPATH\src, в папке, связанной с репозиторием. Здесь я создаю проект, который связан с моим репозиторием github и перехожу в эту папку:
$ mkdir -p $GOPATH/src/github.com/ghchinoy/go-serverless
$ cd $GOPATH/src/github.com/ghchinoy/go-serverless
Добавим файл app.yaml:
runtime: go
env: flex
api_version: 1
skip_files:
- README.md
Добавим код в main.go (полный исходный код лежит здесь):
package main
import (
"fmt"
"html/template"
"io/ioutil"
"log"
"path/filepath"
"net/http"
"github.com/gorilla/mux"
"google.golang.org/appengine"
)
var (
// html templates
booklistTmpl = parseTemplate("list.html")
authordetailTmpl = parseTemplate("detail.html")
)
func main() {
log.Println("bookshelf")
r := mux.NewRouter()
r.Path("/").Methods("GET").Handler(apiHandler(listBooksHandler))
r.Path("/author/{author}").Methods("GET").Handler(apiHandler(showBooksByAuthorHandler))
appengine.Main()
}
func listBooksHandler(w http.ResponseWriter, r *http.Request) *apiError {
authors := struct {
Authors []string
}{
Authors: []string{
"Miguel de Cervantes",
"Charles Dickens",
"Antoine de Saint-Exupéry",
"J. K. Rowling",
},
}
return booklistTmpl.Execute(w, r, authors)
}
func showBooksByAuthorHandler(w http.ResponseWriter, r *http.Request) *apiError {
vars := mux.Vars(r)
authorInfo := struct {
Author string
}{
Author: vars["author"],
}
return authordetailTmpl.Execute(w, r, authorInfo)
}
Тестируем приложение
Запустим приложение и откроем браузер на http://localhost:8080
$ go run main.go template.go
2017/03/30 15:55:21 booklist
127.0.0.1 — — [30/Mar/2017:15:55:24 -0600] “GET / HTTP/1.1” 200 1584 “” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3056.0 Safari/537.36”
…
* оформление страницы опускаем здесь, его можно взять в репозитории.
Деплой
Перейдём в консоль Google Cloud и настроим параметры проекта, для этого откройте https://console.developers.google.com/project/go-serverless/settings, заменив go-serverless на название вашего проекта.
$ gcloud app deploy
You are creating an app for project [go-serverless].
WARNING: Creating an App Engine application for a project is irreversible and the region
cannot be changed. More information about regions is at
https://cloud.google.com/appengine/docs/locations.
Please choose the region where you want your App Engine application
located:
[1] europe-west (supports standard and flexible)
[2] us-east1 (supports standard and flexible)
[3] us-central (supports standard and flexible)
[4] asia-northeast1 (supports standard and flexible)
[5] cancel
Please enter your numeric choice: 3
Creating App Engine application in project [go-serverless] and region [us-central]….done.
You are about to deploy the following services:
— go-serverless/default/20170330t205543 (from [/Users/ghc/dev/go/src/github.com/ghchinoy/go-serverless/app.yaml])
Deploying to URL: [https://go-serverless.appspot.com]
Do you want to continue (Y/n)? Y
If this is your first deployment, this may take a while…done.
Beginning deployment of service [default]…
Building and pushing image for service [default]
Some files were skipped. Pass ` — verbosity=info` to see which ones
…
Updating service [default]…done.
Deployed service [default] to [https://go-serverless.appspot.com]
You can stream logs from the command line by running:
$ gcloud app logs tail -s default
To view your application in the web browser run:
$ gcloud app browse
Готово! Мой проект лежит тут: https://go-serverless.appspot.com/
Подготовлено по материалам «Building a Serverless Go App on Google Cloud»
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).