|
* x7 O" ^" `/ `$ b: w" F Biz-SIP金融级业务中台(http://bizsip.bizmda.com)是一套基于领域驱动设计(DDD)架构,能快速构建金融级云原生架构的服务整合中间件,整合了在金融场景里锤炼出来的最佳实践Biz-SIP业务中台支持多种报文类型的格式转换器(Converter),包括XML、JSON、定长、有分隔符、ISO-8583等报文类型的解包和打包。 ) T0 l& c$ _! e% h9 I# s9 w p
在Source模块中,可以通过Java API接口调用Converter,在Source模块代码中实现报文解包和打包本节案例中是在通过RestController接入的Source模块代码中,通过Java API调用模板XML格式转换器(simple-xml),实现XML报文的打包和解包:。
6 R7 C' w9 L4 c3 ?) ^ SampleSource4Controller是一个RestController,通过RESTful接受XML报文请求后,通过调用格式转换器Converter进行报文解包成平台标准JSON报文,然后调用App服务。
" W2 \' I0 A, J; X App服务(/bean/sample1)对输入报文没有做任何修改,是直接把原报文返回的SampleSource4Controller在收到App服务返回报文后,会再调用格式转换器进行报文打包成XML报文,作为RESTful请求的响应返回。 5 L! J a0 i D# F' C2 ]
具体代码和配置可以查看Biz-SIP源代码中的Sample相关测试案例(https://gitee.com/szhengye/biz-sip)一、Source层Source服务的开发和配置首先,在Biz-SIP配置目录的source.yml中,配置对应的Source: # W0 ~/ k/ |, D( p4 y5 e% Z
-id:source4converter:type:simple-xml可以看到source4这个Source,格式转换器converter,设置为“type: simple-xml”,表示是采用基于简单XML格式转换器。 * V& Z* `: p3 `0 O
SampleSource4Controller是一个RestController,负责外部调用的接入,相关代码如下:@Slf4j@RestControllerpublicclassSampleSource4Controller ; f, C2 I: f; S! v' e) o! q
{
: `) [; R7 Y, O# H4 ]. P) s7 s private Converter converter = Converter.getSourceConverter("source4");. h1 b/ Z) Z0 I- {- D5 e6 W# k/ w
private BizMessageInterface appInterface = SourceClientFactory, M0 C0 V8 b1 g9 C2 Q3 C
.getAppServiceClient(BizMessageInterface
! x& } e# q J+ z* k* D; O .class,"/bean/sample1");@PostMapping(value = "/source4", consumes = "application/xml", produces = "application/xml" ; e( K! B, U( t, q+ V
)public Object doService(@RequestBody String inMessage, HttpServletResponse response) {
" u6 E( R9 E+ W8 T0 ]5 X4 U7 I- U BizMessage outMessage = : G( W4 l- H ]
null;
2 ^% K% g3 A2 q0 z# ^ E: ^ try {
: z) ]* D* C9 g4 X3 F" ?- v JSONObject jsonObject = this.converter.unpack(inMessage.getBytes());
2 o* p+ {/ y* n/ G log.debug( 8 B2 [% ~# B8 O3 a4 b
"解包后消息:\n{}", BizUtils.buildJsonLog(jsonObject));& F+ d4 W" K3 g9 H" W# [
BizMessage bizMessage = this
% i$ [; f+ ~% H6 e5 o. x$ I .appInterface.call(jsonObject);4 c3 U% w# Q0 y# L
log.debug("调用服务返回消息:\n{}",BizUtils.buildBizMessageLog(bizMessage));
; @- x5 \! g2 X byte[] outData = . r' R" Q$ E& i0 I4 a
this.converter.pack(bizMessage.getData());% A& ^: M. \+ y% e
log.debug("打包后消息:\n{}",BizUtils.buildHexLog(outData));
% |3 V" o$ f4 u+ F; b
) b9 _. t' h2 m/ X- ? return new String(outData);
1 P' h) `4 T" `6 h; _1 i. A T1 R: t } catch (BizException e) {
2 c% [4 a! d; m/ [1 V c return"Source API执行出错:"% R% W, t% A4 k% u. M
+
! E; B- l- o. p "\ncode:" + e.getCode()$ i( M L& ^. Y0 L
+ "\nmessage:" + e.getMessage()4 P# P7 ]% x- {# M2 h, r" E/ t
+ "\nextMessage:"
- [. J# e% d" M! o + e.getExtMessage();( _ O* `4 s. i# G* q( {, s
}
3 ?/ [ o& b! q/ s4 T& B }3 _7 M: }( d- B. e
}可以看到SampleSource4Controller类实现了“/source4”的URL接口,申明了和source.yml中的source4所绑定的格式转换器——converter,以及调用“/bean/sample1”App服务的调用接口——appInterface。 % L! k- v- R! V% f; Z9 o2 L
在doService()方法中,主要有以下处理步骤:调用this.converter.unpack(),对传入的XML报文进行解包;把打包后的XML报文,通过this.appInterface.call()方法调用App服务;
7 _* v+ y w( }7 `* U 调用this.converter.pack(),把调用App服务返回的报文打包成XML报文返回二、App层App服务的开发和配置App服务,是采用《Biz-SIP业务中台案例实战(1)——开发最简单的App服务》一节中介绍的“/bean/sample1”,这个App服务是收到请求后,不做任何处理,直接把请求返回。 " {) r h6 {" G
具体的app.yml配置和相关的Sample1AppService类代码,这里就不再细述,具体参考前面的介绍三、启动应用进行测试启动SampleSourceApplication、SampleAppApplication应用,通过curl发起测试报文: % ~9 v- |) W" R9 e
$ curl -H "Content-Type:application/xml" -X POST --data
Q( ~* |$ J; W9 _6 ~7 o3 W, j9 O 王五500005 http://localhost:8080/source41 p4 \ K7 o% `9 g3 G
: U) t( p9 h. J l7 p/ `
! a I# H) y; h1 ?' t* J) r( a1 v
王五500
! _% V' ~- T& k 005shizhengyedeMacBooSampleSourceApplication应用打印日志:[bizsip-sample-source:192.169.1.107:8080] 8 X! W" a. d1 r+ [1 C- P& [! o
12:54:52DEBUG8409[][http-nio-8080-exec-1]c.b.b.s.s.c.SampleSource4Controller解包后消息:{"accountName":"王五" # f. u$ |$ q, t( B! C5 S3 ^3 T
,"balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]12:54:52DEBUG8409[][http-nio-8080-exec-1] ( X1 U. d; N* V% C/ n, }) ]# h9 y0 k% r x
c.b.b.source.api.AppServiceClientMethod调用App服务:/bean/sample1[bizsip-sample-source:192.169.1.107:8080]
! T! E3 I1 [: V) }6 ~ 12:54:52TRACE8409[][http-nio-8080-exec-1]c.b.b.source.api.AppServiceClientMethod调用App服务请求报文:{"accountName": ( |3 G+ F, Q: f4 O" s) a
"王五","balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]12:54:53DEBUG8409[][nioEventLoopGroup-2-1]
+ g+ W+ Q7 B2 a/ Y2 Q6 U c.b.b.s.s.l.NettyClientHandler写空闲超时,发送心跳检测包![bizsip-sample-source:192.169.1.107:8080]12:54:53TRACE8409
+ N* [! B1 A# o" b [e1fd243478df4f119d6c3cfa5f615671][http-nio-8080-exec-1]c.b.b.source.api.AppServiceClientMethodApp服务响应报文: 6 x" S2 W9 i! `& s0 L' ] o! H& t/ S
traceId:e1fd243478df4f119d6c3cfa5f615671appServiceId:/bean/sample1code:0message:success{"accountName":
1 Q+ Y' k, F# f- ~; N "王五","balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]12:54:53DEBUG8409[e1fd243478df4f119d6c3cfa5f615671]
& k: Y5 u# r1 l0 w [http-nio-8080-exec-1]c.b.b.s.s.c.SampleSource4Controller调用服务返回消息:traceId:e1fd243478df4f119d6c3cfa5f615671
m. E! g% R1 w8 o3 r+ h appServiceId:/bean/sample1code:0message:success{"accountName":"王五","balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]
: q- Z- H- j8 c$ D7 y, u# h 12:54:53DEBUG8409[e1fd243478df4f119d6c3cfa5f615671][http-nio-8080-exec-1]c.b.b.s.s.c.SampleSource4Controller / e0 a) g5 q* a: g7 d7 K6 v
打包后消息:====+01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20+======ASCII======+0000:3C3F786D - h9 N3 D e# `) p! l
6C2076657273696F6E3D22312E302220| |
' B) M1 e3 x8 }; j' E1 T8 H 0060: 3C 61 63 63 6F 75 6E 74 4E 61 6D 65 3E E7 8E 8B E4 BA 94 3C | 王.五.500005............ |
- b* f6 H/ X+ T& Y$ P( f# q Biz-SIP网站:http://bizsip.bizmda.comGitee代码库:https://gitee.com/szhengye/biz-sip 2 ^0 r8 D) n1 Z1 w& O+ P Q9 C4 Q# S
# u0 v3 I' C) B5 H( h# z
; o7 z7 p+ {( i6 M' X% l! `3 D# P& k4 y" y1 g# H3 q
# h s& m7 S( S8 w) D |