java中如何编写出优雅的Controller呢?
下文笔者讲述写出优美的Controller的注意事项及操作方法,如下所示
java代码编写优美的Controller,只需注意以下几点即可 1.安全性 2.可重复调用 3.稳定性 4.日志全面,方便问题排查 =========================================================== 具体的相关说明,如下所示
1.签名
为避免Controller接口中的数据被篡改 我们需要对Controller接口接收和输出的数据进行签名操作 1.常见的签名方法: 接口请求方将请求参数 + 时间戳 + 密钥拼接成一个字符串 然后使用md5等hash算法,生成一个前面sign。 2.在请求参数或者请求头中 增加sign参数,传递给API接口。 3.当API接口的网关服务 获取到该sign值 然后用相同请求参数 + 时间戳 + 密钥拼接成一个字符串 用相同的m5算法生成另外一个sign 对比两个sign值是否相等。 3.1 当两个sign相等,则认为是有效请求 API接口的网关服务会将给请求转发给相应的业务系统。 3.2 当两个sign不相等,则API接口的网关服务会直接返回签名错误。
2.加密
controller中如何传递敏感数据,如: 用户登录密码,银行卡号、转账金额、用户身份证等 这些信息我们通常使用 “非对称加密”的方式,对敏感数据进行加密和皆灭操作
3.ip白名单
为避免接口的签名及加密都泄漏,那么此时我们还可以对接口增加IP白名单 这种方式,就可以再一次保证接口的安全
4.限流
避免接口使用多,我们可以对接口进行相应的限流
限流方法有三种: 对请求ip做限流: 如同一个ip,在一分钟内,对API接口总的请求次数,不能超过10000次。 对请求接口做限流: 如同一个ip,在一分钟内,对指定的API接口,请求次数不能超过2000次。 对请求用户做限流: 如同一个AK/SK用户,在一分钟内,对API接口总的请求次数,不能超过10000次。 实际工作中 可通过nginx,redis或者gateway实现限流的功能。
5.参数校验
日常开发中,我们必须对传入的参数做严格限制 如: 校验必填字段是否为空,校验字段类型,校验字段长度,校验枚举值等等。 验证参数可对一些无效的请求做相应的拦截 ======================================================== 例: 1.在新增数据时 字段长度超过数据字段的最大长度 数据库会直接报错 在参数验证层面拦截,避免进入数据库,减少数据库的压力 2.一些收款金额,避免为负数 等等等
6.统一返回值
调用过别人API接口 正常返回数据是一种json格式 如: { "code":0, "message":null, "data":[{"id":88888,"name":"java265.com"}] }, 签名错误返回的json格式: { "code":1001, "message":"签名错误", "data":null } 没有数据权限返回的json格式: { "rt":10, "errorMgt":"没有权限", "result":null }
7.统一封装异常
如: API接口服务器返回异常时 默认会返回SQL异常 此时我们应该避免返回的异常信息,弹出SQL语句,表结构信息 应该统一返回的信息,为指定的文字
8.请求日志
由于涉及三方接口交互,此时我们需进行相应的请求日志, 如: API接口的请求url、请求参数、请求头、请求方式、响应数据和响应时间等,记录到日志文件 当然有 traceId 更好,后续方便联调和追踪 例:在request头上,加入 x-traceId 等信息 在各系统的日志中,记录 x-traceId
9.幂等设计
在极短的时间内,请求我们接口多次 如:在1秒内请求两次。有可能是他们业务系统有bug 或 在做接口调用失败重试 因此我们的API接口需要做幂等设计。 例: 第一次请求数据库会新增数据 第二次请求以后就不会新增数据,但也会返回成功。 这样做的目的是不会产生错误数据。 日常开发中 可通过在数据库中增加唯一索引 或 在redis保存requestId和请求参来保证接口幂等性
10.限制记录条数
限制接口 传入参数的大小及返回数据的行数大小 避免接口资源的浪费
11.压测
上线前,需对接口进行压测 了解各接口的QPS情况
12.异步处理
API接口如果同步处理,则会使接口返回的非常慢 此时我们应该将可以异步处理的消息,进行MQ等缓存,然后使用另外一个服务去消费 采用这样的方式,则会使系统的速度更快
13.数据脱敏
在接口返回敏感信息中 直接对敏感数据进行加密 如: 用户手机号、银行卡号等 我们需对敏感数据进行加密保护
14.完整的接口文档
列举各接口的功能 使用说明 返回示例
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。