OpenAI 說要封禁來自中國的流量,我笑了
大山最近有一些苦惱!
這兩年 AI 勢頭發展有些迅猛,大山所在公司是傳統行業,他們的高管也想著用 AI 來降本增效,都說 ChatGPT 是 AI 的翹楚,于是高管決定先讓員工從使用 ChatGPT 開始。
但是直接用 ChatGPT 官網,有一定的門檻,高層決定部署一個面向用戶的套殼 ChatGPT 網站試試水,通過調用 OpenAI api 來使用 ChatGPT。
眼看著交付日期臨近,大山急忙向 CTO Tony 求助,Tony 聽了大山的匯報,心平氣和地說了一句話:大山啊,應該聽過一句話,在計算機領域,沒有什么是加一層解決不了的,如果有那就再加一層,你想想看,直連不行,能不能采用間接的方式來訪問 OpenAI 呢,比如中間加一個代理?
圖片
大山恍然大悟,于是立即動手先在 vercel.com(可以簡單理解為一個免費高效的 Web 應用部署平臺)上部署了一個訪問 OpenAI api 的應用,然后國內的請求先訪問這個應用,應用再訪問 OpenAI api,打算通過這樣的方式來實現間接訪問 OpenAI api 的效果。
圖片
然而理想很豐滿,現實很骨感,國內無法訪問 vercel 上的應用。
大山心想主要問題在于國內無法訪問 vercel,那我是不是可以找一個代理服務器,只要國內能訪問,它也能訪問 OpenAI,不就行了,比如香港的服務器就滿足需求,于是就把自己的想法給 Tony 提了一下。
Tony 笑了一下:使用代理服務器確實可以,但其實國內也有辦法訪問 vercel 的,可以使用 CNAME 哦!
「CNAME,這是啥,之前從未聽說過呢」大山困惑道。
Tony 看大山對 CNAME 確實一無所知,于是給他科普起了域名解析:
我們知道域名是為了方便人類記憶的,計算機只認 IP 的,任何一個域名都要被解析成 IP 地址才能訪問,為了表示域名和其對應的 IP 的關系,我們在 DNS 后臺可以填上一條記錄來記錄域名和 IP 的關系,如下:
example.com | record type | value | TTL |
@ | A | 192.0.2.1 | 14400 |
我們把這樣的域名與 IP 直接對應的記錄稱為 A 記錄,上文中的 @ 表示解析主域名(example.com),這樣 DNS 解析服務器就知道這個域名可以直接被解析成對應的 IP 了。
理論上有了 A 記錄域名解析就不成問題了,但 A 記錄無法完美解決以下兩個場景。
一. 多個應用部署在同一臺機器上的場景
多個應用部署在同一臺機器( 同一個 IP),這種場景很常見,比如在機器上部署了多人應用,然后使用 Nginx 作為負載均衡器來轉發部署在這臺機器的其他應用。
圖片
為了讓 DNS 識別每一個域名對應的 IP(假設為 121.239.166.161),我們可以為每一個域名用 A 記錄來記錄一下
圖片
這么做確實也可以,但其實有一個很大的問題是,IP 可能會變的,假設你的服務從一個廠商遷到另一個廠商(比如從騰訊云遷移到阿里云),那么你的服務器 IP 就會發生變化,此時你需要一個個地去改 A 記錄中每個域名對應的 IP,實在太過煩瑣(幾十個應用部署在同一臺機器上對大廠而言很常見)。
當然了如果你不嫌麻煩,這樣確實也能達到目的,但有沒有更優雅的方案呢?
計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決,此時 CNAME 就發揮了作用,我們可以讓這些域名都先解析到一個臨時的域名(假設為 alias.com),然后再為這個 alias.com 域名配置一個 A 記錄,這個 A 記錄會記錄 alias.com 對應的真正的 IP。
這樣的話 DNS 會先把應用的域名解析到 alias.com,然后再解析成 alias.com 對應的 IP。
如果 IP 變了,只要改 alias.com 這一條 A 記錄對應的 IP 地址就行了,實在是省事太多。
圖片
對比原來的一個個改 A 記錄無疑是一個巨大的進步。
二. CDN 使用
如果說以上的這種場景你不嫌麻煩一個個為每個域名配置 A 記錄的話也能達到解析訪問域名的話,那接下來的這種場景不使用 CNAME 就無解了。
現在很多云廠商都提供了 CDN 的功能,CDN 會將源站資源緩存到位于全國各地的CDN節點上,用戶請求資源時,就近返回節點上緩存的資源,那么問題來了,如果我從杭州訪問一個資源,假設為 https://b1.example.com/upload/avatar.png,那么 CDN 怎么知道我是從杭州訪問的從而從杭州的 CDN 節點返回結果給我呢?
如果你用 A 記錄顯示不合適,因為 A 記錄是記錄域名與 IP 的關系,無論你填哪個地區的 IP,DNS 都無法把就近的 IP 返回給你。
此時 CNAME 就派上用場了,我用 CNAME 讓 b1.example.com 指向一個 DNS 調度器,這樣的話每次訪問請求先打到這個調度器,然后再由節點調度器根據請求的 IP 來判斷它來自哪個地區的。
進而調度器就可以把離這個 IP 就近的 CDN 節點 IP 返回給請求方,然后就可以從這個就近的 CDN 節點拉取內容了,完整的 CDN 請求鏈路如下:
圖片
「我明白了,原來 CNAME 起到了偷天換日的效果,但我還是不明白如何使用 CNAME 來達到讓國內的用戶訪問 vercel 上的應用」大山疑惑道。
「vercel 提供了一個域名 cname.vercel-dns.com.,這個域名是能被國內 DNS 解析的」Tony 會心一笑。
聽到這,大山恍然大悟,我可以為我訪問的 api 域名配置一個 CNAME,填的就是 cname.vercel-dns.com.,然后就可以解析出 vercel 平臺的對外 IP,拿到了 IP 一切就簡單啦!
搞完之后普通用戶果然能訪問 OpenAI api 啦!
想起 OpenAI 之前宣布的將封禁中國的流量,大山會心一笑。