Vantiq的Pronto是一个Dynamic Advanced Event Broker,为构建实时企业应用,提供一个动态的分布式的事件管理、监控、权限等功能。Pronto进行Event Catalog的权限管理,是通过namespace实现的。这篇文章我们就看看如何通过多个namespace来实现不同的服务访问Event时的权限控制。
该实例的场景描述如下:
在这个例子当中,有2个Event:
- 事件"
/domainAbc/eventAA
",它有一个发布者"/serviceA/domainAbc
",ServiceA
服务的一个方法,通过发送消息到这个发布队列,来发布事件。它有2个订阅者,"/service1/DomainFoo
"和"/service2/DomainBar
",分别由2个Service,通过这个订阅队列来消费事件。 - 事件"
/domainEFG/eventEE
",它有一个发布者"/serviceA/domainEFG
",和一个订阅者"/service2/DomainGo
",他们分别由ServiceA
发布和Service2
订阅。
同时,不同的Service只能访问自己的namespace里面的订阅者和发布者,我们可以通过这个来控制服务对事件权限。
在vantiq中,我们还可以通过用户组来控制一个namespace中的不同用户组,对不同的event事件的权限。但是在这个例子中,由于我们想通过不同的namespace隔离不同的服务能够访问的本地队列,所以,使用namespace进行权限隔离。
在下面的步骤当中,我们需要创建namespace,然后在pronto里面创建Event,定义订阅者、发布者,再进行授权。
在切换不同的namespace的时候,一般都会提示是否保存当前的project,在Vantiq中,project是一个逻辑概念,我们用project来组织各种resources。当保存一个project时,就是保存这个project包含的resources,以及它在网页IDE中显示的状态,下次再打开,还能打开之前打开的东西。在我们的实例中,namespace中创建的Event、队列等在操作相应按钮的时候就已经创建,就保存在该namespace的resources中了,所以不需要再保存在某个项目中。如果想下次打开namespace的时候,打开之前打开的组件,那就可以创建一个项目保存下来。
这个例子中,我们要使用4个namespace,分别叫"ms_catalog
","ms_serviceA
","ms_service1
"和"ms_service2
"。
先创建ms_catalog
,进入dev.vantiq.cn,打开"operations"进行namesp创建:
打开namespace管理界面以后,点击"create"创建:
然后依次再创建其他3个namespace。然后,切换到这个新建的 ms_catalog
namespace上:
创建好namespace以后,进入ms_catalog
这个namespace,我们将要在这个namespace里面创建Catalog。在Administer里面打开namespace列表,从里面打开ms_catalog
这个namespace:
注意,我们只需要在
ms_catalog
这个namespace上创建catalog,其他的几个都不需要。其他的namespace会通过access token的方式授权访问这个catalog namespace,并使用这个里面的事件定义。
下面就开始创建事件Event。我们在创建Event之前,需要先给这个事件定义个Type,来作为事件消息的schema。打开development的Tab,点击Add,添加一个Type:
然后点击新建以后,在Type创建/编辑页面,输入Type的名字,设置属性:
然后,再创建一个EventEE
,属性也是id, name。
现在就可以创建Event了,在Show下面找到Event Catalog并打开,点新建来创建:
输入相应的内容,保存的时候会弹出对话框设置关键字,这个关键字是用于查询过滤等。
创建完2个Type,2个Event以后,应该是这样的,我们可以在Event Catalog界面的输入框输入事件名、字段、关键字来进行事件的查询。这是为了方便之后打开这个namespace的时候能打开之前打开的东西,可以选择保存项目。
下面我们就需要让我们的发布者ServiceA
所在的namespace和2个订阅者Service的namespace能够访问Event Catalog的事件。确保还在"ms_catalog
"的namespace中,打开access tokens界面:
这里面列出的是先有所有的access token。access token的用处就是授权访问某一个namespace,所以我们要创建一个token给其他几个namespace,以让他们能访问这个namespace里面的Event Catalog。点击新建:
创建好以后,在列表中找到这个token并复制:
然后,我们进入ms_serviceA
这个namespace,我们要在这个namespace中连接到ms_catalog
中定义的Event Catalog。进入ms_serviceA
这个namespace后,打开namespace列表,点击自己的namespace,设置Event Catalog链接:
然后在弹出的对话框里复制刚才拷贝的token,然后点击"Add Catalog"来添加链接。添加成功后,会在下面显示链接到的namespace名字,确保
为Service1
和Service2
进行同样的操作,这样,我们的3个服务使用的namespace对Catalog所在的namespace的授权就进行完了。
完成了所有的service所在的命名空间对Catalog命名空间的授权以后,我们就来创建事件的发布者。在这个例子中,ServiceA
这个服务能够发布这两个事件,所以我们需要在'ms_serviceA
'这个命名空间中针对这两个事件创建发布者队列。这样ServiceA
这个服务就能够空间它的发布者队列,发送消息到事件上。
所以,进入'ms_serviceA
'命名空间,打开Event Catalog,点击一个事件,查看事件的发布者:
在弹出的对话框中,我们可以看到目前这个事件的所有发布者,目前是没有任何发布者的,它可能弹出一个窗口警告说没有找到发布者。我们可以通过一个Source来发布事件,也可以通过一个Topic队列来发布。我们选择Topic。数据我们的之前定义好的队列名'/serviceA/domainAbc
'。这个队列名的命名是说'serviceA'的'domainAbc
'领域对象发生变化,产生的事件。
我们输入队列名并创建以后,新建的队列就会显示到下面:
注意这里,'Local Event Path'意思就是在ms_serviceA这个namespace里面,发布事件使用的队列,这个队列的名字前面自动加上了'/topics'的前缀。
同样,我们也给'/domainEFG/eventEE
'这个事件加上发布者队列'/serviceA/domainEFG
'。
跟创建发布者队列类似,我们现在进入'ms_service1
'这个命名空间,由于'Service1
'只需要订阅事件'/domainAbc/eventAA
',所以只是在这个事件上创建一个订阅者。打开Event Catalog,点击这个事件,查看事件的订阅者:
在弹出的对话框中输入队列名'/service1/DomainFoo
'创建,可以看到下面的结果:
这里的'Local Event'就是针对'
ms_service1
'这个命名空间本地队列,创建完以后,它的名字前不会添加前缀。如果需要命名统一,可以自行添加。
同样,进入'ms_service2
'这个命名空间,Serice2
在两个事件上都需要订阅,所以要创建2个订阅者队列,也就是对事件'/domainAbc/eventAA
',订阅者是'/service2/DomainBar
',对事件'/domainEFG/eventEE
'订阅者是'/service2/DomainGo
'。
我们创建完了发布者、订阅者,下面就能在'ms_catalog
'命名空间中查看我们的事件,以及这些事件上的发布者、订阅者。如果有一些服务不应该对某些事件进行订阅,就可以在这里看到并删除。
这样,我们在企业范围内的所有事件都可以在一个地方统一的管理,并通过图形界面的方式查看、搜索,查看数据,查看发布者、订阅者等。
至此,就完成了事件在多个namespace之间的组织,Event的创建,发布者和订阅者的创建,接下来,就可以在Java客户端或其他客户端里,发布、订阅事件。具体的代码跟上一篇类似,就不再赘述了。