前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >笔记12 - 对于网络编程,做过的优化?

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

作者头像
码农帮派
发布2021-01-14 10:25:52
8280
发布2021-01-14 10:25:52
举报
文章被收录于专栏:码农帮派码农帮派

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,核验一下票据所属用户的合法性以及票据是否已经付款的情况,这样既是用户重复发起付款,也可以避免重复收款的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
移动解析 HTTPDNS
移动解析 HTTPDNS 基于 HTTP 协议向腾讯云的 DNS 服务器发送域名解析请求,替代了基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式,可以避免 Local DNS 造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档