Google Cloud Endpoints Guickstart

Сейчас тема Miscroservices популярна как никогда. Вот и компания Google не осталась в стороне и добавила в свою платформу для разработки облачных приложений Google Cloud (в девичестве Google App Engine) инструмент для разработки микросервисов - Endpoints.

Данный инструмент  позволяет создавать REST-сервисы с использованием языков Java и Python (нас естественно интересует Java), деплоить на Google Cloud и использовать их затем либо из веб-приложений либо c мобильного приложения.

Далее ожидается что вы знаете язык Java (и у вас установлена как минимум версия 7.0), вы умеете пользоваться Maven-ом и GIT-ом.

Простейший HelloWorld проект

Не будем изобретать велосипед - для ознакомления проще всего взять готовый HelloWorld пример - https://github.com/GoogleCloudPlatform/appengine-endpoints-helloworld-java-maven:

git clone https://github.com/GoogleCloudPlatform/appengine-endpoints-helloworld-java-maven

 

Если вы захотите создать свой проект - то следуйте инструкции https://cloud.google.com/appengine/docs/java/endpoints/set-up-environment - только не используется GAE 1.9.37 - в ней ошибка (на текущий момент последняя версия 1.9.38 и в ней все работает хорошо).

На что обратить внимание:

Класс реализующий API

В данном проекте реализова один сервис с несколькими методами - за реализацию сервиса отвечает класс YourFirstAPI. Описание параметров сервиса задается аннтацией @Api

@Api(name = "myApi",
    version = "v1",
    namespace = @ApiNamespace(ownerDomain = "helloworld.example.com",
        ownerName = "helloworld.example.com",
        packagePath = ""))
public class YourFirstAPI {

 

Для того, что бы к вашему классу шло обращение - его необходимо так же указать в web.xml.

Реализация методов API

Для реализации метода используется аннотация @ApiMethod.

  @ApiMethod(name = "sayHi")
  public MyBean sayHi(@Named("name") String name) {

Надо указать имя метода, можно указать так же HttpMethod (GET/POST - POST по умолчанию).

Ну и в самом методе обработка запроса. Можно возвращать объект (в нашем случае MyBean) - он автоматически будет сконвертирован в JSON.

Авторизация

Одна из основных "фишек" Google Cloud Endpoints - поддержка OAuth2 авторизации "из коробки" - очень удобно в случае, если вам необходимо разработкать сервис, к которому будут обращаться пользователи с учеткой Google. Если ожидается что сервис будет вызываться с авторизацией - то добавьте в него параметр c типом User:

public MyBean sayHiUser(@Named("name") String name, User user)
      throws OAuthRequestException, IOException {
    MyBean response = new MyBean();
    response.setData("Hi, " + name + "(" + user.getEmail() + ")");
    return response;
  }

 

Данный метод не просто говорит "Привет" - но и возвращает email пользователя, от учетки которого произошло обращение.

Запуск проекта локально

Для того, что бы посмотреть что получилось локально - необходимо выполнить команду мавен:

mvn appengine:devserver

Если все хорошо - через какое-то время ваши сервисы запустятся на http://localhost:8080

Самый простой способ "поиграть" с сервисами - это использовать Service Explorer: http://localhost:8080/_ah/api/explorer.

НО! Для того что бы он работал, необходимо запустить Chrome из командной строки со специальным набором команд:

[path-to-Chrome] --user-data-dir=test --unsafely-treat-insecure-origin-as-secure=http://localhost:8080

У меня на MacOS X это было

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=test
--unsafely-treat-insecure-origin-as-secure=http://localhost:8080

После этого в открывшемся окне вводите URL http://localhost:8080/_ah/api/explorer и вы должны получить список доступных API (и при клике на нем - список доступных методов)

В API вы можете вызвать любой из методов (пройдя предварительно авторизацию - если это требуется), посмотреть каким запросом метод вызывался (если что - можно повторить потом curl-ом), посмотреть ответ:

Регистрация проекта

Для того, что бы задеплоить проект на Google Cloud необходимо сначала зарегистрировать проект - идем в консоль разработчика - https://console.cloud.google.com/home/dashboard и в верхнем тулбаре (где выпадающий список с проектами) выбираем "Create Project...".  Проект можно создавать с настройками по умолчанию - важно - при создании вы зададите ему уникальный ID (например my-super-unique-application-id).

Далее его надо прописать appengine-web.xml (в случае если вы генерировали проект то еще и в pom.xml). После этого вызываем maven:

mvn appengine:update

И после несложного шага авторизации (maven должен убедится что у него есть права на деплой приложения в указанный проект) проект будет задеплоен и запущен в Google Cloud.

Цена вопроса?

Итак, вы получили сервис, запущенный в Google Cloud и использующий все его блага (автоматические масштабирование и так далее и так далее). Сколько стоит? Нисколько. Ну то есть сами endpoint - нисколько. Вам будет необходимо платить только за ресурсы и другие сервисы Google которые он использует.