Получите событие из Cloud Pub/Sub в SAP с помощью ABAP SDK для Google Cloud.

1. Введение

В этой лаборатории кода вы узнаете, как получать сведения о событиях из темы Google Cloud Pub/Sub с помощью ABAP SDK для Google Cloud . Мы будем использовать следующие сервисы Google Cloud:

  • Облачный паб/саб
  • Облачная оболочка

Предварительные условия

gcloud pubsub topics create PUBSUB_DEMO_TOPIC

Что ты построишь

Вы создадите следующее:

  • Учетная запись службы с разрешениями «Подписчика» для взаимодействия с API Pub/Sub.
  • Программа ABAP для получения и подтверждения сообщений из вашей темы Pub/Sub.

2. Требования

  • Браузеры, такие как Chrome или Firefox .
  • Проект Google Cloud с включенной оплатой или создайте 90-дневную бесплатную пробную учетную запись для Google Cloud Platform.
  • SAP GUI (Windows или Java), установленный в вашей системе. Если графический интерфейс SAP уже установлен на вашем ноутбуке, подключитесь к SAP, используя внешний IP-адрес виртуальной машины в качестве IP-адреса сервера приложений. Если вы используете Mac, вы также можете установить графический интерфейс SAP для Java, доступный по этой ссылке.

3. Прежде чем начать

6757b2fb50ddcc2d.png

  • Выполните следующие команды для аутентификации своей учетной записи и установите проект по умолчанию abap-sdk-poc . В качестве примера используется зона us-west4-b . При необходимости измените проект и зону с помощью следующих команд в соответствии с вашими предпочтениями.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b

4. Создайте сервисную учетную запись для доступа к Pub/Sub.

Использование учетной записи службы с ролью Subscriber — это наиболее безопасный способ получения вашей программой ABAP сообщений от Pub/Sub. Эта роль ограничивает разрешения только на получение сообщений, предотвращая потенциальные уязвимости безопасности.

Создайте учетную запись службы

Чтобы создать сервисную учетную запись с необходимой ролью, выполните следующие действия:

  1. Выполните следующую команду в терминале Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
  1. Теперь добавьте необходимые роли в сервисную учетную запись, созданную на предыдущем шаге:
gcloud projects add-iam-policy-binding abap-sdk-poc \
--member='serviceAccount:abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com' \
--role='roles/pubsub.subscriber'

Приведенная выше команда использует abap-sdk-poc в качестве заполнителя для проекта Google Cloud. Замените abap-sdk-poc на идентификатор вашего проекта.

  1. Чтобы убедиться, что роль добавлена, перейдите на страницу IAM . Созданная вами учетная запись службы должна быть указана вместе с назначенной ей ролью.

5. Понимание подписок по запросу

При подписке по запросу ваша система SAP действует как клиент-подписчик и инициирует запросы к серверу Pub/Sub для получения сообщений. Клиент подписчика использует REST Pull API.

Ключевые методы API

Google Cloud Pub/Sub API

  • pull: инициирует запрос на получение сообщений.
  • Подтверждение: сигнализирует Pub/Sub о том, что сообщение было успешно обработано.

ABAP SDK для эквивалентов Google Cloud

  • /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
  • /GOOG/CL_PUBSUB_V1 -> ПОДТВЕРЖДЕНИЕ_ПОДПИСКИ

Поток сообщений для подписки по запросу

На следующем изображении показан рабочий процесс между клиентом-подписчиком и подпиской по запросу.

f0fc44265192f348.png

  1. Запрос на извлечение: ваша система SAP (подписчик) использует метод извлечения для запроса сообщений с сервера Pub/Sub.
  2. Ответ на запрос : сервер Pub/Sub отвечает нулем или более сообщениями и идентификаторами подтверждения. Ответ с нулевым количеством сообщений или с ошибкой не обязательно означает, что сообщений для приема нет. Этот ответ является PullResponse, как показано на изображении.
  3. Подтверждение: после обработки сообщения ваша система SAP использует метод подтверждения вместе с полученным идентификатором подтверждения. Это предотвращает повторную доставку сообщения Pub/Sub.

6. Настройка подписки и отправка сообщений

Создать подписку по запросу

  • Выполните эту команду gcloud, чтобы создать подписку по запросу с именем PUBSUB_DEMO_SUBSCRIPTION , которая будет получать сообщения из PUBSUB_DEMO_TOPIC :
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC

Публикация сообщений

Выберите один из этих методов для отправки сообщений в PUBSUB_DEMO_TOPIC :

  • Повторное использование вашей программы: если у вас есть программа из предыдущей кодовой лаборатории для публикации, используйте ее.
  • Прямая публикация . Для быстрой проверки попробуйте один из следующих вариантов:
  • Cloud Console: публикуйте непосредственно в Google Cloud Console. Дополнительные сведения см. в документации Pub/Sub .
  • Команда gcloud: выполните следующую команду:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'

