API文档
JavaDoc文档:链接
一、公共API接口
1. 平台标准消息报文-BizMessage
Biz-SIP平台内部时采用标准的消息报文格式:
参数 | 类型 | 是否必填 | 描述 |
---|---|---|---|
code | int | Y | 返回码,0为成功,非0为失败 |
message | String | N | 返回消息 |
extMessage | String | N | 返回扩展消息 |
appServiceId | String | Y | 对应App服务ID |
traceId | char(32) | Y | 由Biz-SIP统一生成的唯一跟踪ID,每个聚合服务中traceId相同 |
parentTraceId | char(32) | N | 父交易服务的traceId,父交易服务一般调用延迟服务,会产生子交易服务 |
timestamp | long | Y | 由Biz-SIP统一生成的时间戳,为聚合服务的最初发起时间,为1970年1月1日零点整至发起时间的毫秒数 |
data | String(JSON格式) | N | 传送的数据,一般为JSON格式 |
2. 平台工具类-BizUtils
主要包括各种数据在日志输出格式的优化,包括:
- buildBizMessageLog():构建规范BizMessage对象日志文本
traceId: 839af23bc2bb4dc29b1f6eef278fa85c
appServiceId: /openapi/sample4
code: 0
message: success
{
"accountName": "王五",
"accountNo": "005"
}
- buildHexLog():构建规范的字节流日志文本
====+ 01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20 + ====== ASCII ====== +
0000: 7B 73 65 78 3A 22 E7 94 B7 22 2C 61 63 63 6F 75 6E 74 5F 6E | {sex:"男.",account_n |
0020: 6F 3A 22 30 30 35 22 2C 61 63 63 6F 75 6E 74 5F 6E 61 6D 65 | o:"005",account_name |
0040: 3A 22 E7 8E 8B E4 BA 94 22 7D | :"王.五."}.......... |
- buildJsonLog():构建规范的JSON对象日志文本
{
"sex": "0",
"mobile": "18601872345",
"accountNo": "62001818",
"email": "123232@163.com"
}
3. 异常处理-BizException
BizException是平台应用异常,在开发时抛出异常,都要封装成BizException异常来抛出。
BizException中的code、message是错误码和错误信息,具体是在BizResultEnum类中定义的,code为1-1000为系统内部错误码,应用开发时的code应从1001开始使用。
其中BizResultEnum.RETRY_DELAY_APP_SERVICE枚举的BizException是App服务重试异常,App服务在抛出这个异常后,会自动触发延迟App服务的重试。
二、各层服务封装和调用
1. Source层
2.1. 调用服务接口类-SourceClientFactory
SourceClientFactory主要是对App服务的调用接口封装:
@RestController
@RequestMapping("/personal")
public class XmlController {
// 定义一个接口为PersonalAppInterface的,app层服务名为/app/personal的服务调用句柄
private PersonalAppInterface personalAppInterface = SourceClientFactory
.getAppServiceClient(PersonalAppInterface.class,"/app/personal");
......
@PostMapping(value = "/getCustomerAndAccountList", consumes = "application/xml", produces = "application/xml")
public String getCustomerAndAccountList(@RequestBody String inMessage) throws BizException {
......
// 调用app层服务
CustomerAndAccountList customerAndAccountList = this.personalAppInterface.getCustomerAndAccountList(customerId);
......
}
2.2. Source服务接口类-SourceBeanInterface
在可复用的Source模块中,可以通过@Autowired进行注入引用,从而实现通用的Source通讯适配应用和个性化的Source服务代码分离的目标:
@RestController
public class RestSourceController {
@Autowired
private SourceBeanInterface restSourceService;
2. App层
2.1. 调用服务接口类-AppClientFactory
AppClientFactory类主要是针对Sink服务、App延迟服务的调用封装:
@Service
public class PersonalAppService implements PersonalAppInterface {
private AccountSinkInterface accountSinkInterface = AppClientFactory
.getSinkClient(AccountSinkInterface.class,"account-sink");
private CustomerSinkInterface customerSinkInterface = AppClientFactory
.getSinkClient(CustomerSinkInterface.class,"customer-sink");
private BizMessageInterface payment1SinkInterface = AppClientFactory
.getSinkClient(BizMessageInterface.class,"payment1-sink");
private BizMessageInterface payment2SinkInterface = AppClientFactory
.getSinkClient(BizMessageInterface.class,"payment2-sink");
private PersonalAppInterface personalAppDelayInterface = AppClientFactory
.getDelayAppServiceClient(PersonalAppInterface.class,"/app/personal",
0,1000,2000,4000,8000,16000,32000);
@Override
public CustomerAndAccountList getCustomerAndAccountList(String customerId) {
Customer customer = this.customerSinkInterface.getCustomer(customerId);
List<Account> accountList = this.accountSinkInterface.getAccountListByCustomerId(customerId);
CustomerAndAccountList customerAndAccountList = new CustomerAndAccountList();
customerAndAccountList.setCustomer(customer);
customerAndAccountList.setAccountList(accountList);
return customerAndAccountList;
}
2.2. App服务接口类-AppBeanInterface
app-bean-service是App层基于平台标准JSON消息报文调用的服务类型,绑定的服务类是继承AppBeanInterface接口:
@Service
public class SampleAppBeanService implements AppBeanInterface {
private HelloInterface helloInterface = AppClientFactory
.getSinkClient(HelloInterface.class,"sample-bean-sink");
@Override
public JSONObject process(JSONObject jsonObject) throws BizException {
String message = (String)jsonObject.get("message");
jsonObject.set("message","sample-app-bean-service: Hello,"+message+";"
+ this.helloInterface.hello(message));
return jsonObject;
}
}
3. Sink层
3.1. Sink服务接口类-SinkBeanInterface
sink-bean是Sink层基于平台标准JSON消息报文调用的Sink服务类型,绑定的服务类是继承SinkBeanInterface接口:
@Service
public class SampleSinkBeanService implements SinkBeanInterface {
@Override
public JSONObject process(JSONObject packMessage) throws BizException {
String message = (String)packMessage.get("message");
packMessage.set("message","sample-sink-bean-sink: Hello,"+message);
return packMessage;
}
}
3.2. Sink服务抽象类-AbstractSinkService
如果sink-bean和bean服务类是继承AbstractSinkService类,当前sink的connector和converter是会自动注入的:
@Service
public class Payment1SinkService extends AbstractSinkService implements SinkBeanInterface {
@Override
public JSONObject process(JSONObject jsonObject) throws BizException {
log.info("传入消息:\n{}", BizUtils.buildJsonLog(jsonObject));
byte[] inBytes = this.converter.pack(jsonObject);
log.info("打包后消息:\n{}", BizUtils.buildHexLog(inBytes));
JSONObject outJsonObject = this.converter.unpack(inBytes);
log.info("解包后消息:\n{}", BizUtils.buildJsonLog(outJsonObject));
return outJsonObject;
}
}
三、格式转换器和通讯适配器
1. 格式转换器-Converter
Converter可以在Source服务和Sink服务中进行引入和调用,其中在Sink服务中,如果sink-bean和bean服务类是继承AbstractSinkService类,当前sink的converter是会自动注入的。
开发者可以用Converter进行消息报文的解包和打包操作。
2. 通讯适配器-Connector
Connector只能在Sink服务中引入,如果sink-bean和bean服务类是继承AbstractSinkService类,当前sink的connector是会自动注入的。
调用connector类的process()方法,会自动根据配置的通讯适配参数,和对方进行通讯交互并返回。