一定要有一个有高度扩展性的基础框架

这是少有的经验,但是也是未完成的经验。

服务接口的通用性会很强,必须能容纳未来的、不可预见的需求。因此,它必须有高度的扩展性,否则,未来肯定会面临“艰难的选择”:要么框架重构,要么抛开框架去开发专用接口。

kepler这次的改造,写了一个扩展性还可以的业务框架。但是这个还不够。成熟的业务框架,除了扩展性之外,还应该简化开发工作。

基础框架未定型的情况下,不要发布上线版本

具体的说,这次10411分支上,用的是未定型的框架;而kepler-loan分支上,则是经过优化后的框架。

这导致了两个分支中的代码冲突太多,无法在同一天上线,因此推迟kepler-loan的上线时间。

服务端和客户端需要注意乐观锁问题

由于hibernate的乐观锁是利用version字段来做的,这导致了客户端、服务端同时对一个数据进行更新时,后完成更新的(一般是客户端)会抛出乐观锁异常。

具体业务尽量通过组合通用接口来完成,而不是开辟专用接口

客户端注意接收服务端数据时的类型转换

默认情况下,spring提供的RestfulTemplate会将服务端返回的json串解析为LinkedHashMap。如果需要将返回结果转换为其它类型,应当在调用RestfulTemplate时指定返回数据类型。

或者使用RestClientFactory(没错我就是来推销自己写的代码的),在调用时指定ResponseAs即可。例如这样:

RestfulResult result = this.restClientFactory
    .newClient()
    .setUrl(this.variables.getBizAccountRESTURL() + "bizAccountEvent/LOAN/")
    .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE)
    .setBody(JsonMapper.defaultMapper().toJson(requestBodyMap))
    .responseAs(RestfulResult.class)
    .post();

技术/开发人员主导的系统改造、优化,必须与产品、业务人员充分沟通

技术主导的改造、优化,会比较专注于后台的代码流程,而忽略/忽视业务人员操作的习惯等。因此,改造前、改造中必须有充分沟通。避免改造完成后,业务人员不接受改造结果的问题发生。

分布式服务调用一定要用重试/补发机制

无论同步还是异步,在主流程之外,一定要有针对异常的重试或补发机制。

灰度上线

对影响范围或者功能/性能风险较大的功能 ,做灰度上线。

如新、旧代码同时上线,以一定方式保证热切换。或者新旧代码同时运行,对两套代码的功能、性能等进行对比和监控,待新代码稳定后再全面切换。