爱智EdgerOS之深入解析高效可靠的轻量级服务VSOA

一、VSOA 简介

① 什么是 SOA?

SOA (Service Oriented Architecture) ,即面向服务的架构,是一种分布式计算的软件设计方法,软件的部分组件(调用者),可以通过网络上的通用协议调用另一个应用软件组件执行、运作,让调用者获得服务。这里的服务应视为软件功能的一个独立单元,可以远程访问并独立执行与更新,比如说需要查询的指定状态信息或者要执行的某项操作。换句话说,SOA 集成了独立部署和维护的软件组件,并允许它们相互通信和协同工作,以构建一个跨系统的软件应用。

② 什么是 VSOA?

  • VSOA(Vehicle SOA)是翼辉面向“任务关键型云原生架构”推出的系列产品之⼀。所谓任务关键(Mission-Critical)型系统,即应⽤于轨道交通、智能电网、⼯业⾃动化、汽⻋电⼦、医疗器械等与⼈⽣命息息相关场景的系统,此类系统对实时性、安全性、可靠性有极其苛刻的要求,通常需要系统具备功能安全、信息安全、故障隔离与恢复、可靠性、实时性等⼀系列要求。此类系统的任何⼀个环节失效都可能对⽣命财产和环境构成安全威胁乃⾄出现灾难性后果,任务关键型系统可将这种灾难和危害的发⽣控制在可接受的范围内。

二、VSOA 的优势

  • 目前市面上主流的任务关键型架构,通常会遇到学习和使用繁琐、依赖复杂、代码整合麻烦和实时性低等问题。于是翼辉信息 VSOA 设计为⼀个轻量级的适⽤于任务关键领域的微服务架构,⽅便开发者构建大型分布式松耦合软件系统,且⽀持并⾏开发。
  • 其主要特点为⽀持多种编程语⾔、多 CPU 架构环境与多操作系统平台,同时不依赖任何第三⽅库;架构简洁、资源占用小、服务响应速度快。使用者无需单独学习 IDL(Interface description language)语言,具有开发成本低、开发效率高等特点。考虑到任务关键型场景的多样性和碎片化特点,VSOA 汇集订阅/发布、RPC、高带宽数据流以及⾃定义数据报等功能于⼀体,可满⾜任何分布式应用模型;同时提供非⼊侵式仿真测试工具与便捷的开发环境,让开发者在享受云计算先进的开发体验以及高效的⽣产效率的同时,继续保持任务关键领域对业务功能和性能的⾼可靠需求。
  • VSOA 兼容多种通信风格,开发人员可以根据不同的应用场景采用不同的通信方式,VSOA 支持以下特性:
    • 支持统一 URL 的资源标记;
    • 支持 URL 匹配订阅和发布模型;
    • 支持实时的远程过程调用;
    • 支持并行多个命令序列;
    • 支持多通道全双工高速并行数据流;
    • 支持网络 QoS 控制;
    • 轻松实现服务器容错设计;
    • 支持多语言绑定。

三、VSOA 通信机制

  • VSOA 传输数据的有效负载分为 param 和 data 两种形式,param 可以为 object 或 string ,data 为 Buffer。
/**
 * server.publish(url[, payload])
 * @param url {string}
 * @param payload {object} 
 */
server.publish('/a/b/c',{ param:{ hello:'hello'}})
server.publish('/a/b',{ param:{ hello:'hello'}, data:new Buffer([1,2,3])})

① subscribe / publish

在这里插入图片描述

  • 基于订阅/发布的通信模型是实现去中⼼化通信功能的最直接有效的⽅式。server 端发布一个消息,所有订阅此 URL 的 client 端都可以收到该消息。URL 通过 / 作为分隔符,当 client 订阅 /A 的消息, server 发布的类似 /A 、/A/B 、/A/B/C 等消息都可以匹配接收到。
/**
 * server.js
 */
server.publish('/a/b/c',{ param:{ hello:'hello'}})
server.publish('/a/b',{ param:{ hello:'hello'}, data:new Buffer([1,2,3])})

/**
 * client.js
 */
client.subscribe('/a', function (error) {
  if (error) {
    console.error('Subscribe error', error)
  }
})
client.on('message', function (url, payload) {
  console.log('Message:', url, JSON.stringify(payload))
})

② datagram

在这里插入图片描述

  • 这是一种无依赖的通信方式,server / client 将 DATAGRAM 类型的数据发送之后, ⽆需等待对端应答。通常 DATAGRAM 类型的数据用于传输一些不需要确认的数据。
/**
 * client.js
 */
client.datagram('/foo', { "param": { 'client send time': new Date().toLocaleString() } })
 
client.on('datagram', (url, payload) => {
  console.log('client receive Datagram:', url, JSON.stringify(payload))
})

/**
 * server.js
 */
server.ondata = function (cli, url, payload) {
  console.log('server receive datagram', url, JSON.stringify(payload.param))
  /*
  * do something or reply a message
  */
  cli.datagram('/bar', { param: `${new Date().toLocaleString()} ` })
}

