1. 程式人生 > >ballerina 學習二十八 快速grpc 服務開發

ballerina 學習二十八 快速grpc 服務開發

ballerina 的grpc 開發模型,對於開發者來說簡單了好多,不是schema first 的方式,而是我們
只要編寫簡單的ballerina service 就可以了,proto 檔案是自動幫我們生成的,同時我們用這個
檔案方便的生成各種客戶端的程式碼

專案準備

  • 專案結構
├── Ballerina.toml
├── grpc_service
│ └── order_mgt_service.bal
  • grpc 程式碼

    可以看出就是普通的ballerina service

import ballerina/grpc;

// gRPC service endpoint definition.
endpoint grpc:Listener listener {
    host:"localhost",
    port:9090
};

// Order management is done using an in memory map.
// Add sample orders to the 'orderMap' at startup.
map<orderInfo> ordersMap;

// Type definition for an order.
type orderInfo record {
    string id;
    string name;
    string description;
};

// gRPC service.
@grpc:ServiceConfig
service orderMgt bind listener {

    // gRPC method to find an order.
    findOrder(endpoint caller, string orderId) {
        string payload;
        // Find the requested order from the map.
        if (ordersMap.hasKey(orderId)) {
            json orderDetails = check <json>ordersMap[orderId];
            payload = orderDetails.toString();
        } else {
            payload = "Order : '" + orderId + "' cannot be found.";
        }

        // Send response to the caller.
        _ = caller->send(payload);
        _ = caller->complete();
    }

    // gRPC method to create a new Order.
    addOrder(endpoint caller, orderInfo orderReq) {
        // Add the new order to the map.
        string orderId = orderReq.id;
        ordersMap[orderReq.id] = orderReq;
        // Create a response message.
        string payload = "Status : Order created; OrderID : " + orderId;

        // Send a response to the caller.
        _ = caller->send(payload);
        _ = caller->complete();
    }

    // gRPC method to update an existing Order.
    updateOrder(endpoint caller, orderInfo updatedOrder) {
        string payload;
        // Find the order that needs to be updated.
        string orderId = updatedOrder.id;
        if (ordersMap.hasKey(orderId)) {
            // Update the existing order.
            ordersMap[orderId] = updatedOrder;
            payload = "Order : '" + orderId + "' updated.";
        } else {
            payload = "Order : '" + orderId + "' cannot be found.";
        }

        // Send a response to the caller.
        _ = caller->send(payload);
        _ = caller->complete();
    }

    // gRPC method to delete an existing Order.
    cancelOrder(endpoint caller, string orderId) {
        string payload;
        if (ordersMap.hasKey(orderId)) {
            // Remove the requested order from the map.
            _ = ordersMap.remove(orderId);
            payload = "Order : '" + orderId + "' removed.";
        } else {
            payload = "Order : '" + orderId + "' cannot be found.";
        }

        // Send a response to the caller.
        _ = caller->send(payload);
        _ = caller->complete();
    }
}

生成proto&&客戶端程式碼

  • proto生成
ballerina build grpc_service/


  • 客戶端程式碼
ballerina grpc --input target/grpc/orderMgt.proto --output grpc_client


  • 修改生成的客戶端程式碼
import ballerina/log;
import ballerina/grpc;

// This is client implementation for unary blocking scenario
public function main(string... args) {
    // Client endpoint configuration
    endpoint orderMgtBlockingClient orderMgtBlockingEp {
        url:"http://localhost:9090"
    };

    // Create an order
    log:printInfo("-----------------------Create a new order-----------------------");
    orderInfo orderReq = {id:"100500", name:"XYZ", description:"Sample order."};
    var addResponse = orderMgtBlockingEp->addOrder(orderReq);
    match addResponse {
        (string, grpc:Headers) payload => {
            string result;
            grpc:Headers resHeaders;
            (result, resHeaders) = payload;
            log:printInfo("Response - " + result + "\n");
        }
        error err => {
            log:printError("Error from Connector: " + err.message + "\n");
        }
    }

    // Update an order
    log:printInfo("--------------------Update an existing order--------------------");
    orderInfo updateReq = {id:"100500", name:"XYZ", description:"Updated."};
    var updateResponse = orderMgtBlockingEp->updateOrder(updateReq);
    match updateResponse {
        (string, grpc:Headers) payload => {
            string result;
            grpc:Headers resHeaders;
            (result, resHeaders) = payload;
            log:printInfo("Response - " + result + "\n");
        }
        error err => {
            log:printError("Error from Connector: " + err.message + "\n");
        }
    }

    // Find an order
    log:printInfo("---------------------Find an existing order---------------------");
    var findResponse = orderMgtBlockingEp->findOrder("100500");
    match findResponse {
        (string, grpc:Headers) payload => {
            string result;
            grpc:Headers resHeaders;
            (result, resHeaders) = payload;
            log:printInfo("Response - " + result + "\n");
        }
        error err => {
            log:printError("Error from Connector: " + err.message + "\n");
        }
    }

    // Cancel an order
    log:printInfo("-------------------------Cancel an order------------------------");
    var cancelResponse = orderMgtBlockingEp->cancelOrder("100500");
    match cancelResponse {
        (string, grpc:Headers) payload => {
            string result;
            grpc:Headers resHeaders;
            (result, resHeaders) = payload;
            log:printInfo("Response - " + result + "\n");
        }
        error err => {
            log:printError("Error from Connector: " + err.message + "\n");
        }
    }
}

執行&&測試

  • 執行server
ballerina run grpc_service

  • client 呼叫
ballerina run grpc_client

參考資料

相關推薦

ballerina 學習 快速grpc 服務開發

