gRPC1.19DNS解析失敗問題及Vcpkg任意版本安裝支持

  • 1.場景重現

最近項目上客戶端遇到了一個偶發的登錄問題,用戶在輸入正確的賬號密碼的情況下,客戶端顯示登錄失敗,但是在同一環境下登錄官網的用戶後臺卻100%的成功,於是打開日誌查看了一下:

exchangePublicKey(14,DNS resolution failed)

發現是DNS解析失敗,當時我想是不是用戶DNS被劫持了、使用了代理或者是其他網絡原因


  • 2.原因分析

在用戶環境下查看了一下DNS沒有被改動,nslookup命令可以正常解析出服務器的IP地址,Host文件也是正常的,當時一下就不知道怎麼查下去了,由於是偶發bug,也沒有太多的場景去復現。後來在https://github.com/grpc/grpc/issues/18411上看見有人遇到同樣的問題了,才知道這是gRPC1.19(可能後續版本還有問題)的bug,當然處理這個bug有許多的方式,但在github上大多數項目在處理gRPC1.19版本DNS解析失敗問題都採用了版本回退的方式,所以我也打算把版本先回退到1.18版本。


  • 3.Vcpkg支持任意版本安裝

項目上客戶端的環境是在Vcpkg上集成的,具體可以參考本站的博客,寫的特別詳細https://blog.csdn.net/cjmqas/article/details/79282847,Vcpkg上支持的版本可以使用命令,例如查看當前支持的gRPC版本

PS D:\Google\vcpkg-master> .\vcpkg.exe search grpc
grpc                 1.18.0           An RPC library and framework

如果你是在github上下載ZIP到本地,那麼就沒有git回退的功能,但是查找了很多資料都沒有關於任意版本安裝的教程,後來慢慢摸索出來了,廢話不多說,下面就介紹。

在vcpkg-master\ports目錄下,最少維護了兩個文件:CONTROL和portfile.cmake  

   其中CONTROL維護文件Source、Version、Build-Depends、Homepage、Description

Source: grpc
Version: 1.18.0
Build-Depends: zlib, openssl, protobuf, c-ares (!uwp)
Homepage: https://github.com/grpc/grpc/tree/v1.18.x
Description: An RPC library and framework

portfile.cmake 中維護文件的CMake編譯信息,用於Vcpkg配置環境。

vcpkg_from_github(
    OUT_SOURCE_PATH SOURCE_PATH
    REPO grpc/grpc
    REF 75475f090875e737ad6909a6057c59577f0c79b1
    SHA512 db9ff82dee38cb0f4ba10874d10bf6cb20c8a4d49e7dd24bcd9f71388c54c782ee12fda6f1bfedd79ad988b0275d3f96df4686217465acfafcfb5e4c30093a5b
    HEAD_REF master
    PATCHES
        00001-fix-uwp.patch
        00002-static-linking-in-linux.patch
        00003-undef-base64-macro.patch
        00004-link-gdi32-on-windows.patch
)

當你在命令行敲下安裝命令的時候,Vcpkg就是到這裏去查找下載和配置的詳細信息的,所以安裝任意版本的祕訣就在於修改配置文件,首先在CONTROL中,將Version改成你需要安裝的版本,Homepage後面的鏈接改成新版本鏈接,鏈接可以在github上找到,接着在portfile.cmake中把你需要安裝文件的散列值(SHA512)改成你希望安裝的版本的值,接下來接交給Vcpkg去集成你所需要的版本吧。

當然,最好是通過Git把vcpkg拉到本地,只需要回滾到你需要的那個版本,再進行安裝即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章