面试官:小萧啊,我好想你啊,你都好久没来找我面试了呀。
小萧:emmmmmmm,这不是怕被你打击吗。
面试官:ok,看来是有备而来,那么我们今天聊聊网络优化咋做吧。
小萧:我大意了,没有闪。老头子,你不讲武德,我奉劝你耗子尾汁。
如何优化一个网络请求呢?
相信大家在面试的时候可能会被问到这个问题。今天我其实就是讲述下我知道的一些简单的优化方式,可以帮助大家在面试的过程中得到点基础分数。
我们先从最简单,大家比较容易了解到的讲起。
DNS优化
DNS则是典型的应用层的协议了,至于说为什么第二层能查第三层的IP,因为DNS是Domain Name System缩写,所以你认为是服务是协1653议都可以。
一个Http请求在建立Tcp连接的过程中,肯定会产生一次DNS,那么我们是不是可以通过内存缓存的方式,通过一个HashMap
持有这个Host
的IP
,当下次发起Tcp连接的时候,我们就可以用直接用内存中的这个Ip,而不需要再去走一遍Dns服务了。
这个时候你肯定会问我,卧槽,你这个不是搞我吗,这可怎么改呀?
如果你的网络层用的是OkHttp
的话,Okhttp
在封装的时候就已经考虑到这个部分了,其内部提供了Dns
的接口,可以让外部在构造Client的时候传入。
class HttpDns : Dns {
private val cacheHost = hashMapOf<String, InetAddress>()
override fun lookup(hostname: String): MutableList<InetAddress> {
if (cacheHost.containsKey(hostname)) {
cacheHost[hostname]?.apply {
return mutableListOf(this)
}
}
return try {
InetAddress.getAllByName(hostname)?.first()?.apply {
cacheHost[hostname] = this
}
mutableListOf(*InetAddress.getAllByName(hostname))
} catch (e: NullPointerException) {
val unknownHostException =
UnknownHostException("Broken system behaviour for dns lookup of $hostname")
unknownHostException.initCause(e)
throw unknownHostException
}