1. 程式人生 > >.Net Core 3.0 gRPC部署問題解決

.Net Core 3.0 gRPC部署問題解決

前言

  .Net Core3.0終於如約而至的來了。在3.0中增加了許多東西、也有了許多的變化。今天我們看的就是在3.0中使用gRPC並遇到的問題。gRPC現在可以非常方便簡潔的在.Net Core中使用了,今天我也是嘗試了一下,但是不幸了是遇到了一些阻礙。我們一起看看是啥問題吧。

gRPC介紹

  gRPC 是google開源的一個高效能、跨語言的RPC框架,基於HTTP2協議,採用ProtoBuf 定義的IDL。

  優點:

    1. 現代高效能輕量級的RPC框架
    2. 協定優先 API 開發,預設使用協議緩衝區,允許與語言無關的實現
    3. 可以實現多語言的工具
    4. protobuf二進位制序列化,效能好/效率高
    5. 基於Http2.0

  在ASP.NET Core 3.0中使用gRPC也有許多文章進行了介紹,我也是看了這些文章進行的學習。大家也是可以自行去查詢的。

部署問題

  按照在ASP.NET Core 3.0中使用gRPC的文章中的教程一步一步的建立專案,編寫程式碼。一套流程走下來那是行雲流水。編寫完之後在本地就開始進行測試。先跑起來服務端。在跑客戶端。看到客戶端上的訊息返回。成功了。第一次就成功,果然是更加簡單了。其中有兩點需要注意的是因為在3.0中使用的gRPC是基於Http2.0的。而它又需要HTTPS,儘管說沒有明確規定必須使用HTTPS,但是為了安全在瀏覽器實現上都要求了HTTPS,所以現在的HTTP/2和HTTPS基本都是一對。

  所以我們在本地執行的時候會出現一個彈框,詢問我們是否信任證書。下面我的問題也就和這個有關了。本地執行一切正常。我就想搬到伺服器上去試試看行不行。結果接過上去服務端是跑起來了,結果客戶端執行起來就報錯了。

Unhandled exception. System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.

 ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

 

 

解決方案

1、修改https為http(不行、大錯特錯)

  這個報錯我就有點納悶了,我首先檢查環境,發現都是對的。就有點納悶了。然後看是連線失敗。我就嘗試修改https為http。結果還是錯誤的。這個方法就被拋棄了。(修改之後會導致客戶端和服務端的SSL/TLS 配置不匹配。.Net Core客戶端必須在https伺服器地址中使用才能正確的使用安全連線)

2、信任證書(可行)

  仔細檢視錯誤,發現最後標明是證書無效。這是想起我們在本地第一次執行的時候彈窗提示我們是否信任證書。好像就是這個關係了。照這個路子想下去。找到在如何安裝 ASP.NET Core HTTPS 開發證書。然後我們再試試、果然就可以了。

dotnet dev-certs https --trust

 

3、忽略無效證書(可行)

  後面又發現了一種解決方案,既然是證書無效導致的問題,那麼忽略無效證書是不是可以呢?然後我們換一臺伺服器,繼續嘗試一下。在程式碼中加上忽略無效證書的程式碼。然後再次進行嘗試發現也是可以的。不過這裡需要注意的是這個忽略無效證書在開發過程中使用即可,換到生產環境還是替換成有效證書

           

        var httpClientHandler = new HttpClientHandler();
            // Return `true` to allow certificates that are untrusted/invalid
            httpClientHandler.ServerCertificateCustomValidationCallback =
         HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
            var httpClient = new HttpClient(httpClientHandler);
 

            var channel = GrpcChannel.ForAddress("https://localhost:5001",new GrpcChannelOptions { HttpClient = httpClient });
            var client = new Greeter.GreeterClient(channel);

 

 

總結

  在我們使用在.Net Core 3.0中使用gRPC的時候,需要注意的時候保持客戶端和服務端的SSL/TLS配置的匹配,基於HTTP2.0,使用https進行連線。證書的問題也就是在開發環境時出現解決,在正式生產環境中我們還是需要使用有效證書的。


    平凡人生要用平凡的心去對待,你的人生將會更精彩。 

  歡迎大家掃描下方二維碼,和學習瞭解更多的知識吧!