7. Создайте конфигурацию ключа клиента.

Теперь, когда вы настроили предварительные условия на стороне Google Cloud, мы можем продолжить настройку на стороне SAP.

Для конфигурации, связанной с аутентификацией и подключением, ABAP SDK для Google Cloud использует таблицы /GOOG/CLIENT_KEY и /GOOG/SERVIC_MAP.

Чтобы сохранить конфигурацию в таблице /GOOG/CLIENT_KEY , выполните следующие действия:

  1. В графическом интерфейсе SAP введите код транзакции SPRO .
  2. Щелкните Справочное IMG SAP .
  3. Нажмите ABAP SDK для Google Cloud > Основные настройки > Настроить ключ клиента.

25871e639293b9ee.png

  1. Сохраните следующие значения для полей. Все остальные поля оставьте пустыми.

Поле

Ценить

Имя облачного ключа Google

PUBSUB_SUBSCRIBER

Имя учетной записи облачной службы Google

abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com

Облачная область Google

https://www.googleapis.com/auth/cloud-platform

Идентификатор проекта

abap-sdk-poc

Класс авторизации

/GOOG/CL_AUTH_GOOGLE

8. Создайте отчет ABAP для получения сообщений от Google Cloud Pub/Sub.

  1. Войдите в свою систему SAP.
  2. Перейдите к коду транзакции SE38 и создайте программу отчетов с именем ZDEMO_RECEIVE_CPS_EVENTS.
  3. В открывшемся всплывающем окне укажите сведения, как показано ниже, и нажмите «Сохранить» .

7c739236bedb5bf1.png

  1. В следующем всплывающем окне выберите «Локальный объект» или укажите имя пакета, если это необходимо.
  2. В редакторе ABAP добавьте следующий код:
REPORT zdemo_receive_cps_events.

TYPES: BEGIN OF ty_event_message,
         event_time  TYPE timestamp,
         event_type  TYPE char30,
         source      TYPE char30,
         sales_order TYPE vbeln,
       END OF ty_event_message.

DATA: ls_input     TYPE /goog/cl_pubsub_v1=>ty_026,
      ls_input_ack TYPE /goog/cl_pubsub_v1=>ty_001,
      ls_event_msg TYPE ty_event_message.

TRY.

    "Open HTTP Connection
    DATA(lo_client) = NEW /goog/cl_pubsub_v1( iv_key_name = 'PUBSUB_SUBSCRIBER' ).

    "Populate relevant parameters
    " Derive project id from the client object
    DATA(lv_p_projects_id) = CONV string( lo_client->gv_project_id ).
    " Name of the subscription from where we want to pull data
    DATA(lv_p_subscriptions_id) = CONV string( 'PUBSUB_DEMO_SUBSCRIPTION' ).
    " Max number of messages that will be received in 1 API call
    ls_input-max_messages = 1.

    "Call API method: pubsub.projects.subscriptions.pull
    lo_client->pull_subscriptions(
      EXPORTING
        iv_p_projects_id      = lv_p_projects_id
        iv_p_subscriptions_id = lv_p_subscriptions_id
        is_input              = ls_input
      IMPORTING
        es_output             = DATA(ls_output)
        ev_ret_code           = DATA(lv_ret_code)
        ev_err_text           = DATA(lv_err_text)
        es_err_resp           = DATA(ls_err_resp) ).

    IF lo_client->is_success( lv_ret_code ).
      DATA(ls_received_msg) = VALUE #( ls_output-received_messages[ 1 ] OPTIONAL ).
      IF ls_received_msg IS NOT INITIAL.
        "Messages published to Pub/Sub should be base-64 encoded, hence in order to get the exact message, we need to decode the data field.
        "However, attributes published to Pub/Sub should be accessible as data references.
        DATA(lv_msg) = |{ cl_http_utility=>decode_base64( encoded = ls_received_msg-message-data ) }|.
        /ui2/cl_json=>deserialize( EXPORTING json          = lv_msg
                                             pretty_name   = /ui2/cl_json=>pretty_mode-extended
                                   CHANGING  data          = ls_event_msg ).

        cl_demo_output=>new( )->begin_section( |Receive Events from Cloud Pubsub using ABAP SDK for Google Cloud|
        )->write_text( |The below event was successfully received with message ID { ls_received_msg-message-MESSAGE_ID }|
        )->write_data( ls_event_msg
        )->end_section(
        )->display( ).

        ls_input_ack-ack_ids = VALUE #( ( ls_received_msg-ack_id ) ).

        "Call API method: pubsub.projects.subscriptions.acknowledge
        "Acknowledge the messages so it is not pulled again.
        lo_client->acknowledge_subscriptions(
          EXPORTING
            iv_p_projects_id      = lv_p_projects_id
            iv_p_subscriptions_id = lv_p_subscriptions_id
            is_input              = ls_input_ack
          IMPORTING
            es_output             = DATA(ls_output_ack)
            ev_ret_code           = lv_ret_code
            ev_err_text           = lv_err_text
            es_err_resp           = ls_err_resp ).

        IF lo_client->is_success( lv_ret_code ).
          MESSAGE lv_msg TYPE 'S'.
        ELSE.
          MESSAGE lv_err_text TYPE 'E'.
        ENDIF.
      ELSE.
        MESSAGE 'No Messages were received!' TYPE 'S'.
      ENDIF.
    ELSE.
      MESSAGE lv_err_text TYPE 'E'.
    ENDIF.

    "Close HTTP Connection
    lo_client->close( ).

  CATCH /goog/cx_sdk INTO DATA(lo_exception).
    MESSAGE lo_exception->get_text( ) TYPE 'E'.
