1. 程式人生 > >ballerina 學習二十六 專案docker 部署&& 執行(二)

ballerina 學習二十六 專案docker 部署&& 執行(二)

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執行的測試

參考資料

https://ballerina.io/learn/by-guide/restful-service/