ballerina 的grpc 開發模型,對於開發者來說簡單了好多,不是schema first 的方式,而是我們 只要編寫簡單的ballerina service 就可以了,proto 檔案是自動幫我們生成的,同時我們用這個 檔案方便的生成各種客戶端的程式碼 專案準備 專案結構

學習

linux學習七周二次課(3月20日)10.6 監控io性能10.7 free命令10.8 ps命令10.9 查看網絡狀態10.10 linux下抓包擴展tcp三次握手四次揮手 http://www.doc88.com/p-9913773324388.html 監控io性能ps命令 查看網絡狀態 linux下

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

ballerina 從釋出,到現在官方文件的更新也是很給力的,同時也有好多改進,越來越好用了 可以參考官方文件 https://ballerina.io/learn/by-guide/restful-service/ 專案初始化 專案結構 └── guide └──

ballerina 學習七 專案k8s部署&& 執行

ballerina k8s 部署和docker 都是同樣的簡單,編寫service 添加註解就可以了 參考專案 https://ballerina.io/learn/by-guide/restful-service/ 專案準備 專案程式碼 import ballerina/h

、歷史服務配置啟動檢視

1、配置mapred-site.xml [[email protected] hadoop]$ cd /opt/module/hadoop-2.7.2/etc/hadoop [[email&

【Katalon學習】除錯模式

除錯模式允許使用者調查導致自動化測試失敗的問題。 下面的示例向您展示除錯測試用例的基本步驟: 開啟一個測試用例並切換到Script檢視。       2. 雙擊指令碼編輯器的最左邊,以標記要開始除錯的步驟的斷點     &n

JavaWeb學習 ()————檔案上傳和下載

在Web應用系統開發中,檔案上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的檔案上傳和下載功能的實現。   對於檔案上傳,瀏覽器在上傳的過程中是將檔案以流的形式提交到伺服器端的,如果直接使用Servlet獲取上傳檔案的輸入流然後再解析裡面的請求引數是比較麻煩,所以一般選擇採用apache的開源

ballerina 學習七 專案k8s部署&& 執行

import ballerina/http; import ballerinax/kubernetes; // 支援k8s 的註解 @kubernetes:Ingress { hostname:"dalongrong", name:"ballerina-guides-rest

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

ballerina 從釋出,到現在官方文件的更新也是很給力的,同時也有好多改進,越來越好用了 專案初始化 專案結構 └── guide └── restful_service └── order_mgt_service.bal 初始化專案

ballerina 學習九 資料庫操作

dockerfile: mysql 資料庫的dockerfile,包含資料的初始化 FROM mysql/mysql-server:5.7 COPY inid.sql /docker-entrypoint-initdb.d docker-compose.yaml: docker-compose 執

Spring Cloud系列() Config服務端詳解—Finchley版本

在上一篇文章實現了基本結構的配置管理服務端和客戶端,同時講解了一些配置的基本原理。現在總結一下它是如何運作起來的。其中主要包含下面幾個要素。 遠端Git倉庫:用來儲存配置檔案,上一篇文章我儲存了應用名為repo的多環境配置檔案:repo-{profile}.properti

OpenCV學習:findcontours以及drawcontours練習

1. void findContours1.1 概述void findContours//提取輪廓,用於提取影象的輪廓(InputOutputArray image,//輸入影象,必須是8位單通道影象,並且應該轉化成二值的OutputArrayOfArrays contour

opencv學習()之基本影象閾值操作threshold

在二維數字影象中,其每個畫素點對應了不同的畫素值,其畫素值各不相同。可以對畫素值特定範圍內的影象影象進行操作,劃分這個範圍的值就被稱為影象閾值,它不是一個固定的量級,是根據每幅影象和處理要求動態改變。例如我們可以從影象中利用閾值分割出我們需要的部分,利用其畫素值

Salesforce LWC學習() 複製內容到系統剪貼簿(clipboard)

本篇參考: https://developer.mozilla.org/zh-CN/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard https://developer.salesforce.com/docs/component-li

JavaWeb學習 (七)————監聽器(Listener)在開發中的應用

  監聽器在JavaWeb開發中用得比較多,下面說一下監聽器(Listener)在開發中的常見應用 一、統計當前線上人數   在JavaWeb應用開發中,有時候我們需要統計當前線上的使用者數,此時就可以使用監聽器技術來實現這個功能了。 1 package me.gacl.web.

【轉】JMeter學習)JMeter測試Java(

sets interval permsize int 文件 不同 時間 結果 argument 實例: 服務為:將輸入的兩個參數通過IO存入文件; 1、打開MyEclipse,編寫Java代碼 服務: package test; import java.io.F

【轉】JMeter學習)內存溢出解決方法

不能 -xms 百度 解決 code apache 超過 軟件測試 內存 使用jmeter進行壓力測試時遇到一段時間後報內存溢出outfmenmory錯誤,導致jmeter卡死了,先嘗試在jmeter.bat中增加了JVM_ARGS="-Xmx2048m -Xms2048m

Python學習筆記()多線程

oop 模擬 筆記 標準庫 函數 只需要 pre 開始 print 摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431928238187

Linux學習)iptables () iptables規則語法

star amp accept log saving linux 意思 root bit 查看iptables規則: [root@ruanwenwu-0002 ~]# iptables -nvL Chain INPUT (policy ACCEPT 0 packets,

Linux學習筆記()awk

awkhead -n2 test.txt|awk -F ‘:‘ ‘{print $1}‘ //文件的前兩行,以:分隔,打印第一段 head -n2 test.txt|awk -F ‘:‘ ‘{print $0}‘ //文件的前兩行,以:分隔,打印所有的內容($N就是第N段,0就是所有字段)