由IBM Cloud托管并由Operational Decision Manager支持的业务规则服务使您可以在RuleApp中与应用程序代码分开定义,部署和维护业务规则和策略,从而提供更大的应用程序敏捷性。 您可以在RuleApp中更新业务逻辑并重新部署它,而无需对预订应用程序进行任何更改,花费更少的时间重新编码和测试业务策略更改,例如定价计算,资格确定或信贷批准。
为了演示将业务逻辑从在云中运行的调用应用程序的生命周期中分离出来的好处,我们将引导您逐步完成构建利用业务规则服务的示例应用程序的步骤。 然后,您将能够使用更复杂的规则扩展此应用程序,或者非常轻松地构建自己的应用程序。
“该示例预订应用程序展示了将Business Rules服务与Cloud中的Node.js应用程序集成的可能性,同时还利用了IBM Cloud平台的易于部署和可扩展性。 ”
我们的示例应用程序是针对正在构建其预订系统并希望为其客户提供搜索和预订房间的应用程序的一家连锁酒店的。 酒店的所有者需要定义各种业务策略来计算预订价格,例如提前预订折扣或最后一刻的报价。 例如,他们可能需要修改这些政策以适应不同的旅行季节和特殊事件。 他们可能还希望将来在特惠或会员计划上添加更多政策。
为了完成所有这些工作,我们将使用Node.js构建一个应用程序,并使用业务规则服务轻松管理和执行定义这些策略的业务规则。 同时,我们还利用了IBM Cloud平台的易于部署和可扩展性。
您的应用程序需要什么
- 熟悉Node.js。
- 一些Node.js模块: Express framework , EJS , async 。
- HTML和Bootstrap 3 CSS的基础知识。
- IBM Operational Decision Manager (ODM)的基本知识(推荐)。
- 适用于Java EE开发人员的Eclipse Juno 4.2.2 IDE。 为业务规则服务安装规则设计器插件 。
- Cloud Foundry cf命令行界面V6。 从GitHub下载并启动安装程序。
构建酒店预订应用
步骤1.在IBM Cloud中创建业务规则服务实例
- 在IBM Cloud目录中,单击“ 业务规则”服务。 例如,在“ 添加服务”部分中,将服务命名为BlueBooking-BusinessRules,然后选择[Leave unbound] 。 (您将在下一步中将该服务绑定到您的应用程序。)单击CREATE 。
- 在BlueBooking-BusinessRules服务详细信息页面中,请注意以下信息:
- 控制台URL和凭据(用于规则集部署)
- REST Execution API端点URL和凭据(用于规则集执行)
步骤2.使用Rule Designer定义您的应用程序业务逻辑
在此步骤中,您将学习用于在Rule Designer中编写业务规则的核心概念和活动。 但是,本文的重点不是提供有关此内容的详细说明。 有关更多信息,请参见下文。
在继续此步骤之前:
- 确保已在Eclipse Juno 4.2.2 IDE中为业务规则服务安装了规则设计器插件 。
- 从Git存储库中检查
BlueBookingXom
和BlueBookingRules
项目:
git clone https://git.ng.bluemix.net/rules_service_sample/BlueBookingV1.git
- 将它们导入到Eclipse工作区中,然后切换到Rule透视图以打开Rule Explorer 。
1.定义执行对象模型(XOM)
执行对象模型(XOM)是针对其执行规则的运行时模型。 IBM Operational Decision Manager(ODM)支持从Java™或XML源构建的执行对象模型。 出于本文的目的,您将使用在BlueBookingXom
Java项目中定义的基于Java的简单XOM,它包含两个类:
-
Hotel
类代表具有以下属性的酒店:- 饭店名称
- 酒店位置(城市)
- 房间的基本价格
-
Result
类使用以下信息定义客户端请求的结果:- 旅馆
- 登记日期
- 离开日期
- 通过业务规则执行计算的预订率
2.指定您的业务对象模型
业务对象模型(BOM)是在其上创建规则的模型。 通常,您可以从现有XOM源创建BOM表条目。 在我们的例子中, BlueBookingRules
Rule项目已经包含从BlueBookingXom
Java XOM创建的BOM表条目。
3.编写您的业务逻辑
现在,您可以编写应用程序业务逻辑。 样品BlueBookingRules
规则项目包含advanceReduction
决策表和bluebooking
规则流。
advanceReduction
决策表根据提前预订的时间计算折扣。
该bluebooking
规则流定义了执行两个连续的任务- initReservation
和pricing
:
-
initReservation
初始化将在执行规则后返回的Result
实例。 -
pricing
会触发要应用的折扣的计算。
4.定义业务逻辑和客户应用程序之间的契约
规则集参数指定您的业务逻辑和客户端应用程序之间的协定。 在这种情况下,您具有:
- 三个输入参数:酒店,入住日期,退房日期
- 执行业务逻辑后传递到客户端应用程序的一个输出参数:
Result
类的实例
步骤3.将业务逻辑部署到IBM Cloud中的业务规则服务
在继续此步骤之前,您可能需要熟悉业务规则应用程序的部署体系结构:
在Rule Designer中创建RuleApp项目
您将通过RuleApp
项目部署业务规则:
- 在“ 规则资源管理器”视图中,选择“
BlueBookingRules
规则”项目。 - 单击“ 规则项目图”视图的“ 部署和集成”部分中的“ 创建RuleApp项目”链接。
- 在“ 新建RuleApp项目”向导中,将项目名称设置为
BlueBookingRuleApp
,然后单击“ 完成” 。 将在您的工作空间中创建一个包含BlueBookingRules
Rule项目(作为规则集)的新RuleApp
项目。
将RuleApp
部署到IBM Cloud中的业务规则服务
现在,您可以将RuleApp
部署到Rules服务:
- 在“ 规则资源管理器”视图中,选择
BlueBookingRuleApp
项目。 - 右键单击
RuleApp
项目,然后选择RuleApp>部署 。 - 在“ 部署RuleApp存档”向导中,单击“ 下一步”以保留
RuleApp
和规则集部署的默认版本控制策略。 如果使用的是JDK 7,则会打开一个警告对话框。单击“ 确定”将其关闭。 - 在下一个向导页面上,选择“ 创建临时Rule Execution Server配置” 。 填写管理控制台的URL,登录名和密码以及您的业务规则服务实例的相应信息。 点击完成 。
如果一切顺利, 控制台将显示一条成功消息:
步骤4.在IBM Cloud中构建一个Node.js Express应用程序
1.创建一个Node.js入门应用程序并将其绑定到业务规则服务
- 在IBM Cloud目录中,单击用于Node.js运行时的SDK 。 在“ 以运行时开始:”部分中,为您的应用程序命名和一个主机URL,这将是它在Internet上的访问点(例如,mybookingapp.mybluemix.net)。 然后点击创建 。
- 选择应用程序,然后单击“ 绑定服务” 。 选择您在上一步中创建的业务规则服务实例,然后单击添加 。 现在,业务规则服务已绑定到您的应用程序。
- 现在,您可以下载IBM Cloud生成的样本启动程序应用程序并进行一些修改。 单击查看>指南 ,然后单击下载启动程序应用程序包以下载ZIP文件。 将其解压缩到您的文件系统。
2.添加和下载依赖项
首先,将必需的Node.js模块添加到依赖项中。 修改package.json
文件中的应用程序名称,描述和依赖关系。
{
"name": "mybookingapp",
"version": "0.0.1",
"description": "A simple hotel booking app using Rules Service in IBM Cloud",
"dependencies": {
"express": "3.4.7",
"ejs": "0.8.5",
"async": "0.7.0"
},
"engines": {
"node": "0.10.0"
},
"repository": {}
}
从应用程序的根目录运行npm install
命令,将依赖项下载到node_modules
目录。
3.制作页面搜索酒店
在该示例中,我们选择EJS作为模板引擎,因为它使用标准HTML语法。 但是您可以使用任何其他模板引擎,例如Jade,Hogan或Underscore。
- 修改
'view engine'
配置参数,使其成为您的应用程序的默认值:app.set('view engine', 'ejs');
- 在项目的
views
文件夹中创建一个index.ejs
文件,并创建一个包含三个输入HTML表单:城市,入住日期和退房日期以搜索酒店。 您可能希望在Bootstrap的帮助下为页面提供更好的外观并使其对不同的屏幕尺寸做出响应,但是在本文中我们将不涉及HTML标记和CSS样式的详细信息。 或者,您可以从Git存储库中的BlueBookingServer
项目复制并粘贴代码。 - 当
index.ejs
完成时,您只需将默认请求路由到该主页即可。// Main app page app.get('/', function(req, res){ res.render('index'); });
4.查找城市中的酒店
提交搜索表单后, GET
请求将路由到/ hotels。 我们要从请求中提取参数,并找到请求的城市中可用酒店的列表。 请注意,日期以协调世界时(UTC)时区解析。
// Hotel search results
app.get('/hotels', function(req, res){
// get the request parameters
var city = req.query.city;
// the date string is in mm/dd/yyyy format
var fromDateStr = req.query.from;
var toDateStr = req.query.to;
// parse the date string in UTC timezone
var fromDate = Date.UTC(fromDateStr.split('/')[2], fromDateStr.split('/')[0]-1, fromDateStr.split('/')[1]);
var toDate = Date.UTC(toDateStr.split('/')[2], toDateStr.split('/')[0]-1, toDateStr.split('/')[1]);
… //render the page
});
为简化起见,在此示例应用程序中,我们不会在数据库中查询酒店。 相反,我们加载数据文件(data / hotels.json)并返回所查询城市的酒店数组。
function findHotels(city) {
var hotels = require(__dirname + '/data/hotels.json');
return hotels[city];
}
5.调用业务规则服务以获取结果
当我们将业务规则服务绑定到我们的应用程序时,服务配置将添加到VCAP_SERVICES
,这是您的应用程序的只读环境变量。 您可以在仪表板中看到它。
with:
{
"businessrules": [
{
"name": "BlueBooking-BusinessRules",
"label": "businessrules",
"plan": "standard",
"credentials": {
"executionAdminUrl": "https://brsv2-XXXXXXXX.ng.bluemix.net/res",
"executionSoapUrl": "https://brsv2-XXXXXXXX.ng.bluemix.net/DecisionService/ws",
"executionAdminRestUrl": "https://brsv2-XXXXXXXX.ng.bluemix.net/res/apiauth",
"executionRestUrl": "https://brsv2-XXXXXXXX.ng.bluemix.net/DecisionService/rest",
"password": "password",
"user": "username"
}
}
]
}
- 可以通过调用执行REST API来执行部署在业务规则服务中的规则集。 您需要解析
VCAP_SERVICES
变量,并在您的应用程序中使用它来获取REST执行端点。// Retrieve the Rules Service parameters if (process.env.VCAP_SERVICES) { var env = JSON.parse(process.env.VCAP_SERVICES); var rules = env['businessrules'][0].credentials; } else { // for local testing var rules = { "executionRestUrl": "http://{your_execution_url}.mybluemix.net/DecisionService/rest", "user": "{username}", "password": "{password}" }; }
- 然后,在Node.js应用程序中,您可以加载
https
和url
模块,并使用它们对REST客户端进行编码。var https = require('https') , url = require('url');
- 创建一个使用以下参数的实用程序函数(
invokeRulesService
):-
rulesetPath
—以/{ruleappName}/{ruleappVersion}/{rulesetName}/{rulesetVersion}
形式的字符串。 业务规则服务支持RuleApp和规则集的版本控制。 如果您未指定版本,则将自动使用最新版本。 -
inputParam
—包含规则集输入参数有效负载的JSON对象。 -
callback
—响应的回调函数,因为HTTP请求是异步的。
-
- 该函数将向
executionRestUrl+rulesetpath
发出POST
请求,其中Content-Type
设置为application/json
,规则集输入参数位于请求正文中。 业务规则服务将执行规则集,并以JSON格式返回响应正文中的输出值。/* * Invoke the Rules Service to calculate the booking rates */ function invokeRulesService(rulesetPath, inputParams, callback) { var restUrl = url.parse(rules.executionRestUrl); var dataString = JSON.stringify(inputParams); // encode 'user:password' in Base64 string for basic authentication of the execution API var encodedCredentials = new Buffer(rules.user+':'+rules.password).toString('base64'); headers = { 'Content-Type': 'application/json', 'Content-Length': dataString.length, 'Authorization': 'Basic ' + encodedCredentials // basic authentication header }; var options = { host: restUrl.host, path: restUrl.path + rulesetPath, method: 'POST', headers: headers }; var req = https.request(options, function(resp) { resp.setEncoding('utf-8'); var responseString = ''; resp.on('data', function(data) { responseString += data; }); resp.on('end', function() { console.log(responseString); if (resp.statusCode == 200) var responseObject = JSON.parse(responseString); callback(responseObject); }); }); req.on('error', function(e) { console.log(e.message); }); req.write(dataString); req.end(); }
- 最后,您可以为每个酒店调用带有实用程序功能的业务规则服务,以获取带有价格的结果。 确保规则集路径正确,并且输入参数名称是您在规则集中定义的名称。 由于对业务规则服务的调用是异步的,因此您可以使用异步模块来遍历酒店数组,并在所有调用完成后返回结果数组。 不要忘记导出此函数,以便您可以从app.js调用它。
/* * Invoke the Rules Service to calculate the rate for each of the hotels */ function getResults(city, fromDate, toDate, callback) { var results = new Array(); var rulesetPath = '/BlueBookingRuleApp/BlueBookingRules/'; var hotels = findHotels(city); async.each(hotels, function(hotel, callback) { var inputParams = {"hotel": hotel, "checkin": fromDate, "checkout": toDate}; invokeRulesService(rulesetPath, inputParams, function(responseObj) { results.push(responseObj['result']); callback(); }); }, function(err) { if (err) { console.log(err); } else { callback(results); } }); } // export public functions exports.getResults = getResults;
6.显示结果
回到app.js; 您现在可以使用业务规则服务返回的结果来呈现hotel.ejs页面。
service.getResults(city, fromDate, toDate, function(results){
// render the page with data
res.render('hotels', {"city": city, "from": req.query.from, "to": req.query.to, "results": results});
});
步骤5.在IBM Cloud中推送并运行您的应用程序
现在,我们准备将Node.js应用程序推送到IBM Cloud。 您可以在项目文件夹中找到一个manifest.yml文件,该文件描述IBM Cloud中应用程序的名称和域,要创建多少实例,要分配多少内存等。
- 使用命令行
cf login -a api.ng.bluemix.net
登录到IBM Cloud。 出现提示时,输入您的用户名,密码,组织和空间。 - 运行
cf push
将应用程序部署到IBM Cloud。 - 应用程序运行时,请访问http://mybookingapp.mybluemix.net来测试您的应用程序。
结论
业务规则服务允许您分离业务逻辑和应用程序逻辑,以提高应用程序敏捷性。 您可以更新业务逻辑,然后重新部署RuleApp
而无需对预订应用程序进行任何更改。 因此,当业务策略更改(例如定价计算,资格确定或信贷批准)时,您花费更少的时间进行编码和测试。 该示例预订应用程序展示了将Business Rules服务与Cloud中的Node.js应用程序集成的可能性,同时还利用了IBM Cloud平台的易于部署和可扩展性。
翻译自: https://www.ibm.com/developerworks/cloud/library/cl-hotel-rules-app/index.html