|
" Y& K# l7 [+ Y2 Y2 x4 u3 Y7 t
Biz-SIP金融级业务中台(http://bizsip.bizmda.com)是一套基于领域驱动设计(DDD)架构,能快速构建金融级云原生架构的服务整合中间件,整合了在金融场景里锤炼出来的最佳实践Biz-SIP业务中台支持多种报文类型的格式转换器(Converter),包括XML、JSON、定长、有分隔符、ISO-8583等报文类型的解包和打包。
3 O: u/ Z$ c& I( D 在Source模块中,可以通过Java API接口调用Converter,在Source模块代码中实现报文解包和打包本节案例中是在通过RestController接入的Source模块代码中,通过Java API调用模板XML格式转换器(simple-xml),实现XML报文的打包和解包:。 * {) F0 z3 K. l, M' S
SampleSource4Controller是一个RestController,通过RESTful接受XML报文请求后,通过调用格式转换器Converter进行报文解包成平台标准JSON报文,然后调用App服务。 " x8 w4 C$ d+ g) f# Q' b
App服务(/bean/sample1)对输入报文没有做任何修改,是直接把原报文返回的SampleSource4Controller在收到App服务返回报文后,会再调用格式转换器进行报文打包成XML报文,作为RESTful请求的响应返回。
% n, q; R; u* `+ Q& @ 具体代码和配置可以查看Biz-SIP源代码中的Sample相关测试案例(https://gitee.com/szhengye/biz-sip)一、Source层Source服务的开发和配置首先,在Biz-SIP配置目录的source.yml中,配置对应的Source: 0 q$ f/ i9 \- ` W. n
-id:source4converter:type:simple-xml可以看到source4这个Source,格式转换器converter,设置为“type: simple-xml”,表示是采用基于简单XML格式转换器。 ) s) z& ?! L3 Q" u$ u' f
SampleSource4Controller是一个RestController,负责外部调用的接入,相关代码如下:@Slf4j@RestControllerpublicclassSampleSource4Controller
8 H+ S& M! J/ C8 e6 x' _ {# y4 [. g4 e# B# [
private Converter converter = Converter.getSourceConverter("source4");/ l% m" g4 f% i) ^2 g$ {% ^
private BizMessageInterface appInterface = SourceClientFactory
; f; R0 t7 u) P .getAppServiceClient(BizMessageInterface # P6 b8 l: Y3 c3 S6 ?
.class,"/bean/sample1");@PostMapping(value = "/source4", consumes = "application/xml", produces = "application/xml"
g% @( G- N* M' W2 e7 q6 Q )public Object doService(@RequestBody String inMessage, HttpServletResponse response) {
; R- n6 t: z: T! f8 f. U3 x BizMessage outMessage =
) y- V# I, X7 |) R) B, I null;
2 ], M. q8 k W# f- l try {6 M9 h5 `8 V6 z% Z; D# t
JSONObject jsonObject = this.converter.unpack(inMessage.getBytes());
: M- _3 ~9 j+ R5 k log.debug(
4 [, e# P, F& z. C "解包后消息:\n{}", BizUtils.buildJsonLog(jsonObject));
/ p7 C. G# D& b) w4 q BizMessage bizMessage = this
. i; I6 B2 e3 l# B. I+ @+ d .appInterface.call(jsonObject);
6 \; _$ z- i/ f; L log.debug("调用服务返回消息:\n{}",BizUtils.buildBizMessageLog(bizMessage));
! v' C8 h+ \( p8 ]$ ] byte[] outData =
, b2 x; L8 [4 k6 [' c0 Q this.converter.pack(bizMessage.getData());2 k9 L, _8 J8 B; W
log.debug("打包后消息:\n{}",BizUtils.buildHexLog(outData));! T( W% B$ p, F$ W0 F( r
1 O- b7 I- R3 ~# L1 d- j
return new String(outData);
: N* \3 [% m" `+ P' [2 T } catch (BizException e) {
) t+ Q( J1 d* l8 @" n, W# Z& k return"Source API执行出错:"
4 x0 p3 L) m+ N- H +
" H9 L5 V, a7 C; e9 [ "\ncode:" + e.getCode()
4 d( j; ]: _! m* U( P& G4 G3 c6 T$ { + "\nmessage:" + e.getMessage()$ V$ [6 M+ M B! ?5 W+ ^
+ "\nextMessage:"
, g; Y4 }$ E; z& S% a; G( m: b) H + e.getExtMessage();5 a q7 l1 I S+ c' K* {
}
/ d8 D9 W5 i0 M. n: b }0 I& j/ r% f5 d& ?& O
}可以看到SampleSource4Controller类实现了“/source4”的URL接口,申明了和source.yml中的source4所绑定的格式转换器——converter,以及调用“/bean/sample1”App服务的调用接口——appInterface。 2 z4 K) b4 X$ n H& \/ @% n; A5 ~/ W
在doService()方法中,主要有以下处理步骤:调用this.converter.unpack(),对传入的XML报文进行解包;把打包后的XML报文,通过this.appInterface.call()方法调用App服务; 4 \0 p) J U' r2 Z, P8 ~8 |
调用this.converter.pack(),把调用App服务返回的报文打包成XML报文返回二、App层App服务的开发和配置App服务,是采用《Biz-SIP业务中台案例实战(1)——开发最简单的App服务》一节中介绍的“/bean/sample1”,这个App服务是收到请求后,不做任何处理,直接把请求返回。 ( g0 c0 t: E W* g) I* D+ C
具体的app.yml配置和相关的Sample1AppService类代码,这里就不再细述,具体参考前面的介绍三、启动应用进行测试启动SampleSourceApplication、SampleAppApplication应用,通过curl发起测试报文: 6 e8 W2 l( v0 i5 Y3 D
$ curl -H "Content-Type:application/xml" -X POST --data * I) Q* L5 j3 }# b
王五500005 http://localhost:8080/source4
! d3 S0 s* K) p' }* W' B9 I+ o {8 }& w; ]. W
: H0 `2 v& E$ `0 U; B
王五500 L ^* k. K* m
005shizhengyedeMacBooSampleSourceApplication应用打印日志:[bizsip-sample-source:192.169.1.107:8080] : g* P: m6 w9 o& a
12:54:52DEBUG8409[][http-nio-8080-exec-1]c.b.b.s.s.c.SampleSource4Controller解包后消息:{"accountName":"王五" 1 s' G u9 \. H" K* R& i
,"balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]12:54:52DEBUG8409[][http-nio-8080-exec-1]
$ ]- U. r9 G* A% N) j# U- C c.b.b.source.api.AppServiceClientMethod调用App服务:/bean/sample1[bizsip-sample-source:192.169.1.107:8080]
$ T3 i; ?; E4 i u' F U; g: Y 12:54:52TRACE8409[][http-nio-8080-exec-1]c.b.b.source.api.AppServiceClientMethod调用App服务请求报文:{"accountName": , \9 p) V& z% z1 @& V
"王五","balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]12:54:53DEBUG8409[][nioEventLoopGroup-2-1]
9 v- X* o0 N; i4 Y! C" [6 Z c.b.b.s.s.l.NettyClientHandler写空闲超时,发送心跳检测包![bizsip-sample-source:192.169.1.107:8080]12:54:53TRACE8409 ) b2 }% e% [8 o1 {
[e1fd243478df4f119d6c3cfa5f615671][http-nio-8080-exec-1]c.b.b.source.api.AppServiceClientMethodApp服务响应报文:
/ G ?7 u; }, C4 f( ?% m traceId:e1fd243478df4f119d6c3cfa5f615671appServiceId:/bean/sample1code:0message:success{"accountName": $ L2 z9 d! T2 m4 e
"王五","balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]12:54:53DEBUG8409[e1fd243478df4f119d6c3cfa5f615671]
! |) J: \* x, v* E1 `. K$ | [http-nio-8080-exec-1]c.b.b.s.s.c.SampleSource4Controller调用服务返回消息:traceId:e1fd243478df4f119d6c3cfa5f615671
, m) ]9 S. x% U/ }. e! k appServiceId:/bean/sample1code:0message:success{"accountName":"王五","balance":500,"accountNo":"005"}[bizsip-sample-source:192.169.1.107:8080]
' b- P/ a) D* y 12:54:53DEBUG8409[e1fd243478df4f119d6c3cfa5f615671][http-nio-8080-exec-1]c.b.b.s.s.c.SampleSource4Controller & V! H$ |$ W1 V. V/ z$ H7 s, a; k
打包后消息:====+01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17-18-19-20+======ASCII======+0000:3C3F786D
, Z+ U9 y/ X6 D' q9 n( }" o! F g 6C2076657273696F6E3D22312E302220| |; V& c5 j6 `0 e9 b1 ~; Q
0060: 3C 61 63 63 6F 75 6E 74 4E 61 6D 65 3E E7 8E 8B E4 BA 94 3C | 王.五.500005............ | . _# X# J* U4 |: Z
Biz-SIP网站:http://bizsip.bizmda.comGitee代码库:https://gitee.com/szhengye/biz-sip 3 ?: n0 a& G5 b* Q2 L$ V. N* j
" c0 D4 g O. X* e* _
* n; w9 `) @" z% z, k1 Q# Z- k& k4 a( z3 Q) H( F
) b2 G! m( v! i
|