Appearance
ESB应用
使用说明
在ESB中注册了服务和事件,我们如何调用或发布呢?
ESB的服务调用和事件发布都依赖于APP,在APP中使用esb控件的服务即是对ESB中服务或事件的封装,只要对该APP服务进行调用即是对ESB服务调用或事件发布
如何以某个消费者的身份调用ESB服务或发布事件?
只要在该服务或事件的封装APP开启安全认证,并为APP服务开启该消费者的访问权限,在调用APP服务时附带该消费者的认证方式,即代表该消费者调用了ESB服务或发布事件。
使用示例
示例一:ESB服务
假设现有一个其它应用系统提供的http服务,实现对请求中的两个数字相加并返回结果。URL、请求体、响应体如下:
URL:http://127.0.0.1:8083/math/add
请求体:{"num1":"1","num2":"2"}
响应体:{ "result": "3" }
ESB服务配置
- 新增上游资源
在(主菜单)APP管理
-资源管理
页面中新增Upstream资源,用于配置服务的主机和端口。新增资源请参照资源管理。
资源名称:ESB_Service
;
新增节点:主机名为127.0.0.1
,端口号为8083

- 新增ESB服务
在(主菜单)APP管理
-服务注册
页面中注册服务。请参照服务注册。
服务编码:esbService_add
;
服务地址填写服务URL的路由信息,即为:math/add

- 配置消费者
在(主菜单)APP管理
-消费者管理
页面中新增并配置消费者。配置消费者请参照消费者管理。
消费者名称:esbConsumer
;
点击生成按钮自动生成访问令牌,用于调用ESB服务时的安全认证

- 授权消费者
在(主菜单)APP管理
-服务注册
页面中为已注册的服务授权消费者。授权消费者请参照服务注册。
为服务上游ESB_Service
的下属服务esbService_add
授权消费者esbConsumer

ESB应用生成
注册于ESB模块中的服务不可直接被调用,只有通过orapis-design的控件callService 才可调用 。在orapis-design中通过新增一个使用此控件的服务作为ESB服务的代理,该服务只负责调用ESB服务并返回响应体,服务生成如下:
- 新增项目
在orapis-design新增项目demo_esb
,新增项目请参照项目管理。

- 新增服务
为项目新增http服务esbService
,新增服务请参照服务管理。

- 服务设计
orapis-design端中工具箱中存在上游分类的控件,即代表已经开启ESB功能。

增加CallService控件(用于调用ESB服务,并返回调用结果):
service为orapis-engine中注册ESB服务的编码:esbService_add
;
requestBody为调用注册服务的请求体:#{body}
;

直接将调用注册的ESB服务返回值使用return控件返回
data:#{callService}

- 项目打包
在orapis-design中,将项目打包。请参照design发布管理。

- 项目发布
在orapis-engine的(主菜单)APP管理
-APP发布
页面中,将打包的zip包发布。APP发布请参照APP管理。

ESB应用配置
- 插件配置
对已经发布到orapis-engine中的应用demo_esb
添加安全认证插件key_auth
。添加插件请参照APP管理。
key_auth插件配置:
设置从header中获取参数token
作为key_auth插件的认证参数

- APP授权
在(主菜单)APP管理
-APP授权
页面中为消费者esbConsumer
授予服务esbService
的访问权限。APP授权请参照APP管理。

ESB应用的调用
通过调用ESB应用中的esbService
服务,即可调用注册于ESB中的服务esbService_add
。
esbService
服务的调用方式为http请求:
URL:http://localhost:6636/demo_esb/esbService
请求体body:{"num1":"1","num2":"2"}
请求头headers:Content-Type: application/json
、token: eZxIwbfAm1Sp31OTLG
其中请求头中的token参数值为消费者esbConsumer
的访问令牌属性。
使用curl请求接口:
$ curl -X POST "http://localhost:6636/demo_esb/esbService" -H "Content-Type: application/json" -H "token: eZxIwbfAm1Sp31OTLG" -d "{\"num1\":\"1\",\"num2\":\"2\"}"
$ curl -X POST "http://localhost:6636/demo_esb/esbService" -H "Content-Type: application/json" -H "token: eZxIwbfAm1Sp31OTLG" -d "{\"num1\":\"1\",\"num2\":\"2\"}"
接口返回:
json
{
"result": "{\r\n \"result\": \"3\"\r\n}"
}
{
"result": "{\r\n \"result\": \"3\"\r\n}"
}
其中返回数据中result节点内容即为调用ESB服务的响应体。
示例二:ESB事件
假设现有两个其它应用系统提供的用于事件回调的http服务,功能为接收发布事件的学生信息。请求体和响应体格式都为:
请求体:{"name":"李莉莉","sex":"女","age":"15"}
响应体:{"result":true}
两个http服务的访问URL分别为:
服务1:http://127.0.0.1:8084/api/push
服务2:http://127.0.0.1:8085/api/PushStudentInfo
ESB事件配置
事件的添加中需要先配置发布者和订阅者两种消费者
- 配置消费者(发布者与消费者)
在(主菜单)APP管理
-消费者管理
页面中新增并配置消费者。配置消费者请参照消费者管理。
发布者:
消费者(发布者)名称:esbPublishConsumer
;
点击生成按钮自动生成访问令牌,用于发布事件时的安全认证

