一、请求阶段
- ngx_resolve_start
(1)分配ctx结构体;
(2)赋值DNS结束后的回调函数。 - ngx_resolve_name->ngx_resolve_name_locked
- 如果该域名在resolver中已存在节点:
a.如果该节点仍有效,则更新node超时时间,将resolver中的DNS解析结果赋值给ctx,调用ctx的回调;
b.如果该节点已失效。若因DNS响应还未返回(rn->waiting),则将该cxt挂至rn->waiting;若因响应后失效,则重新发起DNS请求(即2的流程)。 - 如果该域名在resolver中不存在节点:
a.分配并初始化rn节点,加入resolver红黑树;
b.建立DNS请求字符串(rn->query);
c.发送DNS请求(ngx_resolver_send_query);
d.使能ctx->event超时定时器,用于ctx超时;
e.将rn加入resolver的resend_queue队列,用于DNS的超时重传。如果这是resend_queue中的首个元素,则需要使能r->event重传定时器。该定时器超时时,会遍历resolver的resend_queue,对所有需要重传的node
- 如果该域名在resolver中已存在节点: