1. Введение
В этой лаборатории кода вы узнаете, как получать сведения о событиях из темы Google Cloud Pub/Sub с помощью ABAP SDK для Google Cloud . Мы будем использовать следующие сервисы Google Cloud:
- Облачный паб/саб
- Облачная оболочка
Предварительные условия
- Убедитесь, что у вас есть доступ к системе SAP с установленным ABAP SDK для Google Cloud.
- Вы можете обратиться к кодовой лаборатории « Установить пробную версию платформы ABAP на Google Cloud Platform и установить ABAP SDK », чтобы настроить новую систему.
- Вы создали тему
PUBSUB_DEMO_TOPIC
как часть Codelab « Отправка событий из SAP в Pub/Sub с помощью ABAP SDK » в своем проекте 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. Прежде чем начать
- В Google Cloud Console на странице выбора проекта выберите или создайте проект Google Cloud (например:
abap-sdk-poc
). - Убедитесь, что для вашего облачного проекта включена оплата. Узнайте, как проверить, включена ли оплата в проекте . Пропустите этот шаг, если вы используете 90-дневную бесплатную пробную учетную запись .
- Вы будете использовать Cloud Shell , среду командной строки, работающую в Google Cloud. В Cloud Console нажмите «Активировать Cloud Shell» в правом верхнем углу:
- Выполните следующие команды для аутентификации своей учетной записи и установите проект по умолчанию
abap-sdk-poc
. В качестве примера используется зонаus-west4-b
. При необходимости измените проект и зону с помощью следующих команд в соответствии с вашими предпочтениями.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- В рамках предыдущей лаборатории кода « Отправить событие в Pub/Sub » вы уже должны были включить API pub/sub , создать тему и опубликовать сообщения в Pub/Sub.
4. Создайте сервисную учетную запись для доступа к Pub/Sub.
Использование учетной записи службы с ролью Subscriber
— это наиболее безопасный способ получения вашей программой ABAP сообщений от Pub/Sub. Эта роль ограничивает разрешения только на получение сообщений, предотвращая потенциальные уязвимости безопасности.
Создайте учетную запись службы
Чтобы создать сервисную учетную запись с необходимой ролью, выполните следующие действия:
- Выполните следующую команду в терминале Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- Теперь добавьте необходимые роли в сервисную учетную запись, созданную на предыдущем шаге:
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
на идентификатор вашего проекта.
- Чтобы убедиться, что роль добавлена, перейдите на страницу 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 -> ПОДТВЕРЖДЕНИЕ_ПОДПИСКИ
Поток сообщений для подписки по запросу
На следующем изображении показан рабочий процесс между клиентом-подписчиком и подпиской по запросу.
- Запрос на извлечение: ваша система SAP (подписчик) использует метод извлечения для запроса сообщений с сервера Pub/Sub.
- Ответ на запрос : сервер Pub/Sub отвечает нулем или более сообщениями и идентификаторами подтверждения. Ответ с нулевым количеством сообщений или с ошибкой не обязательно означает, что сообщений для приема нет. Этот ответ является PullResponse, как показано на изображении.
- Подтверждение: после обработки сообщения ваша система 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
, выполните следующие действия:
- В графическом интерфейсе SAP введите код транзакции SPRO .
- Щелкните Справочное IMG SAP .
- Нажмите ABAP SDK для Google Cloud > Основные настройки > Настроить ключ клиента.
- Сохраните следующие значения для полей. Все остальные поля оставьте пустыми.
Поле | Ценить |
Имя облачного ключа 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.
- Войдите в свою систему SAP.
- Перейдите к коду транзакции
SE38
и создайте программу отчетов с именемZDEMO_RECEIVE_CPS_EVENTS.
- В открывшемся всплывающем окне укажите сведения, как показано ниже, и нажмите «Сохранить» .
- В следующем всплывающем окне выберите «Локальный объект» или укажите имя пакета, если это необходимо.
- В редакторе 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.
- Сохраните и активируйте отчет.
- Выполнить отчет (F8).
В случае успешного выполнения вы должны увидеть выходные данные отчета, как показано ниже:
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
Удаление отдельных ресурсов
- Удалите вычислительный экземпляр:
gcloud compute instances delete abap-trial-docker
- Удалите правила брандмауэра:
gcloud compute firewall-rules delete sapmachine
- Удалить сервисный аккаунт:
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com