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ủ đề trên Google Cloud Pub/Sub bằng ABAP SDK 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 một hệ thống SAP đã cài đặt ABAP SDK cho Google Cloud.
- Bạn có thể tham khảo lớp học lập trình " Cài đặt phiên bản dùng thử nền tảng ABAP trên Google Cloud Platform và cài đặt ABAP SDK" để 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 ABAP SDK" trong Dự án trên Google Cloud. Nếu chưa tạo, hãy dùng lệnh bên dưới để 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 mục sau:
- Một tài khoản dịch vụ có quyền "Người đăng ký" để tương tác với Pub/Sub API.
- Một chương trình ABAP để nhận và xác nhận tin nhắn từ chủ đề Pub/Sub của bạn.
2. Yêu cầu
- Các 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 SAP GUI đã được cài đặt 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 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 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 Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên một 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. Trong 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 tài khoản của bạn và đặt dự án mặc định thành
abap-sdk-poc
. Vùngus-west4-b
được dùng làm ví dụ. Nếu cần, vui lòng thay đổi dự án và khu vực trong các lệnh sau dựa trên 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à xuất bản thông báo lên Pub/Sub.
4. Tạo tài khoản dịch vụ để truy cập Pub/Sub
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 tin nhắn 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 một 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 cửa sổ 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ụ mà bạn đã 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 abap-sdk-poc
bằng mã dự án của bạn.
- Để xác minh rằng 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 sẽ đóng vai trò là ứng dụng khách thuê bao và bắt đầu gửi các yêu cầu đến máy chủ Pub/Sub để truy xuất tin nhắn. Ứng dụng thuê bao sử dụng REST Pull API.
Các phương thức API chính
API Google Cloud Pub/Sub
- pull: Bắt đầu một yêu cầu tìm nạp tin nhắn.
- acknowledge: Gửi tín hiệu đến Pub/Sub để cho biết một thông báo đã được xử lý thành công.
ABAP SDK cho các dịch vụ tương đương của Google Cloud
- /GOOG/CL_PUBSUB_V1 -> PULL_SUBSCRIPTIONS
- /GOOG/CL_PUBSUB_V1 -> ACKNOWLEDGE_SUBSCRIPTIONS
Luồng thông báo cho một gói thuê bao kéo
Hình ảnh sau đây cho thấy quy trình làm việc giữa một ứng dụng thuê bao và một thuê bao kéo.
- Yêu cầu kéo: Hệ thống SAP của bạn (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 kéo: Máy chủ Pub/Sub phản hồi bằng không hoặc nhiều thông báo và mã nhận dạng xác nhận. Phản hồi không có tin nhắn hoặc có lỗi không nhất thiết cho biết rằng không có tin nhắn nào có thể nhận được. 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 ngăn Pub/Sub gử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 là
PUBSUB_DEMO_SUBSCRIPTION
. Gói này sẽ nhận thông báo từPUBSUB_DEMO_TOPIC
:
gcloud pubsub subscriptions create PUBSUB_DEMO_SUBSCRIPTION \
--topic=PUBSUB_DEMO_TOPIC
Phát hành thông báo
Chọn một trong những cách sau để gửi tin nhắn đến PUBSUB_DEMO_TOPIC
:
- Sử dụng lại chương trình của bạn: Nếu bạn có chương trình từ lớp học lập trình trước để xuất bản, hãy sử dụng chương trình đó.
- Phát hành trực tiếp: Để kiểm thử nhanh, hãy thử một trong các lựa chọn sau:
- Cloud Console: Xuất bản ngay 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, sau khi bạn thiết lập các điều kiện tiên quyết trên Google Cloud, chúng ta có thể chuyển sang bước định cấu hình trên SAP.
Đối với cấu hình liên quan đến hoạt động xác thực và kết nối, ABAP SDK cho Google Cloud sẽ 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.
- Nhấp vào ABAP SDK for Google Cloud > Basic Settings > Configure Client Key (ABAP SDK cho Google Cloud > Cài đặt cơ bản > Định cấu hình khoá ứng dụng).
- Duy trì các giá trị sau đối với 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ên làZDEMO_RECEIVE_CPS_EVENTS.
- Trong cửa sổ bật lên, hãy cung cấp thông tin chi tiết như minh hoạ 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 hoặc cung cấp tên gói nếu thích hợp.
- Trong Trình chỉnh sửa ABAP, hãy thêm đoạn 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ư minh hoạ 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 một người đăng ký thông báo. Thao tác này kiểm tra một gói thuê bao cụ thể để tìm tin nhắn mới theo yêu cầu, xử lý các tin nhắn đó, rồi xác nhận đã nhận được để ngăn chặn việc gửi lại trong tương lai.
Chương trình sẽ thực hiện những hoạt động sau:
Phân tích từng bước
Thiết lập kết nối:
- Thao tác này thiết lập một kết nối HTTP đến 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 nơi có gói thuê bao Pub/Sub.
- Tên gói thuê bao: Chỉ định tên của gói thuê bao mà bạn muốn lấy thông báo (
PUBSUB_DEMO_SUBSCRIPTION
). - Giới hạn số lượng tin nhắn: Đặt số lượng tin nhắn tối đa cần truy xuất trong một lệnh gọi API (trong trường hợp này là 1).
Tìm nạp tin nhắn:
- 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 một thông báo xác nhận.
Xác nhận đã đọc tin nhắn:
- Gọi phương thức
acknowledge_subscriptions
để gửi một thông báo xác nhận đến Pub/Sub cho biết đã nhận được tin nhắn. Điều này ngăn không cho các thông báo đó được gử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 thất bại (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
Bạn đã hoàn thành xuất sắc Lớp học lập trình "Nhận một sự kiện từ Cloud Pub/Sub bằng ABAP SDK cho Google Cloud"!
Bạn đã tạo thành công cầu nối giữa ABAP và Google Cloud Pub/Sub! Việc hoàn thành lớp học lập trình này cho thấy bạn nắm vững kiến thức về tính năng nhắn tin dựa trên sự kiện và cách sử dụng ABAP SDK cho Google Cloud để tích hợp với các dịch vụ của Google Cloud. Chính xác!
Bạn đã mở khoá một cấp độ tích hợp mới giữa ABAP và Google Cloud Services. Mở rộng tầm nhìn với những lựa chọn thú vị sau:
- Sử dụng Translation API với ABAP SDK 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 đăng nhập/khoá bí mật từ Secret Manager bằng ABAP SDK 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 với các khoá học lập trình bổ sung liên quan đến ABAP SDK 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á phiên bản điện toán:
gcloud compute instances delete abap-trial-docker
- Xoá các quy tắc về 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