Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Cloud Functions
  • Сопоставление с другими сервисами Yandex Cloud
    • Обзор
      • Обзор
      • Интерфейс Function
      • Интерфейс YcFunction
      • Класс HttpServlet
      • Spring Boot
    • Управление зависимостями
    • Обработчик запросов
    • Контекст вызова
    • Журналирование
    • Обработка ошибок
    • Использование SDK
  • Инструменты
  • Правила тарификации
  • Управление доступом
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы
  1. Разработка на Java
  2. Модель программирования
  3. Spring Boot

Использование аннотации SpringBootApplication для задания обработчика на Java

Статья создана
Yandex Cloud
Улучшена
Обновлена 27 января 2025 г.

Вы можете задать обработчик на Java, загрузив Spring Boot приложение с точкой входа в виде класса, помеченного аннотацией SpringBootApplication.

В момент исполнения функция Cloud Functions не имеет данных о пути, по которому она была вызвана. Другими словами, при наличии эндпоинта /api/v1/list в вашем Spring Boot приложении, вызвать функцию по адресу https://functions.yandexcloud.net/function-id/api/v1/list не получится, вместо этого нужно передать данные о пути в теле запроса (параметр url) или воспользоваться интеграцией с API Gateway. Мы рекомендуем именно второй способ, поскольку API Gateway наиболее прост в использовании со Spring Boot приложением, а так же позволяет обращаться к эндпоинтам приложения привычным образом.

В случае, если логика вашего приложения использует классы HttpServletRequest и HttpServletResponse, обратите внимание, что сервис Cloud Functions поддерживает не все методы этих классов. Подробнее ознакомиться со списком неподдерживаемых методов можно здесь.

Cloud Functions не поддерживает Spring Boot Loader.

Пример: простое приложение с эндпоинтомПример: простое приложение с эндпоинтом

Следующее приложение имеет один эндпоинт: GET: /get/{name}. По GET запросу по адресу /get с указанным параметром пути функция вернет строку Hello, $name, где $name — переданный параметр пути. В примере используется публичная функция. Если ваша функция приватная, укажите в спецификации API-шлюза сервисный аккаунт с ролью functions.functionInvoker.

  1. Создайте функцию.

  2. Создайте ZIP-архив со следующей структурой:

    src
    |__main
        |__java
            |__util
                |__Application.java
                |__controller
                    |__TestController.java
    pom.xml
    
    • Файл Application.java:

      package util;
      
      import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      
      @SpringBootApplication
      public class Application {
          public static void main(String[] args) {
              SpringApplication.run(Application.class, args);
          }
      }
      
    • Файл TestController.java:

      package util.controller;
      
      import org.springframework.web.bind.annotation.*;
      
      @RestController
      public class TestController {
          @GetMapping("/get/{name}")
          public String get(@PathVariable String name) {
              return String.format("Hello, %s!", name);
          }
      }
      
    • Файл pom.xml:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.4.7</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
      
          <groupId>util</groupId>
          <artifactId>util</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      
          <properties>
              <java.version>11</java.version>
              <spring.version>5.2.9.RELEASE</spring.version>
              <spring.boot.version>2.3.4.RELEASE</spring.boot.version>
              <start-class>util.Application</start-class>
          </properties>
      
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter</artifactId>
                  <version>${spring.boot.version}</version>
              </dependency>
      
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
                  <version>${spring.boot.version}</version>
              </dependency>
      
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>4.0.1</version>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                  </plugin>
              </plugins>
          </build>
      
      </project>
      
  3. Создайте версию функции и укажите:

    • Среда выполнения — java17.
    • Способ — ZIP-архив.
    • Файл — загрузите архив, созданный ранее.
    • Таймаут — 30.
    • Память — 128 МБ.
    • Точка входа — util.Application.
  4. Создайте API-шлюз API Gateway и добавьте в него спецификацию:

    openapi: 3.0.0
    info:
      title: Test API
      version: 1.0.0
    paths:
      /get/{name}:
        get:
          x-yc-apigateway-integration:
            type: cloud-functions
            function_id: <идентификатор_функции>
            service_account_id: <идентификатор_сервисного_аккаунта>
          operationId: get
          parameters:
          - description: my param
            explode: false
            in: path
            name: name
            required: true
            schema:
              type: string
            style: simple
    

    Где:

    • function_id — идентификатор функции.
    • service_account_id — сервисный аккаунт с ролью functions.functionInvoker.
  5. Сделайте запрос к эндпоинту:

    curl \
      --request GET \
      --header "Authorization: Bearer ${IAM_TOKEN}" \
      https://d5dm1lba80md********.i9******.apigw.yandexcloud.net/get/Anonymous
    

    Результат:

    Hello, Anonymous
    

Пример прямого запроса, где для вызова функции не используется API Gateway:

{
    "httpMethod": "GET",
    "url": "/get/Anonymous",
    "requestContext": {},
    "body": "",
    "isBase64Encoded": false
}

Была ли статья полезна?

Предыдущая
Класс HttpServlet
Следующая
Управление зависимостями
Проект Яндекса
© 2025 ООО «Яндекс.Облако»