Blazor WebAssembly + Grpc Web = 未來?

来源:https://www.cnblogs.com/chenyishi/archive/2022/06/13/16371199.html
-Advertisement-
Play Games

Blazor WebAssembly是什麼 首先來說說WebAssembly是什麼,WebAssembly是一個可以使C#,Java,Golang等靜態強類型編程語言,運行在瀏覽器中的標準,瀏覽器廠商基於此標準實現執行引擎。 在實現了WebAssembly標準引擎之後,瀏覽器中可以執行由其他語言編譯 ...


Blazor WebAssembly是什麼

首先來說說WebAssembly是什麼,WebAssembly是一個可以使C#,Java,Golang等靜態強類型編程語言,運行在瀏覽器中的標準,瀏覽器廠商基於此標準實現執行引擎。

 

在實現了WebAssembly標準引擎之後,瀏覽器中可以執行由其他語言編譯成的wasm模塊。使用強類型編程語言的好處顯而易見:

  • 可以選擇更多的語言,編寫前端邏輯
  • 靜態編程語言編譯成的位元組碼,相對於JS這種腳本語言執行效率更高
  • 可以使用靜態編程語言生態中的強大類庫

Blazor WebAssembly是dotnet版本的WebAssembly實現,微軟將dotnet運行時編譯成dotnet.wasm模塊,我們的程式編譯出來的dll文件運行在此模塊上。

需要註意的是,Blazor WebAssembly是一個完完全全的前端框架,只是邏輯代碼不再使用JS編寫,而是使用C#編寫。

Grpc Web是什麼

Grpc是一種與語言無關的的高性能遠程過程調用(RPC)框架。Grpc有以下優點

  • 現代高性能輕量級 RPC 框架。
  • 協定優先 API 開發,預設使用協議緩衝區,允許與語言無關的實現。
  • 可用於多種語言的工具,以生成強類型伺服器和客戶端。
  • 支持客戶端、伺服器和雙向流式處理調用。
  • 使用 Protobuf 二進位序列化減少對網路的使用。

而Grpc Web是Grpc的前端實現版本,可以使瀏覽器應用直接與Grpc交互。

有了Grpc Web,我們可以直接在Blazor WebAssembly中調用Grpc Server,而不用再通過傳統的Http請求方法調用。

代碼演示

GrpcServer

首先需要新建一個Grpc Server

 然後為其引入 Grpc.AspNetCore.Web Nuget包,並開啟grpc web

app.UseGrpcWeb(); // Must be added between UseRouting and UseEndpoints
// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>().EnableGrpcWeb();

之後我們需要為Grpc Server開啟跨域設置,允許跨域訪問

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    context.Response.Headers.Add("Access-Control-Allow-Headers", "*");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH");
    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    context.Response.Headers.Add("Access-Control-Max-Age", "100000");
    context.Response.Headers.Add("Access-Control-Expose-Headers", "Grpc-Status,Grpc-Message,Grpc-Encoding,Grpc-Accept-Encoding");
    if (context.Request.Method.ToUpper() == "OPTIONS")
    {
        return;
    }
    // Do work that can write to the Response.
    await next.Invoke();
    // Do logging or other work that doesn't write to the Response.
});

最終Program.cs的代碼如下

using GrpcService2.Services;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();

var app = builder.Build();
app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
    context.Response.Headers.Add("Access-Control-Allow-Headers", "*");
    context.Response.Headers.Add("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH");
    context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    context.Response.Headers.Add("Access-Control-Max-Age", "100000");
    context.Response.Headers.Add("Access-Control-Expose-Headers", "Grpc-Status,Grpc-Message,Grpc-Encoding,Grpc-Accept-Encoding");
    if (context.Request.Method.ToUpper() == "OPTIONS")
    {
        return;
    }
    await next.Invoke();
});

app.UseGrpcWeb();
app.MapGrpcService<GreeterService>().EnableGrpcWeb();

app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

app.Run();

Blazor WebAssembly

現在新建一個WebAssembly項目

 為其引入以下nuget包

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.20.1" />
    <PackageReference Include="Grpc.Net.Client" Version="2.46.0" />
    <PackageReference Include="Grpc.Net.Client.Web" Version="2.46.0" />
    <PackageReference Include="Grpc.Tools" Version="2.46.1">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>

