笔记12 - 对于网络编程,做过的优化?

2021-01-14 10:25:52 浏览数 (1)

DNS解析优化

安全方面

首先是防劫持,我们可以使用HttpDns,它与传统的DNS解析相比,HttpDns会绕开运营商的DNS服务器,直接与DNS服务器的80端口进行交互,可以有效的防止域名劫持。

目前国内常用的HttpDns SDK包括阿里云和腾讯云的HttpDns Service。

我们在项目中一般会使用OkHttp作为网络请求的工具,OkHttp预留了设置Dns的接口:

我们想要设置OkHttp中的Dns接口需要继承上面的这个接口,该接口中我们需要实现lookup的方法,这个方法需要返回查找到的服务器地址集合。我们也可以不自定义HttpDns解析的过程,这样OkHttp就会使用默认的实现来进行Dns的解析,如上图中的SYSTEM,它使用net保重InetAddress.getAllByName()方法,根据传入的hostname域名获取该域名下的IP地址集合。

下面是使用七牛云提供的免费happy-dns实现自己的OkHttp DNS解析的过程:

代码语言:javascript复制
implementation 'com.qiniu:happy-dns:0.2.13'
implementation 'com.qiniu.pili:pili-android-qos:0.8'

自己实现Dns接口中的lookup方法:

通过上面的方法,我们就成功通过HttpDns的方式,绕开了传统DNS解析需要通过运营商DNS服务器的方法,从而做到了防劫持的功能。

速度方面

DNS解析的速度优化,可以考虑下面几种方式:

IP直连的方式

我们可以直接配置IP白名单,跳过DNS解析流程,这样同样需要实现OkHttp的Dns的lookup接口:

使用IP直连的方式有两个问题,首先是需要自己维护一套IP列表,建立IP地址更新的机制;其次,IP地址访问的方式摒弃了Https的安全机制,考虑到数据传输的安全问题,需要自己建立数据加解密的方式,或对客户端代码进行改造。

DNS解析超时

当我们在做网络请求的时候,如果网络设备发生了路由切换,访问网络会出现长时间无响应的情况,很久之后抛出UnknownHostException的异常,说明发生了DNS解析错误,我们给OkHttp设置connectTimeout对DNS解析不起作用,这种情况下,我们可以自定义Dns类的超时判断,同样需要实现Dns接口类中的方法lookup方法:

网络请求缓存优化

我们在请求网络数据的时候,考虑到网络环境的情况,一般会将上次网络请求的数据持久化存储在本地,下次请求的时候,首先显示本地的数据,等网络请求的数据返回成功之后,再更新本地UI数据。

幂等性

Http的幂等性指的是一次和多次请求同一个资源应该具有相同的副作用。比如用户在进行网络支付的时候,用户支付成功,但是由于网络问题,可能客户端并没有收到支付成功的消息,此时用户有可能会重复支付。幂等性就是为了解决种种问题,从业务代码设计的层面避免这种情况。

原始的付款方式:

代码语言:javascript复制
boolean pay(user_id, amount)

上面付款的方式只是标示了用户身份和用户应该付的款项,但要是发生了上面那种情况,用户再次发起付款,这种方法会重复收款,而事实上是不应该的。

代码语言:javascript复制
int create_pay_ticket() // 针对每次付款生成一个票据
boolean pay(user_id, ticket_id, amount)

我们针对每次付款,在服务器生成一个票据Id,用户在付款的时候需要携带这个票据Id,核验一下票据所属用户的合法性以及票据是否已经付款的情况,这样既是用户重复发起付款,也可以避免重复收款的问题。

0 人点赞