CHƯƠNG 3: XÂY DỰNG HỆ THỐNG KẾT NỐI THANH TOÁN GIỮA NGÂN HÀNG VÀ CÁC CÔNG TY CHỨNG KHOÁN
3.2. Xây dựng mô hình hệ thống
3.2.3 Cơ chế hoạt động
Các web service dựa trên mô hình “request-and-response” sử dụng các thông điệp được mã hoá dưới giao thức SOAP. Các thông điệp này được định dạng theo XML và thông điệp SOAP được gửi thông qua HTTP. SOAP là giao thức vận chuyển độc lập, vì vậy WebSphere MQ được sử dụng như một cơ chế vận chuyển luân phiên.
Hình 3.2-10: Mô hình “request-and-response” vận chuyển message dưới giao thức SOAP thông qua WebSphere MQ.
Send
Client Aplication
Receive
Proxy SOAP Layer
Send
SOAP/WMQ
Sender
Receive
WMQ
Receive
SOAP/WMQ
Listener
Send
Server (Target Service) SOAP
Layer Client request transaction
Client response transaction
Listener Transaction
Các bước sau đây chỉ ra quá trình liên quan đến việc tạo và xử lý yêu cầu (request):
1. Client gọi 1 phương thức của 1 lớp lưu trữ trên server thông qua một proxy của lớp có khả năng truy cập tới client.
2. Tầng SOAP bắt giữ lời gọi phương thức và tạo một sự miêu tả lời gọi bằng mẫu XML
3. XML tự gói nó trong vỏ bọc SOAP vẫn trong định dạng XML
4. Dữ liệu vừa được xây dựng sẽ được tầng SOAP chuyển tới SOAP/WebSphere MQ sender.
5. SOAP/WebSphere MQ sender đặt thông điệp SOAP vào hàng đợi giống một thông điệp WebSphere MQ.
6. Tiến trình SOAP/WebSphere MQ listener sẽ đọc thông điệp từ hàng đợi và chuyển dữ liệu SOAP tới tầng SOAP phía server.
7. Tầng SOAP phía server phân tích vỏ bọc SOAP, rút ra biểu diễn XML của phương thức
8. Tầng SOAP xác định dịch vụ đích và gọi hàm theo yêu cầu của client 9. Dịch vụ thi hành hàm và trả về kết quả
10. Kết quả được trả về cho client với kiểu tương tự.
Hình vẽ dưới đây minh hoạ chi tiết hơn nữa đường đi của message theo chế độ kết nối server (server binding):
Hình 3.2-11: Đường đi của message theo chế độ kết nối server.
Client Aplication
SOAP Layer
SOAP/WMQ
Sender
Q.RMT.SC(/BR/HO).GW
Q.XMIT.SC(/BR/HO)
Q.LOCAL.SC(/BR/HO) Queue Manager SC01(/BR106/HO)
SOAP/WMQ
Listener
Server (Target Service) SOAP
Layer
Q.LOCAL.GW.SC(/BR/HO)
Q.RMT.GW.SC(/BR/HO)
Q.XMIT.GW.SC(/BR/HO) Queue Manager GW
Sender Channel
Receiver Channel
Khi client từ CTCK, chi nhánh hoặc hội sở chính của Ngân hàng tạo một reqquest, SOAP/WebSphere MQ sender thông qua URI biết được phải đặt message vào request queue nào của queue manager GW thông qua remote queue với sự trợ giúp của transmission queue trong queue manager SC01, BR106 hay HO tương ứng. Message được gửi đi thông qua sender channel tương ứng của mỗi queue manager đó. Service tương ứng trên Gateway sẽ tìm kiếm message trong request queue của queue manager GW, lấy message ra và xử lý chúng, sau đó trả về response message. Response message này được đặt vào transmission queue thông qua service listener, và thông qua message header, message được quyết định đưa đến queue đích nào và thông qua receiver channel phía client, nó được trả về queue manager đích. Lúc này Listener sẽ đọc message từ local response queue và trả nó về cho client.
Như vậy, để client có thể gọi tới Web service nhằm thực thi các chức năng của hệ thống thì Web services phải được xử lý qua một chuỗi các bước triển khai. Các bước này sẽ định nghĩa target service tới kiến trúc hạ tầng máy chủ .NET; tạo ra các phương thức proxy để client dễ dàng xử lý việc gọi service từ client; chuẩn bị một file script để start các service listener cũng như thực hiện cấu hình một số queue và tiến trình trong WebSphere MQ.
3.2.3.1. Triển khai Gateway Banking Service
SCService, BRService, HOService là các Web Service đặt trên máy chủ Bank Gateway nhằm thực hiện các yêu cầu giao dịch từ phía client của CTCK, chi nhánh và hội sở chính của Ngân hàng. Các Web Service này đưa ra giao diện được mô tả theo chuẩn văn bản XML gọi là ngôn ngữ mô tả dịch vụ web WSDL (Web Services Description Language) và sử dụng WSDL để tạo ra một proxy. Proxy này hoạt động như một phần trung gian giữa client và Web Service, nó che dấu sự phức tạp bên trong Web Service và chuyển các lời gọi hàm từ client tới Web Service.
Web Service phải được xử lý thông qua một chuỗi các bước triển khai để gửi thông điệp SOAP của chúng qua WebSphere MQ. Các bước này định nghĩa Web Service tới kiến trúc .NET trên máy chủ. Quá trình triển khai sẽ tạo ra WSDL và các phương thức proxy cho các lời gọi service từ client, đồng thời chuẩn bị file script để khởi động service listener, xử lý cấu hình trong WebSphere MQ.
Tiện ích triển khai Web Service hoạt động theo kiểu bottom_up:
Hình 3.2-12: Triển khai WebSphere MQ transport for SOAP
Các hoạt động chính mà tiện ích triển khai này đảm nhiệm là:
- Xác nhận URI được cung cấp - Chuẩn bị WSDL
- Triển khai service từ WSDL - Tạo ra các client proxy từ WSDL
- Chuẩn bị script để gọi Microsoft .NET listener trong nền Web Service.
- Cấu hình WebSphere MQ với các queue được yêu cầu và các xử lý cần thiết để thực thi service.
Dưới đây là 2 đoạn lệnh dùng để tạo các proxy đã được tuỳ chỉnh để điều khiển bằng tay thông qua việc thực thi các lệnh command line:
Tạo proxy tên MQSCProxy.dll dùng cho ứng dụng thực thi client phía CTCK:
(1:)
@echo off
set COMPLUS_Version=v2.0.50727
set WSDL_TOOL="C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\wsdl.exe"
set COMPILER="C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\csc.exe"
set QUEUE_MANAGER=GW
set CLIENT_CHANNEL=CH.GW.SRVCONN
set CLIENT_CONNECTION=10.10.1.225(1516) (2:)
set QUEUE_REQUEST=Q.LOCAL.GW.SC
set QUEUE_RESPONSE=Q.RMT.GW.SC set WEB_SERVICE=SCServices.asmx set PROXY_NAME=SCProxy
set WEB_SERVICE=SCServices.asmx set PROXY_NAME=SCProxy
(3:)
@echo on md proxy
@echo Make WMQService Proxy amqswsdl
"jms:/queue?destination=%QUEUE_REQUEST%@%QUEUE_MANAGER%&connectionFa ctory=(connectQueueManager(%QUEUE_MANAGER%)clientChannel(%CLIENT_CHA NNEL%)clientConnection(%CLIENT_CONNECTION%))&initialContextFactory=c om.ibm.mq.jms.Nojndi&targetService=%WEB_SERVICE%&replyDestination=%Q UEUE_RESPONSE%" %WEB_SERVICE% .\Proxy\%PROXY_NAME%_Wmq.wsdl
%WSDL_TOOL% .\Proxy\%PROXY_NAME%_Wmq.wsdl /n:WMQService /o:.\Proxy\MQ%PROXY_NAME%.cs
%COMPILER% /t:library /out:.\Proxy\MQ%PROXY_NAME%.dll .\Proxy\MQ%PROXY_NAME%.cs
Đoạn lện 3 thực hiện việc tạo thư mục proxy, sau đó gọi lệnh amqswsdl để tạo file SCProxy_Wmq.wsdl để rồi từ file này sinh ra file MQSCProxy.cs, và từ file MQSCProxy.cs sinh ra file proxy MQSCProxy.dll.
Trong cấu trúc URI của lệnh amqswsdl có khai báo các tham số:
- Sự truyền tải: đây là phần của URI khai báo WebSphere MQ như một phương tiện truyền tải thông điệp Web Service SOAP. Việc này được chỉ ra bằng đoạn “jms:/queue”
- Đích đến: được khai báo sau “jms:/queue”, bao gồm tên của queue được sử dụng để chứa message yêu cầu cùng với tên queue manager được ngăn cách tên queue bằng ký hiện @.
- ConnectionFactory: chỉ rõ client connection và queue manager cũng như các channel sử dụng cho client connection, tức ConnectionFactory chỉ rõ connect queue manager, client channel và client connection.
- InitialContextFactory: tham số này phải được thiết lập là
“com.ibm.mq.jms.Nojndi” và nó được yêu cầu để tương thích với Websphere Application Server.
- targetService: Chỉ ra tên của service
- Đích trả lời (replyDestination): chỉ ra tên queue sử dụng để chứa message trả lời.
Tương tự, để tạo proxy tên MQBRProxy.dll dùng cho ứng dụng thực thi client phía Chi nhánh Ngân hàng, thay các tham số phần (2:) như sau:
set CLIENT_CONNECTION=10.10.1.225(1514) set QUEUE_REQUEST=Q.LOCAL.GW.BR
set QUEUE_RESPONSE=Q.RMT.GW.BR set WEB_SERVICE=BRServices.asmx set PROXY_NAME=BRProxy
Và tạo proxy tên MQHOProxy.dll dùng cho ứng dụng thực thi client phía Hội sở chính, thay các tham số phần (2:) như sau:
set CLIENT_CONNECTION=10.10.1.225(1515) set QUEUE_REQUEST=Q.LOCAL.GW.HO
set QUEUE_RESPONSE=Q.RMT.GW.HO set WEB_SERVICE=HOServices.asmx set PROXY_NAME=HOProxy
Đồng thời bỏ câu lệnh tạo thư mục proxy đi.
3.2.3.2. Start và stop Listener
Sau khi đã chuẩn bị và triển khai các web service cũng như đã chuẩn bị client để sử dụng cùng với các proxy đã được tạo ra khi triển khai web service, việc cuối cùng cần phải thực hiện trước khi thực thi các web service là phải chắc chắn rằng WebSphere MQ transport for SOAP listener đang chạy hoặc được cấu hình để chạy khi ứng dụng từ client gửi yêu cầu tới web service.
.NET sender được thực thi kín kên trong lớp IBM.WMQSOAP.MQWebRequest, lớp này được dẫn xuất từ các lớp System.Net.WebRequest và System.Net.IwebRequestCreate. Khi môi trường .NET phát hiện ra URI với tiền tố “jms:” nó sẽ cố gắng đặt message vào một request queue đặc biệt, thiết lập lựa chọn thời điểm kết thúc, thời gian tồn tại và độ ưu tiên bất kỳ.
Vai trò của listener là theo dõi một request queue để phát hiện các message yêu cầu được gửi đến, xử lý message đó và gọi đến web service thông qua Microsoft .NET và trả về message đáp ứng đặt response queue để trả nó về cho client.
Có thể start Listener thông qua script được tạo ra khi triển khai web service hoặc có thể tự điều khiển bằng tay thông qua việc thực thi các lệnh trong command line. Script để start một .NET listener trong môi trường Windows là startWMQNListener.cmd. Tương tự, script để stop listener cũng có thể tự tạo từ tập hợp các dòng lệnh chạy trong command line hoặc dùng file script được tạo ra khi triển khai service. File để stop .NET listener trong windows có tên endWMQNListener.cmd.
.NET SOAP/WebSphere MQ listener trong amqwSOAPNETlistener.exe với cú pháp:
amqwSOAPNETlistener -u wmqUri [-w directory] [-n numListenerThreads]
[-d msecs]
[-i passContext|owncontext ] [-x none | onePhase | twoPhase]
Trong đó:
-u chỉ ra URI của service sẽ được gọi, là lựa chọn bắt buộc.
-a cho phép tuỳ chỉnh cách xử lý khi không thể ghi một message yêu cầu bị lỗi vào queue dead.
-w là thư mực vật lý có chứa Web Service
-n chỉ ra số lượng SOAP/WebSphere MQ listener thread muốn tạo, mặc định là 10
-d là thời gian tính bằng mini giây để SOAP/WebSphere MQ listener còn tiếp tục hoạt động sau khi message yêu cầu đã nhận được, mặc định là -1 để quy định thời gian này là vô hạn.
-i chỉ ra listener có thể cố gắng qua ngữ cảnh đồng nhất hoặc không, mặc định là passContext, tức listener sử dụng ngữ cảnh sender.
-x chỉ ra hình thức của điều khiển sự giao dịch mà listener có thể chạy, có 3 lựa chọn là none, onePhase và twoPhase, mặc định là twoPhase.
Giả sử các service được cài đặt vào thư mục
"C:\Installed\SGW_Runtime\Services" trong máy chủ Gateway Banking.
Dưới đây là 2 đoạn lệnh dùng để start và stop các listener đã được tuỳ chỉnh để điều khiển bằng tay thông qua việc thực thi các lệnh command line trong 2 file startWMQNListener.cmd và endWMQNListener.cmd.
File startWMQNListener.cmd để start listener:
@echo off
set COMPLUS_Version=v2.0.50727
set WMQSOAP_HOME="C:\IBM\Websphere\IBM\WebSphere MQ"
set WORKING_FOLDER="C:\Installed\SGW_Runtime\Services"
set QUEUE_MANAGER=GW
set CLIENT_CHANNEL=CH.GW.SRVCONN
set CLIENT_CONNECTION_SC=10.10.1.225(1416) set QUEUE_REQUEST_SC=Q.LOCAL.GW.SC
set WEB_SERVICE_SC=SCServices.asmx
set CLIENT_CONNECTION_BR=10.10.1.225(1414) set QUEUE_REQUEST_BR=Q.LOCAL.GW.BR
set WEB_SERVICE_BR=BRServices.asmx
set CLIENT_CONNECTION_HO=10.10.1.225(1415) set QUEUE_REQUEST_HO=Q.LOCAL.GW.HO
set WEB_SERVICE_HO=HOServices.asmx set THREAD_NUMBER=1
@echo on
%WMQSOAP_HOME%\bin\amqwSOAPNETListener -u
"jms:/queue?destination=%QUEUE_REQUEST_SC%@%QUEUE_MANAGER%&connectio nFactory=(connectQueueManager(%QUEUE_MANAGER%))&initialContextFactor y=com.ibm.mq.jms.Nojndi&targetService=%WEB_SERVICE_SC%" -w
%WORKING_FOLDER% -n %THREAD_NUMBER%
%WMQSOAP_HOME%\bin\amqwSOAPNETListener -u
"jms:/queue?destination=%QUEUE_REQUEST_HO%@%QUEUE_MANAGER%&connectio nFactory=(connectQueueManager(%QUEUE_MANAGER%))&initialContextFactor y=com.ibm.mq.jms.Nojndi&targetService=%WEB_SERVICE_HO%" -w
%WORKING_FOLDER% -n %THREAD_NUMBER%
%WMQSOAP_HOME%\bin\amqwSOAPNETListener -u
"jms:/queue?destination=%QUEUE_REQUEST_BR%@%QUEUE_MANAGER%&connectio nFactory=(connectQueueManager(%QUEUE_MANAGER%))&initialContextFactor y=com.ibm.mq.jms.Nojndi&targetService=%WEB_SERVICE_BR%" -w
%WORKING_FOLDER% -n %THREAD_NUMBER%
File endWMQNListener.cmd để stop Listener:
@echo off
set QUEUE_MANAGER=GW
set QUEUE_REQUEST_SC=Q.LOCAL.GW.SC set QUEUE_REQUEST_SC=Q.LOCAL.GW.BR set QUEUE_REQUEST_SC=Q.LOCAL.GW.HO
set JDK=C:\IBM\Eclipse SDK30\eclipse\jre\bin
@echo on
"%JDK%" -cp "%CLASSPATH%" com.ibm.mq.soap.util.EndWMQListener -m
%QUEUE_MANAGER% -q %QUEUE_REQUEST_SC%
"%JDK%" -cp "%CLASSPATH%" com.ibm.mq.soap.util.EndWMQListener -m
%QUEUE_MANAGER% -q %QUEUE_REQUEST_BR%
"%JDK%" -cp "%CLASSPATH%" com.ibm.mq.soap.util.EndWMQListener -m
%QUEUE_MANAGER% -q %QUEUE_REQUEST_HO%
3.2.3.3. Các thực thi phía client
Để sử dụng việc vận chuyển thông điệp SOAP qua WebSphere MQ, ứng dụng client phải reference đến proxy đã được tạo ở phần trước (khi thực hiện triển khai Web Service), đăng ký sự vận chuyển đó với Microsoft .NET thông qua việc gọi phương thức:
IBM.WMQSOAP.Register.Extension();
Với ứng dụngclient, khi được referrence đến, proxy sẽ hoạt động như một đoạn trung gian giữa client và Web Service, nó che dấu sự phức tạp trong lời gọi Web Service và chuyển tiếp những lời gọi đó từ client đến Web Service.
Để có thể sử dụng proxy trên, ứng dụng client cũng phải reference đến file amqwsoap.dll (trong thư mục bin cài đặt ra của WebSphere MQ) và thư viện
System.Web.Services.
Từ đó kiến trúc hạ tầng .NET sẽ nhận ra URI với tiền tố “jms:” và thực hiện gọi mã SOAP/WebSphere MQ sender. Ứng dụng client vận chuyển thông điệp SOAP qua WebSphere MQ sử dụng URI đặc biệt để định nghĩa một số thuộc tính WebSphere MQ cho quá trình vận chuyển với định dạng:
URI = "jms:/queue?destination=" + Request_Queue + "@" + QMGR +
"&connectionFactory=connectQueueManager(" + QMGR +
")clientChannel(" + Connection + ")clientConnection(" + Server_IP + "(" + Server_Port + "))" +
"&initialContextFactory=com.ibm.mq.jms.Nojndi" +
"&timeout=" + Timeout + "&targetService=”+ Service_Name +”.asmx" + "&replyDestination=" + Response_Queue;
Trong đó chứa một danh sách các cặp [thuộc tính = giá trị] ngăn cách nhau bởi dấu phẩy. Mã proxy được tạo ra bởi quá trình triển khai service phía server đã nói ở trên sẽ thiết lập một URI mặc định dựa trên tên lớp của service và target queue manager. Client sử dụng tên queue và queue manager trong URI để mở queue cho việc gửi message. Cụ thể danh sách đầy đủ các giá trị trong URI bao gồm:
- Request_Queue: xác định tên queue mà ứng dụng client sẽ đặt message yêu cầu vào để gửi lên Web Service (trên server Bank Gateway).
Request_Queue tương ứng với các ứng dụng client tại CTCK, chi nhánh và hội sở chính ngân hàng lần lượt là Q.RMT.SC.GW, Q.RMT.BR.GW, Q.RMT.HO.GW
- QMGR: xác định queue manager mà client kết nối đến, QMGR tương ứng với các ứng dụng client tại CTCK, chi nhánh và hội sở chính ngân hàng lần lượt là SC01, BR106, HO.
- Connection: Xác định tên channel Server connection, tương ứng với các ứng dụng client tại CTCK, chi nhánh và hội sở chính ngân hàng lần lượt là CH.SC.SVRCONN, CH.BR.SVRCONN, CH.HO.SVRCONN - Server_IP và Server_Port: Địa chỉ máy chủ Bank Gateway và port
dùng cho việc kết nối WebSphere MQ như được khai báo trong cấu hình channel sender.
- Timeout: xác định thời gian timeout tính bằng mini giây mà client có thể đợi để nhận message trả về (mặc định là 10000ms).
- Service_Name: Tên web service sẽ xử lý yêu cầu,Service_Name tương ứng với các ứng dụng client tại CTCK, chi nhánh và hội sở chính ngân hàng lần lượt là SCService, BRService, HOService.
- Response_Queue: xác định queue mà phía client sử dụng để nhận
message trả về, Response_Queue tương ứng với các ứng dụng client tại CTCK, chi nhánh và hội sở chính ngân hàng lần lượt là Q.LOCAL.SC, Q.LOCAL.BR, Q.LOCAL.HO
Quá trình ứng dụng .NET phía client của CTCK, chi nhánh và hội sở chính của ngân hàng thực hiện gọi đến các phương thức được cung cấp bởi các dịch vụ Web Service trên máy chủ Banking Gateway được mô tả như sau:
- Web Service được tạo và triển khai, proxy mà nó tạo ra được import vào môi trường .NET client.
- Listener của Web Service được start để client có thể gọi service thông qua proxy.
- Một kết nối thích hợp tới Web Service queue manager (được xác định từ URI của proxy) được thiết lập.
- Client gửi đi một message để yêu cầu một chức năng nào đó.
- SOAP/WebSphere MQ sender, được gọi bởi kiến trúc .NET, sẽ ghi một yêu cầu SOAP để gọi đến phương thức tương ứng của Web Service.
- Sender tạo ra yêu cầu và đặt nó vào queue request của WebSphere MQ và đợi để được đem đi.
- SOAP/WebSphere MQ listener theo dõi queue request và cảm nhận được có message vừa đến, bắt lấy message và thực hiện gọi web service.
- Web Service tương ứng (SCService, BRService, HOService) thực hiện phương thức được gọi và trả về kết quả.
- Kết quả đáp ứng từ web service được đặt vào queue response và được SOAP/WebSphere MQ listener trả về cho SOAP/WebSphere MQ sender.
- Cuối cùng SOAP/WebSphere MQ sender trả response về cho ứng dụng client.
3.2.3.4 An toàn và bảo mật
Sự giao tiếp an toàn giữa Web Service client và Web Service đạt được hiệu quả cao nhất khi sử dụng Secure Sockets Layer (SSL). Để cấu hình SSL ta phải khai báo một số từ khoá trong URI. Nếu sử dụng môi trường .NET client thì từ khoá là:
- sslKeyrepository (không yêu cầu mật khẩu vì nó đã được lưu trữ trong file .kdb)
- sslCipherSpec
Trước khi thiếp lập những giá trị này trong URI, cần phải tạo và cấu hình