在其項目文件中包含進proto文件

  <ItemGroup>
    <Protobuf Include="..\GrpcService2\Protos\*.proto" GrpcServices="Client" />
  </ItemGroup>

然後將GrpcClient註入容器

builder.Services.AddScoped(p =>
{
    var channel = GrpcChannel.ForAddress("https://localhost:7033/", new GrpcChannelOptions
    {
        HttpHandler = new GrpcWebHandler(new HttpClientHandler())
    });
    var client = new GrpcService2.Greeter.GreeterClient(channel);
    return client;
});

修改Index.razor,讓其訪問grpc server

@page "/"
@inject GrpcService2.Greeter.GreeterClient GreeterClient

<div>grpc web response @Message</div>

@code {
    public string Message { get; set; }
    protected override async Task OnInitializedAsync()
    {
        var reply = await GreeterClient.SayHelloAsync(new GrpcService2.HelloRequest { Name = "test" });
        Message = reply.Message;
    }
}

最終效果如下

可以看到整個請求/渲染過程,使用的是C#代碼編寫的邏輯,沒用到js,原理是因為,blazor webassembly將我們的dotnet運行時,與我們的代碼編譯後的程式集,運行在了基於webassembly標準實現的瀏覽器引擎中。

並且可以看到請求響應體都使用的壓縮過的二進位形式。效率相對更高

 

webassembly難道是未來?難道未來的某一天要和js say goodbye了嗎?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 前幾天小編在抖音上刷到一個慢慢變老的視頻,播放量居然有 30W+,當時就在想這視頻 Python 可不可以做?經過一番搜索,小編找到了 騰訊雲的人臉年齡變化 API,上面介紹說只要用戶上傳一張人臉圖片,基於人臉編輯與生成演算法,就可以輸出一張人臉變老或變年輕的圖 片,並支持實現人臉不同年齡的變化 ...
  • 我們以識別詩詞為例下麵是我們要識別的圖片 先看下效果圖 我們運行代碼後識別的結果,有幾個字沒有正確識別,但是大多數字都能識別出來。 一行代碼就能識別圖片,我們背後要做些準備工作的 •這裡我們需要用到兩個庫:pytesseract和PIL •同時我們還需要安裝識別引擎tesseract-ocr 下麵就 ...
  • UML系統建模 1 概述 1.1 課程概述 彙集UML及其相關的一些話題 回顧UML相關的符號與概念 以電商訂單相關業務為例,藉助UML完成系統建模 將UML變成提升建模效率,表達架構思想的工具 1.2 什麼是UML ​ Unified Modeling Language 統一建模語言,又稱標準建模 ...
  • 前言 周末到了,不想給大家太多的壓力,今天就給大家分享一個比較簡單的彈球小游戲吧。這無聊的周末又有事可以做了,nice… 先看一下我們的最終效果圖 我們分9步來講解如何寫這個小游戲 1.創建游戲的主界面 我們用Python的內置模塊Tkinter來完成了,它是Python的標準GUI工具包,可以非常 ...
  • 前面我們剖析了Redisson的源碼,主要分析了Redisson實現Redis分散式鎖的15問,理清了Redisson是如何實現的分散式鎖和一些其它的特性。這篇文章就來接著剖析Zookeeper分散式鎖的實現框架Curator的源碼,看看Curator是如何實現Zookeeper分散式鎖的,以及它提 ...
  • 認識JavaWeb,衛星定位:zhanjiquan666,衛星定位:zhanjiquan666 ...
  • 一、說明 Fate 是一個工業級聯邦學習框架,所謂聯邦學習指的就是可以聯合多方的數據,共同構建一個模型; 與傳統數據使用方式相比,它不需要聚合各方數據搭建 數據倉庫,聯邦學習在聯合計算建模的過程中,多方機構之間的數據是不會進行共用的,實現數據的 可用不可見;本文主要分享隱私計算平臺 Fate 的相關 ...
  • 文章首發在公眾號(龍台的技術筆記),之後同步到個人網站:xiaomage.info Hippo-4J 距離上一個版本 1.2.1 已經過去一個月的時間。在此期間,由 8 位貢獻者 提交了 170+ commits,正式發佈 1.3.0 版本。 註:這是一個 相容歷史版本 的重大升級。 Github: ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...