③ call / fetch

在这里插入图片描述

  • 当 client 端发起 RPC 命令的请求,服务器会收到相应的请求事件,事件名称和 client 请求的 URL 一致。为了保证可靠,client 端的每一次请求都有一个序列号,server 端可以对某个请求进行回复。
/**
 * server.js
 */
server.on('/a/b/c', function (cli, request, payload) {
  /*
  * do someting and reply
  */
  console.log(JSON.stringify(payload))
  cli.reply(0, request.seqno, {param:'completed'});
});

/**
 * client.js
 */
client.call('/a/b/c', { method: vsoa.method.SET }, {
  param: { hello: 'hello' }
}, function (error, payload) {
  if (error) {
    console.error('RPC call error:', error);
    if (error.status) {
      console.error('Error status code:', error.status);
    }
  } else {
    console.log('RPC call OK:', JSON.stringify(payload));
  }
})

④ 全双工流

在这里插入图片描述

  • server 端创建一个流等待 client 端的流连接,这个对象继承自 Stream.Duplex ,每一个 server 包含一个tunid 。client 端流使用这个 tunid 连接 server 端流,完成连接后,此 tunid 置为 0,其他 client 端不能再次使用这个 tunid 进行连接传输数据流。客户端(服务端)可以通过可写流向对端发送消息,通过可读流接收对端消息,两个流内的数据并没有直接的关系。这种全双工方式无需进行读写方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利,我们也可以通过这种方式进行文件传输等操作。
/**
 * server.js
 */
server.on('/a/b/c', function (cli, request, payload) {
  var stream = server.createStream();
  cli.reply(0, request.seqno, stream.tunid);
  
  stream.on('connect', () => {
    stream.write(Buffer([0, 1, 2, 3, 4, 5, 6]));
    stream.close();
  });
    
  stream.on('timeout', () => {
    console.log('No client connect stream!');
  });
});

/**
 * client.js
 */
 client.fetch('/a/b/c').then((payload, tunid) => {
  var stream = client.createStream(tunid);
  // Duplex Stream
  stream.on('data', chunk => {
    console.log('Stream rece:', chunk.byteLength);
  });
}).catch(error => console.error(error));

四、VSOA 定位服务

  • VSOA 提供一种类似于 DNS 的服务,它将 VSOA 服务器的名字映射到服务器的地址上,可以通过服务器的名字快速找到服务器的地址。当我们未指定位服务的地址时, Position Server 使用 VSOA 服务器的名字在 /etc/vsoa.pos 文件查找 VSOA 服务器的地址。我们也可以使用 vsoa.Position.server 指定定位服务的地址,后续查询操作将使用此地址进行查询。当在服务器的初始化列表找不到的时候,会调用 position.onquery 函数返回。 此外,VSOA 的位置服务提供标准实现模板,⽀持多级位置服务级联查询,冗余服务管理等。
const vsoa = require('vsoa');
const socket = require('socket');

const saddr = { domain: socket.AF_INET, addr: '127.0.0.1', port: 3200 };
const position = new vsoa.Position([
  { name: 's1', domain: 2, addr: '127.0.0.1', port: 2050, security: false }
], saddr);

position.start();
vsoa.Position.server(saddr)

position.onquery = function (name, domain, callback) {
  console.log(`cannot find ${name} ,call this function`);
  if (name === 's2') {
    callback({ name: 's2', domain: 2, addr: '192.168.128.100', port: 2049, security: false });
  } else {
    callback({ name: 'default', domain: 2, addr: '192.168.100.100', port: 3000, security: false });
  }
}

vsoa.lookup('s1', function (error, saddr) {
  if (error) {
    console.log(`lookup s1 error: ${error}`);
  } else {
    console.log('the ret of lookup s1:', JSON.stringify(saddr));
  }
});

