Drools 5.1.1_DOC (60)
这部分介绍BRMS。了解安装、用法和管理等其他的相关部分。

图1.1 BRMS主屏幕
BRMS代表业务规则管理系统(Business Rules Management System)。
一个BRMS允许用户在一个多用户环境管理规则,对于你的业务规则,它是一个单真相点(
a single point of truth
),具有友好的用户界面,允许以可控的方式改变。
Guvnor是利用Drools管理规则的网页和网络相关组件的名称。 其结合了核心Drools引擎和其他工具,构成了“一个BRMS”。
如果后面的任何情况适合于你,你应该考虑Guvnor:你需要管理规则的版本/部署, 你需要不同技能水平的多用户访问和编辑规则,你没有任何现有的基础设施管理规则,你有大量的业务规则(作为一个应用程序的一部分,而不是技术规则)。
可以使用
Guvnor自身,或者利用IDE工具 (通常两者一起)。
Guvnor可能被“打上印记(branded)“,成为你的应用程序的一部分,或者它可能是一个中央规则仓库。
在某些情况下,应用程序可能存在有规则在数据库中(例如,作为一个现在应用程序的一部分),并且没有新的应用程序需要管理规则。
在这种情况下,drools-template库是值得一看—— 你可以为从任何表格式数据源产生的规则定义模板。
另外,也许一个现有规则管理系统和用户界面已经存在(就你的环境特制的)——在这种情况下, 没有必要移值到Guvnor。
如果你正使用规则解决复杂算法问题,而规则本质上是该应用程序的组成部分(不需要单独管理代码)。
使用一个BRMS的主要角色人员有:业务分析员,开发人员,管理人员(规则管理员,等等)。
Guvnor以这样一种方式被设计,可以容纳那些不同的角色,它能够以一种安装的方式控制暴露多少东西给不同的用户。
- 
多种规则编辑器类型(GUI,文本))
 - 
版本控制(历史资产)
 - 
分类
 - 
构建和部署
 - 
用一个包存储多个规则“资产”在一起。
 
