ballerina 學習二十六 專案docker 部署&& 執行(二)
阿新 • • 發佈:2018-11-05
ballerina 從釋出,到現在官方文件的更新也是很給力的,同時也有好多改進,越來越好用了
可以參考官方文件 https://ballerina.io/learn/by-guide/restful-service/
專案初始化
- 專案結構
└── guide
└── restful_service
└── order_mgt_service.bal
- 初始化專案
cd guide && ballerina init
- 效果
新增程式碼&& docker 支援
- http rest 服務編寫
import ballerina/http; import ballerinax/docker; // docker 支援配置 @docker:Config { registry:"dalongrong", name:"restful_service", tag:"v1.0" } endpoint http:Listener listener { port:9090 }; // Order management is done using an in memory map. // Add some sample orders to 'ordersMap' at startup. map<json> ordersMap; // RESTful service. @http:ServiceConfig { basePath: "/ordermgt" } service<http:Service> orderMgt bind listener { // Resource that handles the HTTP GET requests that are directed to a specific // order using path '/order/<orderId>'. @http:ResourceConfig { methods: ["GET"], path: "/order/{orderId}" } findOrder(endpoint client, http:Request req, string orderId) { // Find the requested order from the map and retrieve it in JSON format. json? payload = ordersMap[orderId]; http:Response response; if (payload == null) { payload = "Order : " + orderId + " cannot be found."; } // Set the JSON payload in the outgoing response message. response.setJsonPayload(untaint payload); // Send response to the client. _ = client->respond(response); } // Resource that handles the HTTP POST requests that are directed to the path // '/order' to create a new Order. @http:ResourceConfig { methods: ["POST"], path: "/order" } addOrder(endpoint client, http:Request req) { json orderReq = check req.getJsonPayload(); string orderId = orderReq.Order.ID.toString(); ordersMap[orderId] = orderReq; // Create response message. json payload = { status: "Order Created.", orderId: orderId }; http:Response response; response.setJsonPayload(untaint payload); // Set 201 Created status code in the response message. response.statusCode = 201; // Set 'Location' header in the response message. // This can be used by the client to locate the newly added order. response.setHeader("Location", "http://localhost:9090/ordermgt/order/" + orderId); // Send response to the client. _ = client->respond(response); } // Resource that handles the HTTP PUT requests that are directed to the path // '/order/<orderId>' to update an existing Order. @http:ResourceConfig { methods: ["PUT"], path: "/order/{orderId}" } updateOrder(endpoint client, http:Request req, string orderId) { json updatedOrder = check req.getJsonPayload(); // Find the order that needs to be updated and retrieve it in JSON format. json existingOrder = ordersMap[orderId]; // Updating existing order with the attributes of the updated order. if (existingOrder != null) { existingOrder.Order.Name = updatedOrder.Order.Name; existingOrder.Order.Description = updatedOrder.Order.Description; ordersMap[orderId] = existingOrder; } else { existingOrder = "Order : " + orderId + " cannot be found."; } http:Response response; // Set the JSON payload to the outgoing response message to the client. response.setJsonPayload(untaint existingOrder); // Send response to the client. _ = client->respond(response); } // Resource that handles the HTTP DELETE requests, which are directed to the path // '/order/<orderId>' to delete an existing Order. @http:ResourceConfig { methods: ["DELETE"], path: "/order/{orderId}" } cancelOrder(endpoint client, http:Request req, string orderId) { http:Response response; // Remove the requested order from the map. _ = ordersMap.remove(orderId); json payload = "Order : " + orderId + " removed."; // Set a generated payload with order status. response.setJsonPayload(untaint payload); // Send response to the client. _ = client->respond(response); } }
- 執行
ballerina run restful_service
- 測試
post 資料
curl -v -X POST -d \
'{ "Order": { "ID": "100500", "Name": "XYZ", "Description": "Sample order."}}' \
"http://localhost:9090/ordermgt/order" -H "Content-Type:application/json"
get
curl -i http://localhost:9090/ordermgt/order/100500
- 構建(支援docker)
ballerina build restful_service
- 生成的dockerfile
ballerina 生成的中間語言是跨平臺的
# Auto Generated Dockerfile
FROM ballerina/ballerina:0.982.0
LABEL maintainer="[email protected]"
COPY restful_service.balx /home/ballerina
CMD ballerina run restful_service.balx
- docker 執行
docker run -d -p 9090:9090 dalongrong/restful_service:v1.0
- 執行流程圖
可以使用vscode 的外掛,直接檢視,很方便
說明
ballerina 對於開發來說還真的是比較方便,平臺的支援也很好,後邊會有k8s執行的測試