当前位置: 首页 > 科技观察

关于Java健壮性的一些思考和实践

时间:2023-03-13 06:07:21 科技观察

程序的健壮性很重要,怎么玩写才能让程序更健壮?我还有一些建议。1.统一业务处理按照蚂蚁金服开放平台标准返回响应。一个响应应该至少有4个返回值。1.isSuccess调用是否成功2.data返回的响应数据3.errorCode错误码4.errorMsg错误信息这需要我们的接口有一个标准统一的响应,那么如何实现呢?1、Spring方面,JDK动态代理,Cglib动态代理等都是用代理类实现的。2.匿名子类使用一个公共的Executor来处理所有的请求。以上两种方式都可以实现标准的响应封装,那么到底应该封装什么?其实最重要的是统一的trycatch,防止任何500错误都发给调用者。------为什么要在最外层做?------因为500错误对调用者来说是致命的,没有价值,不管调用者是前端还是其他业务系统------设置统一的错误码-------如参数错误PARAMETER_ERROR数据库错误DATABASE_ERROR外部系统错误OUTER_SYSTEM_ERROR如果你有以上错误码和错误信息,业务方至少可以告知用户发生了什么,你也可以设置一系列告警和自动运维方式来处理这些错误。2.参数检查在真正的逻辑处理之前,需要对输入的参数进行一系列的检查,以保持后续业务处理逻辑的轻量化。这也是fastfail思想的指导,出现错误要尽快结束处理。它是什么样的?我们假设参数为m.if(null==m){return;}来进行null判断,以防止在后续的droop中与m一起出现NullPointerException,但是这里不建议抛出NPE,因为会造成混淆查看日志。if(StringUtils.isEmpty(m)){return;}字符串是否为空字符串if(CollectionUtils.isEmpty.isEmpty(m)){return;}集合是否为空或为空返回真;}catch(JSONException){returnfalse;}判断字符串是否为JSON格式3.重试机制对于特定的外部系统错误,可以多次尝试该策略。前提下。这样做可以在一些网络不稳定的情况下提高响应成功率。4.什么是幂等机制?意思是无论何时何地,无论是谁,只要是第一个攻击请求,就应该有相同的响应,直到达到最终状态。该原则不关注上次的执行结果。Penguin当前的结果应该不会因为上次请求的部分成功或失败而导致一些中间状态不一致导致请求失败。5.LambdaOptionl.of(target).getOrElse(newArrayList()).filter(Object::NotNull).forEach(()->{})可以保证绝大部分异常不会出现,尤其是对于集合处理的时候,因为集合中只要有一个值,程序就会失败,整个程序就会报错。这种写法是因为对数据做了更多的检查和兼容,所以出错的概率会比较低,但是也会有一个缺点,就是当这样的程序出现异常的时候,开发者一般不知道去哪里开始。定位到哪一行数据已经很困难了。【本文为专栏作家“大脚”原创稿件,转载请通过作者微信公众号“一个叫大脚的程序员”获得授权】点此查看本作者更多好文