系统集成语言Ballerina介绍

18-10-03 banq
                   

数据集成是一个复杂的问题,数据有不同的来源流向和流出方向,如各种数据库,云,遗留系统,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工具和插件支持给定芭蕾舞女演员代码的此图表视图