vsoa.lookup('s2', function (error, saddr) {
  if (error) {
    console.log(`lookup error: ${error}`);
  } else {
    console.log('the ret of lookup s2:', JSON.stringify(saddr));
  }
});
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
功能模块如下: 个人办公 内部邮件 系统内部的信息交流、文件交流、信息提醒等 Internet邮件 接口外部邮箱,采用pop3和smtp协议代收代发 单位公告通知 管理公告通知、新闻等信息,可选定特定部门发送 投票 内部信息投票,每个用户拥有一次投票权利 手机短信 发送内部或者外部的手机短信消息,用于提醒等 日程安排 个人日程以日历形式重点体现,到期自动提醒 工作日志 工作过程中的记录以及工作日志等 通讯簿 包含各种分类,主要用于联系使用 个人设置 设置个人参数、邮箱参数、提醒参数、修改密码等 审批流程 新建工作 新建新的审批工作流,选定需要的工作新建即可 我的工作 个人发起的所有工作,包括已审批、未审批的所有工作 待办工作 需要当前用户进行办理或者审批的工作列表 已办工作 当前用户已经办理过的各项工作,包含历史工作 工作查询 查询系统中工作的信息,全面检索 工作监控 管理员监控运行,发现问题,可强制干预 归档工作 已办理完成的工作,自动进行归档 工作委托 当前用户指定办理人,所有待办事项自动提交到委托人办理 流程设置 自定义流程、自定义表单、表单各个字段在流程中权限控制 印章管理 管理公章与私章,查看印章的各项使用日志等 公文收发 接收文件 需要接受的文件,未签收时有颜色标注 传阅文件 传阅发送出去文件 接收分类 按照指定文件夹分类查看 传阅分类 传阅文件夹个人分类查看 工作管理 我的计划 个人工作计划,可共享给其他指定用户协同查看 协同计划 其他用户协同共享查看的工作计划信息 我的汇报 个人工作汇报,可共享给其他指定用户协同查看 协同汇报 其他用户协同共享查看的工作汇报信息 下属任务 我的任务 个人接收到的各项任务,提交工作任务报告 任务分配 对下属用户分派工作任务,实时监控任务情况 下属日程 下属员工的日程安排信息 下属日志 下属员工的工作日志信息 下属计划 下属员工的工作计划信息 下属汇报 下属员工的工作汇报信息 下属邮件 下属员工的内部邮件信息 下属客户 下属员工的客户资料信息 知识文档 个人文件 类同与网络硬盘、个人文件柜存储等文件存储类 单位文件 单位各类文件存储区 项目文件 项目实施、进度、评审等文件存储类 电子刊物 电子刊物等文件存储类 重要文件 特别重要的文件额外存储类 机密文件 机密文件存储类 知识库 各项知识库、技术资料、学习资料、单位规范等 技术文件 技术类文件存储 共享文件 查看各类共享的文件资料 回收站 删除的文件,可恢复或者彻底删除 扩展应用 资产管理 管理固定资产、仪器、办公用品等 培训管理 管理培训信息 会议管理 各项会议会议、上传会议记录 车辆管理 车辆信息、使用、维修、保险、加油等 图书管理 图书信息、借阅、归还等 档案卷库 各类档案分卷库保存、销毁 考试管理 在线考试、可分题库、题目类型、试卷制定、自动评分等 学习管理 在线学习、学习心得、领导批注等 客户管理 会员管理 会员信息管理,即为个人类别的客户 我的客户 个人客户资料、联系记录、需求等 客户管理 管理所有客户资料,联系人、联系记录、需求计划等 进销存类 产品管理 产品管理、库存列表显示、库存报警等 销售管理 销售合同、产品销售出库、利润等 采购管理 采购合同、产品采购入库等 供应商管理 管理各个供应商、供应商联系人 项目管理 项目信息 项目各项信息、状态等 评审信息 评审记录 项目进度 项目具体进度安排、时间进度 收款信息 收款具体情况,按照项目分类 项目实施 项目的具体实施情况 报销申请 项目类单独报销,也可使用审批流程中的自定义流程 报销管理 审批报销记录,复杂流程可使用审批流程 项目利润 核算具体利润情况 数据统计 数据各项统计 人力资源 考勤管理 考勤记录、考勤设置、查询、统计等 人事档案 人事基本资料维护 人事合同 合同管理情况 奖惩记录 奖惩各类记录管理 奖惩制度 各类具体制度安排、单位规章制度等。 应聘简历 简历管理,建立单位人才库 面试管理 具体面试情况管理 绩效考核 绩效考核数据上报等。 绩效参数 绩效各项参数的设置 薪酬管理 薪酬各类数据管理 薪酬参数 各个参数设置 报表中心 报表分类 报表分类设置,根据需要可分多个类别 报表管理 动态定制报表、动态数据抓取。报表可自定义。 信息交流 论坛BBS 论坛各个信息、帖子发帖信息 版块设置 版块具体设置 内部聊天室 各个聊天室进入后可自由聊天 聊天室设置 聊天室的基本设置 组织机构 单位信息查询 查询单位基本信息 部门信息查询 查询部门信息 用户信息查询 查询用户个人信息 附件程序 电话区号查询 电话区号查询 邮政编码查询 邮政编码查询,超级链接到网址 列车时刻查询 链接到列车时刻查询网址 公交线路查询 公交线路查询 法律法规查询 法律法规各项资料超级链接查询 休闲游戏 链接到游戏网 万年历 日历基本信息 世界时钟 时间查询 常用网址 常用导航资料 系统管理 单位信息管理 管理单位基本信息 部门信息管理 设置部门机构,支持多分公司,集团化应用 用户信息管理 用户信息设置、下属设置、权限设置 角色信息管理 定义权限角色列表,设置角色权限 红头文件模板 红头文件模板,编辑时直接可调用 系统日志管理 系统日志,登录、删除、查看等各个操作 文件上传设置 文件上传格式参数的设置 系统菜单维护 系统各个菜单管理、节点设置、导航设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ栺尖篴夢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值