系統整合語言Ballerina介紹
資料整合是一個複雜的問題,資料有不同的來源流向和流出方向,如各種資料庫,雲,遺留系統,ERP和內部部署應用程式。資料整合模式能讓企業組合來自不同源的資料,為使用者提供統一的檢視。
雲本地世界中的資料以多種不同的方式形成,並且存在於許多地方。您如何選擇使用,整合和分析雲原生資料可能與您習慣的不同。目前有各種選擇,從spring cloud到istio服務網格其實都已經包含整合模式。
什麼是Ballerina?
Ballerina(芭蕾舞女演員)是一種開源的併發程式語言,具有文字和圖形兩種表現形式。它旨在實現網路應用程式的無縫整合。它強烈而靜態地使用聯合型別系統編碼。Ballerina是Apache 2.0許可下的開源專案。本文內容和程式碼片段基於Ballerina 0.981.0釋出。
1.芭蕾舞女演員資料整合的工作原理:
Ballerina擁有豐富的軟體包,可以顯示端點,以實現各種外部資料來源(如SQL資料庫,NoSQL資料庫,CSV檔案,FTP檔案,Google電子表格等)之間的連線。對於每個資料來源,都有相應的客戶端在Ballerina VM上執行的端點。
2.為什麼使用芭蕾舞女演員進行資料整合?
芭蕾舞女演員語言專為整合領域而設計,由於以下原因,它允許快速簡便的資料整合。
聯結器支援各種資料來源
Ballerina客戶端端點用於連線外部資料來源,後端服務或API。為了資料整合的目的,ballerina提供了幾個SQL和NoSQL端點來與表格SQL和NoSQL資料來源進行互動。截至目前,Ballerina配備了以下資料端點(Ballerina 0.981.0版)Ballerina提供了編寫自定義本機/ Ballerina客戶端端點的擴充套件機制,可根據需要連線到任何自定義資料來源。
JDBC端點 - 內建聯結器,通過JDBC驅動程式連線基於SQL的表格資料來源。
MySQL端點 - 為MySQL DB定製的SQL端點。
H2端點 - 為H2 DB定製的SQL端點。
MongoDB Endpoint - 連線到MongoDB並允許資料查詢操作和操作操作,如更新,刪除等。
Cassandra Endpoint - 用於連線Ballerina和Cassandra資料來源並更新,選擇資料。
Redis Endpoint - 將Ballerina與Redis資料來源連線起來。
FTP端點 - 連線到FTP伺服器並執行I / O操作。
Google電子表格端點 - 通過Ballerina訪問Google Spreadsheet API版本v4。
芭蕾舞女演員中建立表格和插入/選擇資料的一個簡單示例如下:
import ballerina/config;
import ballerina/h2;
import ballerina/io;
type Student record {
int age;
string firstName;
};
endpoint h2:Client testDB {
path: config:getAsString("DATABASE_PATH", default = "./h2-client"),
name: config:getAsString("DATABASE_PATH", default = "testdb"),
username: config:getAsString("DATABASE_USER", default = "SA"),
password: config:getAsString("DATABASE_PASS", default = ""),
poolOptions: { maximumPoolSize: 5 }
};
function main(string... args) {
//Create Table in a in memory H2 Database
var ret= testDB ->update("CREATE TABLE student(age INT, name VARCHAR(255))");
//Insert data into the table
ret = testDB ->update("INSERT INTO student(age, name) values (?, ?)", 10, "John");
ret = testDB ->update("INSERT INTO student(age, name) values (?, ?)", 20, "Anne");
//Select data from the table
table<Student> tableStudent = check testDB ->select("SELECT * FROM student",
Student, loadToMemory = true);
//Get the row count
int count = tableStudent .count();
//Convert table into json
json jsonData = check <json>tableStudent;
//Convert table to xml
xml xmlData = check <xml>tableStudent;
//Access each data record
foreach s in tableStudent {
io:println(s);
}
}
內建事務支援
事務在資料整合領域起著重要作用,事務是一系列資料操作語句,必須完全完成或完全失敗,使系統保持一致狀態。Ballerina語言支援資料和JMS聯結器操作的本地和xa事務。
其中一個主要區別是芭蕾舞女演員在多個微服務中支援分散式事務。當多個微服務彼此互動時,如果我們需要在單個事務中將它們聯絡在一起,則需要在傳統的兩階段提交上具有協調協議,因為每個微服務在不同的程序上執行。在芭蕾舞女演員中,微服務中的事務基於協調器實現。Ballerina為輕鬆定義事務邊界以及處理事務失敗和重試提供語法支援。
使用Ballerina的分散式事務的簡單程式碼如下:
import ballerina/http;
import ballerina/log;
import ballerina/mysql;
import ballerina/config;
//Create mysql client endpoint with config for employee db.
endpoint mysql:Client employeeDB {
host: config:getAsString("employeedb.host"),
port: config:getAsInt("employeedb.port"),
name: config:getAsString("employeedb.name"),
username: config:getAsString("employeedb.user"),
password: config:getAsString("employeedb.pass"),
dbOptions: { useSSL: false }
};
//Create mysql client endpoint with config for salary db.
endpoint mysql:Client salaryDB {
host: config:getAsString("salarydb.host"),
port: config:getAsInt("salarydb.port"),
name: config:getAsString("salarydb.name"),
username: config:getAsString("salarydb.user"),
password: config:getAsString("salarydb.pass"),
dbOptions: { useSSL: false }
};
//Employee Add service
@http:ServiceConfig {
basePath: "/hr"
}
service<http:Service> employeeService bind { port: 9090 } {
@http:ResourceConfig {
methods: ["POST"],
path: "/employee"
}
addEmployee(endpoint caller, http:Request req) {
json payload = check req.getJsonPayload();
string name = payload.name.toString();
float salary = check <float> payload.salary;
int age = check <int>payload.age;
int key = -1;
transaction with retries = 2 {
//Update first table and get the generated key
(int, string[]) retWithKey = check employeeDB->updateWithGeneratedKeys(
"INSERT INTO Employee (name, age) VALUES (?,?)", (), name, age);
var (count, ids) = retWithKey;
string generatedKey = ids[0];
key = check <int>generatedKey;
//Update the second table with previous key
var ret = salaryDB->update("INSERT INTO Salary (id, month_salary)
VALUES (?, ?)", key, salary);
} onretry {
log:printError("Transaction failed, retrying ...");
key = -1;
}
//Generate and send the response
http:Response res = new;
res.setPayload("Account added for: " + untaint name + " with ID:" + key + "\n");
caller ->respond(res) but {
error e => log:printError("Error in responding", err = e)
};
}
}
Banq注: 從程式碼中看,只是定義了事務邊界,重試次數,ACID中原子性和完整一致性,把插入員工表產生的ID作為薪資表的外來鍵,兩張表的完整一致性應該是資料庫ACID本身提供,現在通過XA 2PC完成,還需要設定重試嗎?
型別系統
在大多數傳統程式語言中,SQL結果集,JSON資料,XML資料等不被視為一等型別。在使用或操作這些資料時,我們必須使用各種外部庫或附加元件來完成工作。但是,芭蕾舞女演員採用先進的型別系統設計,具有對不同資料型別和格式的一流支援。因此,使用者可以輕鬆地使用較少數量的程式碼行生成,操作和轉換從一種型別到另一種型別。以下是Ballerina中能夠處理不同資料型別的基本型別。
值型別 - int,float,string,boolean,byte
table - 表示Ballerina中的表格資料。(例如:SQL查詢返回的結果集中的資料)
JSON - 用於表示JSON資料的內建型別
XML - 用於表示XML資料的內建型別
record - 允許定義使用者定義的型別
陣列 - 資料陣列
map - 鍵值對
在處理資料整合方案時,表,JSON和XML記錄型別非常有用。該表是一種特殊型別,其設計目的是類似於關係資料庫表的表。表值包含一組不可變的列名和一組可變行。每個列名都是一個字串,每一行都是一個將值與每個列名相關聯的對映。行是無序的,允許重複。如果Ballerina表是從SQL操作生成的,則可以由實際資料庫表支援,或者使用者可以使用某些資料建立記憶體表。表型別的優點是使用者可以直接將業務邏輯中定義的記錄型別對映到資料庫表中的資料。
在Ballerina中,表可以直接轉換為XML或JSON型別,表可以對映到記錄型別,其中每行表格資料都對映到記錄中。此外,JSON,地圖,記錄等是可互操作的型別,並且轉換/轉換允許容易地在這些不同型別之間進行轉換。
資料流支援
在Ballerina中,表到JSON和表到XML型別的轉換會產生流資料。利用資料流功能,當服務客戶端發出請求時,結果將流式傳輸到服務客戶端,而不是在伺服器中構建完整結果才將其返回。這允許結果中存在幾乎無限的有效載荷大小,並且響應對於客戶端是即時的。在那裡,對應於特定查詢的結果集逐行轉換為XML / JSON,並在轉換髮生在一行時寫入線。
能夠通過HTTP服務將資料公開為服務
企業的成功在於能夠整合整個組織的資料並對其進行分析,從而做出更明智的決策。因此,以方便的方式訪問資料是任何資料整合場景中的關鍵要求。API使這種資料暴露成為可能,REST是與Web,移動和雲應用程式進行通訊的最流行的API之一。藉助Ballerina中豐富,快速,簡便的HTTP REST服務開發支援,它可以通過REST API實現快速資料服務。
使用工具進行圖形資料建模
Ballerina為任何程式提供文字語法和相應的圖形語法。整個芭蕾舞女演員計劃可被視為一系列相互作用的序列圖。這樣可以更好地檢視和理解整合場景,資料庫端點表示為序列圖的參與者。這有助於開發人員清楚地瞭解整個資料整合流程。Ballerina IDE工具和外掛支援給定芭蕾舞女演員程式碼的此圖表檢視