Skip to content

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

esbUse_img_1.png
  • 新增ESB服务

(主菜单)APP管理-服务注册页面中注册服务。请参照服务注册

服务编码:esbService_add

服务地址填写服务URL的路由信息,即为:math/add

esbUse_img_2.png
  • 配置消费者

(主菜单)APP管理-消费者管理页面中新增并配置消费者。配置消费者请参照消费者管理

消费者名称:esbConsumer

点击生成按钮自动生成访问令牌,用于调用ESB服务时的安全认证

esbUse_img_3.png
  • 授权消费者

(主菜单)APP管理-服务注册页面中为已注册的服务授权消费者。授权消费者请参照服务注册

为服务上游ESB_Service的下属服务esbService_add授权消费者esbConsumer

esbUse_img_4.png

ESB应用生成

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

  • 新增项目

orapis-design新增项目demo_esb,新增项目请参照项目管理

esbUse_img_5.png
  • 新增服务

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

esbUse_img_6.png
  • 服务设计

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

esbUse_img_7.png

增加CallService控件(用于调用ESB服务,并返回调用结果):

serviceorapis-engine中注册ESB服务的编码:esbService_add

requestBody为调用注册服务的请求体:#{body}

esbUse_img_8.png

直接将调用注册的ESB服务返回值使用return控件返回

data:#{callService}

esbUse_img_9.png
  • 项目打包

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

esbUse_img_10.png
  • 项目发布

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

esbUse_img_11.png

ESB应用配置

  • 插件配置

对已经发布到orapis-engine中的应用demo_esb添加安全认证插件key_auth。添加插件请参照APP管理

key_auth插件配置:

设置从header中获取参数token作为key_auth插件的认证参数

esbUse_img_12.png
  • APP授权

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

esbUse_img_13.png

ESB应用的调用

通过调用ESB应用中的esbService服务,即可调用注册于ESB中的服务esbService_add

esbService服务的调用方式为http请求:

URLhttp://localhost:6636/demo_esb/esbService

请求体body{"num1":"1","num2":"2"}

请求头headersContent-Type: application/jsontoken: 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

点击生成按钮自动生成访问令牌,用于发布事件时的安全认证

esbUse_img_14.png

订阅者1

消费者(发布者)名称:esbSubscribeConsumer1

订阅事件的消费者(订阅者)需要配置回调地址,用于发布者触发事件后ESB调用订阅者的服务。

订阅事件地址即服务1的访问地址:http://127.0.0.1:8084/api/push

esbUse_img_15.png

订阅者2

消费者(发布者)名称:esbSubscribeConsumer2

订阅事件地址即服务2的访问地址:http://127.0.0.1:8085/api/PushStudentInfo

esbUse_img_16.png
  • 新增ESB事件

(主菜单)APP管理-服务注册页面中新增事件。新增事件请参照事件配置

事件编码:esbEvent_pushStudentInfo

esbUse_img_17.png
  • ESB事件的发布者与订阅者配置

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

发布者

为事件esbEvent_pushStudentInfo配置发布者(消费者)esbPublishConsumer

esbUse_img_18.png

订阅者

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

esbUse_img_19.png

ESB应用生成

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

  • 新增发布事件服务

示例一添加的项目中新增一个用于发布事件的http服务esbEvent,新增服务请参照服务管理

esbUse_img_20.png
  • 发布事件服务的设计

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

esbUse_img_7.png

增加RaiseEvent控件(用于发布事件到RocketMQ消息队列中):

由于需要方便事件的管理,事件发布的方式为推送到RocketMQ队列中,消息队列服务需要自行部署。

假设我们现有一个RocketMQ资源(新增资源请参照资源管理)名称为esb_mq,生产者可发送的消息队列topicesb_event

eventorapis-engine中添加的事件编码:esbEvent_pushStudentInfo

requestBody为调用注册服务的请求体:#{body}

esbUse_img_21.png
  • 新增订阅事件的监听队列的消费者服务

由于发布事件是推送到RocketMQ消息队列中,所以我们需要新建一个消息队列监听服务。用于监听发布者发布到消息队列中的消息并使用consumeMessage控件推送给事件订阅者。

注意:对于发布者发布到特定RocketMQ中topic的事件,我们只需要建立一个用于监听并推送给事件订阅者的队列消费者服务即可

在项目中新增一个用于监听队列消息并推送给订阅者的队列消费者服务monitorPush,新增服务请参照服务管理

esbUse_img_22.png
  • 队列消费者服务的设计

添加Queue流程RocketMQ资源esb_mqconsumerGroupesbtopicesb_event;并增加consumeMessage控件(用于将监听的消息分发给订阅者):

esbUse_img_23.png
  • 项目打包

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

esbUse_img_10.png
  • 项目发布

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

esbUse_img_11.png

ESB应用配置

  • 插件配置

对已经发布到orapis-engine中的应用demo_esb添加安全认证插件key_auth。添加插件请参照APP管理

key_auth插件配置:

设置从header中获取参数token作为key_auth插件的认证参数

esbUse_img_12.png
  • APP授权

(主菜单)APP管理-APP授权页面中为消费者(事件发布者)esbPublishConsumer授予服务esbEvent的访问权限。APP授权请参照APP管理

由于esbEvent服务作为事件发布的代理服务,所以需要授权访问权限给发布者,发布者通过访问该服务发布事件

esbUse_img_24.png

ESB应用的调用

通过调用ESB应用中的esbEvent服务,对已创建的事件esbEvent_pushStudentInfo进行一次发布。

esbEvent服务的调用方式为http请求:

URLhttp://localhost:6636/demo_esb/esbEvent

请求体body{"name":"李莉莉","sex":"女","age":"15"}

请求头headersContent-Type: application/jsontoken: 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插件),找到事件的流转记录:

esbUse_img_25.png

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

esbUse_img_26.png

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