ENDTRY.
  1. Сохраните и активируйте отчет.
  2. Выполнить отчет (F8).

В случае успешного выполнения вы должны увидеть выходные данные отчета, как показано ниже:

5b76e886ef79d0ba.png

9. Объяснение кода подписчика ABAP Pub/Sub

По сути, эта программа ABAP интегрируется с Google Cloud Pub/Sub в качестве подписчика сообщений. Он проверяет указанную подписку на наличие новых сообщений по запросу, обрабатывает их, а затем подтверждает их получение, чтобы предотвратить повторную доставку в будущем.

Программа будет выполнять следующие действия:

Пошаговая разбивка

Установить соединение:

  • Он устанавливает HTTP-соединение со службой Google Cloud Pub/Sub, используя класс /GOOG/CL_PUBSUB_V1 .

Установить параметры:

  • Идентификатор проекта : извлекает соответствующий идентификатор проекта, в котором находится подписка Pub/Sub.
  • Имя подписки: указывает имя подписки, из которой будут извлекаться сообщения ( PUBSUB_DEMO_SUBSCRIPTION ).
  • Ограничение сообщений : устанавливает максимальное количество сообщений, которые можно получить за один вызов API (в данном случае 1).

Получить сообщения:

  • Вызывает метод pull_subscriptions для получения сообщений из указанной подписки.

Обработка полученных сообщений:

  • Если сообщения существуют, программа декодирует данные, регистрирует содержимое и отправляет подтверждение.

Подтвердить сообщения:

  • Вызывает метод acknowledge_subscriptions для отправки подтверждения в Pub/Sub, указывающего на успешное получение сообщений. Это предотвращает их повторную доставку.

Обработка успехов/ошибок:

  • Предоставляет сообщения об успехе, если сообщения получены и подтверждены, и отображает сообщения об ошибках для различных сценариев сбоя (сообщения не получены, ошибки API и т. д.).

Закрыть соединение:

  • Закрывает HTTP-соединение со службой Pub/Sub.

10. Поздравления

Отличная работа по завершению кодовой лаборатории «Получение события из Cloud Pub/Sub с использованием ABAP SDK для Google Cloud»!

Вы успешно построили мост между ABAP и Google Cloud Pub/Sub! Завершение вашей кодовой лаборатории демонстрирует четкое понимание обмена сообщениями, управляемыми событиями, и того, как использовать ABAP SDK для Google Cloud для интеграции со службами Google Cloud. Отличная работа!

Вы открыли новый уровень интеграции между ABAP и облачными службами Google. Расширьте свой кругозор с помощью этих интересных возможностей:

  • Использование API перевода с ABAP SDK для Google Cloud
  • Загрузите большой объект в корзину Cloud Storage, используя фрагментирование.
  • Получение учетных данных/секретов из Secret Manager с помощью ABAP SDK для Google Cloud
  • Вызов Vertex AI test-bison из ABAP
  • Вызов BigQuery ML из ABAP

11. Очистка

Если вы не хотите продолжать работу с дополнительными лабораториями кода, связанными с ABAP SDK для Google Cloud, продолжите очистку.

Удалить проект

  • Удалите проект Google Cloud:
gcloud projects delete abap-sdk-poc

Удаление отдельных ресурсов

  1. Удалите вычислительный экземпляр:
gcloud compute instances delete abap-trial-docker
  1. Удалите правила брандмауэра:
gcloud compute firewall-rules delete sapmachine
  1. Удалить сервисный аккаунт:
gcloud iam service-accounts delete \
    abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com