订阅者1:
消费者(发布者)名称:esbSubscribeConsumer1
;
订阅事件的消费者(订阅者)需要配置回调地址,用于发布者触发事件后ESB调用订阅者的服务。
订阅事件地址即服务1的访问地址:http://127.0.0.1:8084/api/push

订阅者2:
消费者(发布者)名称:esbSubscribeConsumer2
;
订阅事件地址即服务2的访问地址:http://127.0.0.1:8085/api/PushStudentInfo

- 新增ESB事件
在(主菜单)APP管理
-服务注册
页面中新增事件。新增事件请参照事件配置。
事件编码:esbEvent_pushStudentInfo
;

- ESB事件的发布者与订阅者配置
在(主菜单)APP管理
-服务注册
页面中为新增的事件配置发布者与订阅者。请参照服务注册。
发布者:
为事件esbEvent_pushStudentInfo
配置发布者(消费者)esbPublishConsumer

订阅者:
为事件esbEvent_pushStudentInfo
配置订阅者1(消费者)esbSubscribeConsumer1
和订阅者2(消费者)esbSubscribeConsumer2

ESB应用生成
注册于ESB模块中的事件不可直接被调用发布,只有通过orapis-design的控件RaiseEvent 才可发布事件 。在orapis-design中通过新增一个使用此控件的服务作为ESB发布事件的代理,该服务只负责发布事件并返回发布结果,服务生成如下:
- 新增发布事件服务
在示例一添加的项目中新增一个用于发布事件的http服务esbEvent
,新增服务请参照服务管理。

- 发布事件服务的设计
orapis-design端中工具箱中存在上游分类的控件,即代表已经开启ESB功能。

增加RaiseEvent控件(用于发布事件到RocketMQ消息队列中):
由于需要方便事件的管理,事件发布的方式为推送到RocketMQ队列中,消息队列服务需要自行部署。
假设我们现有一个RocketMQ资源(新增资源请参照资源管理)名称为esb_mq
,生产者可发送的消息队列topic为esb_event
;
event为orapis-engine中添加的事件编码:esbEvent_pushStudentInfo
;
requestBody为调用注册服务的请求体:#{body}
;

- 新增订阅事件的监听队列的消费者服务
由于发布事件是推送到RocketMQ消息队列中,所以我们需要新建一个消息队列监听服务。用于监听发布者发布到消息队列中的消息并使用consumeMessage控件推送给事件订阅者。
注意:对于发布者发布到特定RocketMQ中topic的事件,我们只需要建立一个用于监听并推送给事件订阅者的队列消费者服务即可
在项目中新增一个用于监听队列消息并推送给订阅者的队列消费者服务monitorPush
,新增服务请参照服务管理。

- 队列消费者服务的设计
添加Queue流程,RocketMQ资源为esb_mq
、consumerGroup为esb
、topic为esb_event
;并增加consumeMessage控件(用于将监听的消息分发给订阅者):

- 项目打包
在orapis-design中,将项目打包。请参照design发布管理。

- 项目发布
在orapis-engine的(主菜单)APP管理
-APP发布
页面中,将打包的zip包发布。APP发布请参照APP管理。

ESB应用配置
- 插件配置
对已经发布到orapis-engine中的应用demo_esb
添加安全认证插件key_auth
。添加插件请参照APP管理。
key_auth插件配置:
设置从header中获取参数token
作为key_auth插件的认证参数

- APP授权
在(主菜单)APP管理
-APP授权
页面中为消费者(事件发布者)esbPublishConsumer
授予服务esbEvent
的访问权限。APP授权请参照APP管理。
由于esbEvent服务作为事件发布的代理服务,所以需要授权访问权限给发布者,发布者通过访问该服务发布事件

ESB应用的调用
通过调用ESB应用中的esbEvent
服务,对已创建的事件esbEvent_pushStudentInfo
进行一次发布。
esbEvent
服务的调用方式为http请求:
URL:http://localhost:6636/demo_esb/esbEvent
请求体body:{"name":"李莉莉","sex":"女","age":"15"}
请求头headers:Content-Type: application/json
、token: c09g9uLJ6m1uqZiVUM
其中请求头中的token参数值为消费者esbPublishConsumer
的访问令牌属性。
使用curl请求接口:
$ curl -X POST "http://localhost:6636/demo_esb/esbEvent" -H "Content-Type: application/json" -H "token: c09g9uLJ6m1uqZiVUM" -d "{\"name\":\"李莉莉\",\"sex\":\"女\",\"age\":\"15\"}"
$ curl -X POST "http://localhost:6636/demo_esb/esbEvent" -H "Content-Type: application/json" -H "token: c09g9uLJ6m1uqZiVUM" -d "{\"name\":\"李莉莉\",\"sex\":\"女\",\"age\":\"15\"}"
由于该服务在设计时没有设置返回值,所以该访问没有响应体。
我们可以通过查看esb日志(需要为APP开启elastic_logger插件),找到事件的流转记录:

点击详细
按钮后,可查看事件的流转明细:

可以通过事件的流转明细发现,在我们以发布者的身份调用用于发布事件的代理APP服务时,事件消息成功发送到ESB模块。ESB模块根据事件的订阅配置,以对应的回调方式成功分发给两个事件订阅者。