1. Giới thiệu
Lớp học lập trình này hướng dẫn bạn cách nhận thông tin chi tiết về sự kiện từ một chủ đề Google Cloud Pub/Sub bằng cách sử dụng SDK ABAP cho Google Cloud. Chúng ta sẽ tận dụng các dịch vụ sau đây của Google Cloud:
- Cloud Pub/Sub
- Cloud Shell
Điều kiện tiên quyết
- Đảm bảo rằng bạn có quyền truy cập vào hệ thống SAP đã cài đặt SDK ABAP cho Google Cloud.
- Bạn có thể tham khảo lớp học lập trình " Cài đặt bản dùng thử ABAP Platform trên Google Cloud Platform và Cài đặt SDK ABAP" để thiết lập một hệ thống mới.
- Bạn đã tạo một chủ đề
PUBSUB_DEMO_TOPIC
trong lớp học lập trình " Gửi sự kiện từ SAP đến Pub/Sub bằng SDK ABAP" trong Dự án Google Cloud. Nếu chưa tạo, hãy sử dụng lệnh dưới đây để tạo:
gcloud pubsub topics create PUBSUB_DEMO_TOPIC
Sản phẩm bạn sẽ tạo ra
Bạn sẽ tạo các thành phần sau:
- Một tài khoản dịch vụ có quyền "Người đăng ký" để tương tác với API Pub/Sub.
- Một chương trình ABAP để nhận và xác nhận tin nhắn từ chủ đề Pub/Sub.
2. Yêu cầu
- Trình duyệt, chẳng hạn như Chrome hoặc Firefox.
- Một dự án Google Cloud đã bật tính năng thanh toán hoặc Tạo tài khoản dùng thử miễn phí 90 ngày cho Google Cloud Platform.
- SAP GUI (Windows hoặc Java) đã được cài đặt trong hệ thống của bạn. Nếu bạn đã cài đặt SAP GUI trên máy tính xách tay, hãy kết nối với SAP bằng địa chỉ IP bên ngoài của máy ảo làm địa chỉ IP của Máy chủ ứng dụng. Nếu đang dùng máy Mac, bạn cũng có thể cài đặt SAP GUI cho Java có trong đường liên kết này.
3. Trước khi bắt đầu
- Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud (Ví dụ:
abap-sdk-poc
). - Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Google Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên dự án hay không. Bỏ qua bước này nếu bạn đang sử dụng Tài khoản dùng thử miễn phí 90 ngày.
- Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud. Trên Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell ở góc trên cùng bên phải:
- Chạy các lệnh sau để xác thực cho tài khoản của bạn và đặt dự án mặc định thành
abap-sdk-poc
. Ví dụ: vùngus-west4-b
. Nếu cần, vui lòng thay đổi dự án và vùng trong các lệnh sau đây theo lựa chọn ưu tiên của bạn.
gcloud auth login
gcloud config set project abap-sdk-poc
gcloud config set compute/zone us-west4-b
- Trong lớp học lập trình trước " Gửi sự kiện đến Pub/Sub", bạn phải bật API pub/sub, tạo chủ đề và phát hành tin nhắn đến Pub/Sub.
4. Tạo tài khoản dịch vụ để truy cập Pub/Sub
Việc sử dụng tài khoản dịch vụ có vai trò Subscriber
là cách an toàn nhất để chương trình ABAP của bạn nhận được thông báo từ Pub/Sub. Vai trò này chỉ giới hạn quyền truy xuất thư, ngăn chặn các lỗ hổng bảo mật tiềm ẩn.
Tạo Tài khoản dịch vụ
Để tạo tài khoản dịch vụ có vai trò bắt buộc, hãy thực hiện các bước sau:
- Chạy lệnh sau trong dòng lệnh Cloud Shell:
gcloud iam service-accounts \
create abap-sdk-pubsub-subscriber \
--display-name="Service Account for Pub/Sub Subscriber"
- Bây giờ, hãy thêm các vai trò bắt buộc vào tài khoản dịch vụ đã tạo ở bước trên:
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'
Lệnh trên sử dụng abap-sdk-poc
làm phần giữ chỗ cho Dự án Google Cloud. Thay thế abap-sdk-poc
bằng mã dự án của bạn.
- Để xác minh vai trò đã được thêm, hãy chuyển đến trang IAM. Tài khoản dịch vụ mà bạn đã tạo sẽ xuất hiện cùng với vai trò đã được chỉ định cho tài khoản đó.
5. Tìm hiểu về gói thuê bao kéo
Đối với gói thuê bao kéo, hệ thống SAP của bạn đóng vai trò là ứng dụng của người đăng ký và bắt đầu các yêu cầu đến máy chủ Pub/Sub để truy xuất thông báo. Ứng dụng của người đăng ký sử dụng API kéo REST.
Các phương thức API chính
API Google Cloud Pub/Sub
- pull (kéo): Bắt đầu một yêu cầu tìm nạp tin nhắn.
- acknowledge: Tín hiệu cho Pub/Sub biết rằng một thông báo đã được xử lý thành công.
SDK ABAP cho các sản phẩm tương đương của Google Cloud
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
Luồng tin nhắn cho gói thuê bao kéo
Hình ảnh sau đây cho thấy quy trình làm việc giữa ứng dụng khách đăng ký và gói thuê bao lấy dữ liệu.
- Yêu cầu kéo: Hệ thống SAP (người đăng ký) sử dụng phương thức kéo để yêu cầu tin nhắn từ máy chủ Pub/Sub.
- Phản hồi lệnh kéo: Máy chủ Pub/Sub phản hồi bằng 0 hoặc nhiều thông báo và mã xác nhận. Phản hồi không có thông báo hoặc có lỗi không nhất thiết có nghĩa là không có thông báo nào để nhận. Phản hồi này là PullResponse như trong hình.
- Xác nhận: Sau khi xử lý một thông báo, hệ thống SAP của bạn sẽ sử dụng phương thức xác nhận cùng với mã xác nhận đã nhận được. Điều này sẽ ngăn Pub/Sub phân phối lại thông báo.
6. Thiết lập gói thuê bao và gửi tin nhắn
Tạo gói thuê bao kéo
- Thực thi lệnh gcloud này để tạo một gói thuê bao kéo có tên
PUBSUB_DEMO_SUBSCRIPTION
. Gói thuê bao này sẽ nhận thông báo từPUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
Xuất bản thông báo
Chọn một trong các phương thức sau để gửi thông báo đến PUBSUB_DEMO_TOPIC
:
- Sử dụng lại chương trình: Nếu bạn có chương trình từ lớp học lập trình trước để phát hành, hãy sử dụng chương trình đó.
- Phương thức phát hành trực tiếp: Để kiểm thử nhanh, hãy thử một trong các cách sau:
- Cloud Console: Phát hành trực tiếp trong Google Cloud Console. Để biết thêm thông tin, hãy xem tài liệu về Pub/Sub.
- Lệnh gcloud: Chạy lệnh sau:
gcloud pubsub topics publish PUBSUB_DEMO_TOPIC \
--message='{"eventType":"SalesOrderChanged","source":"SAPDEV100","eventTime":"20240207183048","SalesOrder":1000924}'
7. Tạo cấu hình khoá ứng dụng
Giờ đây, khi bạn đã thiết lập các điều kiện tiên quyết ở phía Google Cloud, chúng ta có thể tiếp tục với cấu hình ở phía SAP.
Đối với cấu hình liên quan đến việc xác thực và kết nối, SDK ABAP cho Google Cloud sử dụng các bảng /GOOG/CLIENT_KEY
và /GOOG/SERVIC_MAP.
Để duy trì cấu hình trong bảng /GOOG/CLIENT_KEY
, hãy thực hiện các bước sau:
- Trong SAP GUI, hãy nhập mã giao dịch SPRO.
- Nhấp vào SAP Reference IMG (Hình ảnh tham chiếu SAP).
- Nhấp vào ABAP SDK for Google Cloud (SDK ABAP cho Google Cloud) > Basic Settings (Cài đặt cơ bản) > Configure Client Key (Định cấu hình khoá ứng dụng).
- Duy trì các giá trị sau đây cho các trường. Để trống tất cả các trường khác.
Trường | Giá trị |
Tên khoá Google Cloud | PUBSUB_SUBSCRIBER |
Tên tài khoản dịch vụ Google Cloud | abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com |
Phạm vi Google Cloud | https://www.googleapis.com/auth/cloud-platform |
Mã dự án | abap-sdk-poc |
Lớp uỷ quyền | /GOOG/CL_AUTH_GOOGLE |
8. Tạo báo cáo ABAP để nhận thông báo từ Google Cloud Pub/Sub
- Đăng nhập vào hệ thống SAP.
- Chuyển đến mã giao dịch
SE38
và tạo một Chương trình báo cáo có tênZDEMO_RECEIVE_CPS_EVENTS.
- Trong cửa sổ bật lên, hãy cung cấp thông tin chi tiết như bên dưới rồi nhấp vào Lưu.
- Trong cửa sổ bật lên tiếp theo, hãy chọn Local Object (Đối tượng cục bộ) hoặc cung cấp tên gói phù hợp.
- Trong Trình chỉnh sửa ABAP, hãy thêm mã sau:
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.
- Lưu và kích hoạt Báo cáo.
- Thực thi báo cáo (F8).
Khi thực thi thành công, bạn sẽ thấy kết quả báo cáo như dưới đây:
9. Giải thích mã người đăng ký Pub/Sub ABAP
Về cơ bản, chương trình ABAP này tích hợp với Google Cloud Pub/Sub dưới dạng người đăng ký thông báo. Phương thức này kiểm tra một gói thuê bao cụ thể để tìm thông báo mới theo yêu cầu, xử lý các thông báo đó rồi xác nhận việc nhận thông báo để tránh gửi lại trong tương lai.
Chương trình sẽ thực hiện các hoạt động sau:
Phân tích từng bước
Thiết lập kết nối:
- Thư viện này thiết lập kết nối HTTP với dịch vụ Google Cloud Pub/Sub bằng cách sử dụng lớp
/GOOG/CL_PUBSUB_V1
.
Đặt tham số:
- Mã dự án: Trích xuất Mã dự án có liên quan chứa gói thuê bao Pub/Sub.
- Subscription Name (Tên gói thuê bao): Chỉ định tên của Gói thuê bao để lấy thông báo (
PUBSUB_DEMO_SUBSCRIPTION
). - Giới hạn tin nhắn: Đặt số lượng tin nhắn tối đa để truy xuất trong một lệnh gọi API (trong trường hợp này là 1).
Tìm nạp thông báo:
- Gọi phương thức
pull_subscriptions
để truy xuất thông báo từ gói thuê bao đã chỉ định.
Xử lý tin nhắn đã nhận:
- Nếu có thông báo, chương trình sẽ giải mã dữ liệu, ghi lại nội dung và gửi thông báo xác nhận.
Xác nhận tin nhắn:
- Gọi phương thức
acknowledge_subscriptions
để gửi thông báo xác nhận đến Pub/Sub cho biết đã nhận được tin nhắn thành công. Điều này sẽ ngăn việc phân phối lại.
Xử lý thành công/lỗi:
- Cung cấp thông báo thành công nếu nhận được và xác nhận thông báo, đồng thời hiển thị thông báo lỗi cho nhiều trường hợp không thành công (không nhận được thông báo, lỗi API, v.v.).
Đóng kết nối:
- Đóng kết nối HTTP với dịch vụ Pub/Sub.
10. Xin chúc mừng
Xin chúc mừng bạn đã hoàn thành lớp học lập trình "Nhận sự kiện từ Cloud Pub/Sub bằng SDK ABAP cho Google Cloud"!
Bạn đã xây dựng thành công cầu nối giữa ABAP và Google Cloud Pub/Sub! Khi hoàn thành lớp học lập trình này, bạn đã nắm vững cách gửi thông báo dựa trên sự kiện và cách sử dụng SDK ABAP cho Google Cloud để tích hợp với các dịch vụ của Google Cloud. Chính xác!
Bạn đã đạt được một cấp độ tích hợp mới giữa ABAP và Dịch vụ đám mây của Google. Mở rộng tầm nhìn của bạn với những lựa chọn thú vị sau:
- Sử dụng API Dịch bằng SDK ABAP cho Google Cloud
- Tải một đối tượng lớn lên bộ chứa Cloud Storage bằng cách phân đoạn
- Truy xuất thông tin xác thực/bí mật từ Trình quản lý bí mật bằng SDK ABAP cho Google Cloud
- Gọi Vertex AI test-bison từ ABAP
- Gọi BigQuery ML từ ABAP
11. Dọn dẹp
Nếu bạn không muốn tiếp tục các lớp học lập trình bổ sung liên quan đến SDK ABAP cho Google Cloud, vui lòng tiến hành dọn dẹp.
Xoá dự án
- Xoá dự án trên Google Cloud:
gcloud projects delete abap-sdk-poc
Xoá từng tài nguyên
- Xoá thực thể máy tính:
gcloud compute instances delete abap-trial-docker
- Xoá các quy tắc tường lửa:
gcloud compute firewall-rules delete sapmachine
- Xoá tài khoản dịch vụ:
gcloud iam service-accounts delete \
abap-sdk-pubsub-subscriber@abap-sdk-poc.iam.gserviceaccount.com