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就是所有字段)