zoukankan      html  css  js  c++  java
  • 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="dev@ballerina.io"
    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/

  • 相关阅读:
    存储过程output String[1]: Size 属性具有无效大小值0
    深入理解JS异步编程四(HTML5 Web Worker)
    深入理解JS异步编程三(promise)
    深入理解JS异步编程二(分布式事件)
    深入理解JS异步编程(一)
    不定高多行溢出文本省略
    深入解析js中基本数据类型与引用类型,函数参数传递的区别
    javascript的replace+正则 实现ES6的字符串模版
    从输入网址到显示网页的全过程分析
    WebStorage 和 Cookie的区别
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/9906676.html
Copyright © 2011-2022 走看看