本章涵盖BRMS的安装和管理问题。
BRMS是一个网页应用程序,能够运行在多环境,并被配置以适应大部分情形。 也有一些数据的初始设置,和涉及到的导入/导出功能。
对大多数人而言安装是非常简单的。Guvnor 应用程序作为一个.war文件被部署,如果你喜欢默认,可以用很少或不用配置把它部署到应用程序服务器或servlet容器。
当 你下载了Guvnor 分发版(http://www.jboss.org/drools下载),你需要重新命名drools-5.1.0-guvnor.war为 drools-guvnor.war。 复制该WAR文件到你的应用程序服务器的部署目录,然后启动应用程序服务器。如果你需要自定义某些设置,你可能先要"爆炸"(解压)该war文件,改变一 些配置设置,然后再压缩它,或者部署它"爆炸了(exploded)"。(在JBoss应用程序服务器中,你将需要确保爆炸了(exploded)的文件 夹的名字以".war"作为结束)。
一旦drools-guvnor.war已经被放置到部署目录中,并且该应用程序服务启动了,你应该导航到http://localhost/drools-guvnor,查看Guvnor的出现。(很明显地替代URL为你的应用程序服务器配置的)。
一旦显示出来,你是部署好了,准备出发吧!
Guvnor能够运行在任何支持Java SE5(不要求是JEE 5)应用程序服务器中——这包括servlet容器,如tomcat。
它在JBoss应用程序服务器平台上被积极测试和开发,如果你能够使用它们,或者没有任何基础,建议使用它们。然而,在一些低配置优化选项的情况下,任何容器/应用程序服务器都可以使用(特殊技巧,请查阅wik—— 在社区中的许多技巧已经让它能够运行在各种平台上)。
当然,你可以从www.jboss.com下载这些用于各种操作系统的应用程序服务器。
部署到JBoss平台:如果你安装了一个新的JBoss平台,可以复制WAR到[应用程序服务器目录]/server/default/deploy。然后你通过运行[应用程序服务器目录/bin]目录中的run.sh或run.bat,启动该服务器。
Guvnor 使用JCR(Java Content Repository)标准存储资产(如,规则)。默认实现是Apache Jackrabbit (http://jackrabbit.apache.org/)。 它包括一个开箱即用的存储引擎/数据库,你可以直接使用它,或者如果需要,你可以配置使用一个现有的RDBMS。
在你第一次运行Guvnor(启动该应用程序服务器),它会在 [应用程序服务器目录]/bin/ 目录中创建一个数据库(假设在JBoss平台上你使用)。 有一个repository.xml文件,和一个被自动创建的repository目录。
数据存储的位置应该是一个安全的被备份的位置。默认位置可能并不适合这,所以,最容易的方法是设置一个更合适的位置。如果你想改变它,请确保你停止工作了Guvnor (即停止了应用程序服务器或取消了该应用程序的部署)。
要改变位置,解压WAR文件,发现在WEB-INF目录中的components.xml文件。这是一个JBoss Seam配置文件(Seam是使用的框架),它允许定制系统的各个部分。当你已经发现了components.xml文件时,你应该看见如下的东西:
<component name="repositoryConfiguration">
<!--
*** This is for configuring the "home" directory for the repository storage. the directory must exist. ***
<property name="homeDirectory">/home/michael/RulesRepository_001</property>
-->
...
</component>
找到名字为"repositoryConfiguration" 的组件和名字为"homeDirectory"属性。
如 果你没有注解它(如上所示,它在注解的外面),你可以设置任何你需要的路径,用于数据存储的仓库。你还可以使用它移动仓库。在这种情况下,当你在 components.xml设置了该位置时,你可以简单地移动repository.xml和repository目录到你在 components.xml中设置的新位置。
如果在指定的位置没有仓库(或者在默认位置中),那么Guvnor会创建一个新的空仓库。
有许多选项可用于repository.xml的配置,但是大多数情况,不推荐改变默认设置。
在 某些情况下,你可能需要使用一个外部RDBMS,如Oracle、MySQL或 Microsoft SQL服务器 Server 作为数据存储——这是允许的。在这最情况下, 最容易做的事是利用默认启动Guvnor(如上面指定的一样,利用一个适当的主目录),让它产生默认repository.xml构架。
找 到产生的repository.xml 文件,并打开它—— 它会被描述许多不同选项的注解注释。从这里开始,你需要了解一点Jackrabbit持久化管理器:http://wiki.apache.org /jackrabbit/PersistenceManagerFAQ
有许多持久化管理器,一些是数据库特有的(例如,Oracle)。有一个能与支持JDBC的任何数据库一起工作的SimpleDBPersistenceManager——你还可以指定数据库类型,以便于它使用特殊的DDL创建表结构(所有主流数据库都支持)。
如果Guvnor针对一个新兴(空)的RDBMS运行,它第一次启动时会创建表—— 重点要注意,证书支持的用户才有权限创建表(至少初始化,在第一次运行时,在那之后,他们能够被锁定)。
Jackrabbit 有一个用于版本存储的单独存储区(因为随着时间的推移,旧版本号会增加,但它不应该降低主数据存储的性能)。版本存储也有它自己的持久化配置文件 repository.xml,但是对于大多数用途,你可以使用相同的数据库作为主存储(只是用了一个不同的架构对象前缀( schema object prefix)——即,在你的数据库中,所有版本数据会被加上"version_" 前缀,但是在相同的表空间中)。该详情请看 repository.xml 。
Lucene被用来提供跨半结构化数据和跨版本索引。 这种索引通常被最佳存储在一个文件系统上,本地化Guvnor(根据在 repository.xml中的默认)——在多数情况下,默认是很好的。
请 注意,让某人访问Guvnor是表明一定程度的信任。能够编辑和构建规则给一个用户提供了很大的权力。因此, 你不应该对你的整个组织开放Guvnor—— 而相反是选择几个。尽可能使用https (http利用TLS/SSL) (甚至在一个公司内部,这是一个好主意)。明智地使用这种权力—— 它不是一个提供对一个数据库读/写访问的“平凡”的应用程序,而是有太多的权力。设想一下,你是蜘蛛侠——能力越大,责任越大(当然,对超人更是如此)。
通过使用在war文件中的components.xml文件配置安全。要自定义它,你将需要解压war文件, 在WEB-INF目录中找到components.xml 文件。
JAAS标准被用来作为底层的认证和授权机制, 其结果意味着它是非常灵活的,并且能够集成到大多数现有的环境中。
开箱即用,Guvnor显示了一个注册屏幕,但是没有强制使用安全证书——使用用户名,但不执行密码检查。要强制认证,你需要配置它使用一个适当的用户目录(你可能已经有活动目录AD或相似的)。
在components.xml文件中,你应该能找到安全配置部分,如下所示:
<!-- SECURITY CONFIGURATION -->
<!-- default (will take any username, useful if you want to keep track of users but not authenticate -->
<security:identity authenticate-method="#{defaultAuthenticator.authenticate}"/>
<!-- NO authentication. This will bypass the login screen when you hit the app. Everyone is "guest" -->
<!-- <security:identity authenticate-method="#{nilAuthenticator.authenticate}"/> -->
如上所见,通过2个“开箱即用”的选项——其意味着允许任何用户进入,或者绕过,在这种情况下,不会有注册屏幕(例如,至少你可以安全地通过一个网页服务器访问该应用程序)。
每个应用程序服务器都支持高级配置,它能够操作你的现有的安全基础设施。JBoss AS的情况作为一个例子显示如下。
<security:identity authenticate-method="#{authenticator.authenticate}"
jaas-config-name="other"/>
这 会使用在JBoss AS中的"其他" jaas配置。 如果你查看[jboss安装目录]/server/default/conf,你会看见一个login-config.xml文件。 这个文件包含各种配置。如果你使用了如上面这样一个"other" ,那么它会为了用户名和密码查找在conf目录中的users.properties 和roles.properties,再进行认证(对于少数固定用户来说是很好的)。
对于更大的企业来 说,LDAP也许是最流行的选择,所以下面是一个操作活动目录(AD)的例子。 从http://wiki.jboss.org/wiki/Wiki.jsp?page=LdapLoginModule 和http://wiki.jboss.org/wiki/Wiki.jsp?page=LdapExtLoginModule,你可以获得有关如何配置 JBoss AS 使用LDAP所有方案的详情。
<application-policy name="brms">
<authentication>
<login-module code="org.jboss.security.auth.spi.LdapExtLoginModule" flag="required" >
<!--
Some AD configurations may require searching against
the Global Catalog on port 3268 instead of the usual
port 389. This is most likely when the AD forest
includes multiple domains.
-->
<module-option name="java.naming.provider.url">ldap://ldap.jboss.org:389</module-option>
<module-option name="bindDN">JBOSS\someadmin</module-option>
<module-option name="bindCredential">password</module-option>
<module-option name="baseCtxDN">cn=Users,dc=jboss,dc=org</module-option>
<module-option name="baseFilter">(sAMAccountName={0})</module-option>
<module-option name="rolesCtxDN">cn=Users,dc=jboss,dc=org</module-option>
<module-option name="roleFilter">(sAMAccountName={0})</module-option>
<module-option name="roleAttributeID">memberOf</module-option>
<module-option name="roleAttributeIsDN">true</module-option>
<module-option name="roleNameAttributeID">cn</module-option>
<module-option name="roleRecursion">-1</module-option>
<module-option name="searchScope">ONELEVEL_SCOPE</module-option>
</login-module>
</authentication>
</application-policy>
要使用上面的,你应该放置jaas-config-name="brms"在Guvnor的components.xml 的 security:identity标签中。
对于其他的目录服务,类似的配置例子也可以被找到。
LDAP 并非一锤定音,你也可以针对用户名字的数据库使用JDBC,或者你也可以编写自己的逻辑模块,使用任何一种神奇的你可能要处理的认证和授权系统 (这是一种极端情况,但也可能)。请参考JBoss AS文档(或者你的现有应用服务器的文档)。
上面部分谈及建立身份和用户的访问。这部分谈论授权特殊权限给这些用户(控制数据可见度和访问)。它可用于划分数据,或者控制“非权限用户”的访问,可以限制他们所做的破坏。

图 1.2 管理员用户的权限
Guvnor网页界面的一个共同需要和愿望是能够让不同技术能力的用户与之交互。另外一个需要是能够分配人们不同的数据集给“自己”。
普 通用户的身份管理是在一个集中的目录——应用程序服务能够与这些目录集成 (如,活动目录,LDAP),所以guvnor 用户不必创建另外的重复身份就可以被认证)。 也能够(感谢JAAS)定义那个用户具有Guvnor的"管理员"角色(注意,一个Guvnor管理员用户不必真是一个系统管理员)。更重要的 是,Guvnor利用特殊权限增强了这个身份, 由Guvnor本身管理该身份。

图1.3 用户列表 User listing
注意,上面的用户身份并没有存储在Guvnor中,仅是他们的权限映射被具体化到Guvnor。
确 实有2个系统一般角色:用户是或不是管理员。容易吧!管理员能了解和做任何事。开箱即用时,权限系统被关闭的,每个用户都管理员(这可以操作相当多的 事)。 在components.xml中还有一个系统设置,它可以打开和关闭权限系统(所以,如果需要,人们能够手动否决)。一个管理员还能够赋予其他用户的管 理员权力,无论他们在外部目录服务中的角色。

图 1.4 编辑
有 几种权限类型:每包:包管理员(“拥有”一个包——能够部署等等,但是没有系统的管理权力)。包开发员——这个权限允许用户创建新条目,编辑等等——但是 仅在包层次(不能部署)。他们还能运行和创建测试。只读包——这一个是相当明显。每类别:这是“有趣”的一个——因为资产(规则)可以被多个类别标记,你 可以使用这些来分配权限给一个“分析”类型的用户。一个用户可以分配多个类别。然后,一个用户能够编辑和浏览任何在那个类别中被标记的资产(不考虑包)。 只有类别权限的用户不会显示任何包视图和细节,而仅会看见简单的类别视图。这允许管理员和经理精确控制这些用户可以看见的和不能看见的。注意,每类别权限 还能够设置为“只读”,所以用户可以浏览在一个类别中的所有资产,但是不能改变它们。

图 1.5 分析员视图
每类别“分析员”权限是相当有用的——你也可以用一个特定包增强他们的权限(所以,在他们的类别权力之上,他们能够看见和操作一个特殊包——它可以被用来作为一个“实践”区,或者实验测试区)。这提供了一些方法,以粗或细粒度方式管理权限,以适应不同类型的用户。
在默认时,授权没有有启用。要启用它,编辑在WEB-INF目录中的components.xml文件:
<security:role-based-permission-resolver enable-role-based-authorization="true"/>
备份如何执行取决于你使用的持久化管理器的计划。使用默认的计划——那么它是一个备份repository 目录的问题(只要你配置了它)。恢复只是一个复制整个repository目录的问题。
在做文件备份时,最理想的情况是你停止Guvnor应用程序,或确信没有谁使用它 。
在使用外部数据库(例如,Oracle, MySQL)的情况下), 可以使用你用于备份那些数据库的常规计划(你做它们的备份,对吧?)。在这种情况下,在恢复时,清除索引(删除索引所在的目录)也是一个好主意,这样它们根据数据被新创建(因此保证是同步的)。
在 Guvnor中的许多地方有一个资产列表: 通过查看AssetListTable.properties属性文件,可以自定义这个列表。然后你可以设置标题名字和用于填充列的"getter"方 法。例如,你能够添加getCreator,或getExternalSource作为附加字段,如果你使用了它们。
在构建包时(从 "Packages"功能),你有使用一个"选择器"的选项。这个选择器会过滤被构建到包中的规则的列表。
Guvnor提供了几个内部构建选择器,允许你选取构成一个包部分的资产,并根据资产的状态和类别进行构建。
如 果内置选择器不能满足你的需求,你可以使用定制选择器。要配置一个定制选择器,你需要“爆炸(explode)"Guvnor的war文件,找到 selectors.properties文件(注意,如果你喜欢,你也可以放置你自己的selectors.properties文件在系统的类路 径)。在这个文件中,你会发现有关如何配置一个定制选择器的细节。 选项是使用了一个drl文件,或者你编写的一个类的名字(并且在该类路径上是能用的)。类必须实现AssetSelector接口。也可以使用DRL文件 (在selectors.properties文件中有一个例子)。每个你配置的选择器在这个属性文件中有一个唯一的名字——并且这个名字,在构建包时, 你可以使用它。
要做到这,你可以“爆炸”部署的war文件,找到Guvnor.html文件,它看起有以下这样的东西:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<!-- Note you can append #asset=UUID to the end of the URL to preload a given asset.
Also, if you appent #asset=UUID&nochrome it will only show the asset without all the GUI "chrome"
To select a locale, specify &locale=en_US at the end of the URL to pick the appropriate bundle.
-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>JBoss Guvnor</title>
..........
</body>
</html>
注 意,上面的Guvnor.html文件是相当小(因为大部分工作被GWT做了——GUI在浏览器中被动态地被构建)。你可以自定义的部分是样式表——你能 够编辑 Guvnor.css(或者更好,做一个拷贝,改变你需要的样式),"shortcut icon(快捷图标)"(它被显示浏览器的地址栏——也改变该"图标"的链接,与在IE中的工作是相同的),以及标题徽标。 其余保持原样,允许GWT components被加载,并连接到页面。当用户访问Guvnor web GUI时,这个html页面只被浏览器加载一次 。
自定义最好的办法是做一个 Guvnor.html的拷贝——然后编辑。你也能够通过正常的手段编辑web.xml改变URL 。
JCR标准的导入/导出功由网页界面的管理部分提供。
它会导出整个仓库到一个由JCR标准定义的 XML格式。
而导入,则会清除在该数据库的任何存在的内容。
这不是一个备份的替代,但是在迁移时可能是非常有用的。重点要注意,这种方式并不会导出版本历史,只是当前的状态。因此,仍然建议,在仓库数据库本身上,在任何时候,都使用一个正式的备份制度。
注意,在导入具有成千上成条的仓库时,可能会需要附加内存(只是为了导入)。

                
            
        
浙公网安备 33010602011771号