日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

入门干货之Grpc的.Net 封装-MagicOnion

發(fā)布時間:2023/12/4 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 入门干货之Grpc的.Net 封装-MagicOnion 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x01、Grpc

?

  1、介紹

?Google主導開發(fā)的RPC框架,使用HTTP/2協(xié)議并用ProtoBuf作為序列化工具,支持多種語言。在.NET Core “大更新” 之前,也就是目前來說還算是個很不錯的選擇。

  

  2、吐槽

      a、有很多性能比較的文章拿Grpc開涮.

      b、搭建困難,惡心,復雜,反胃,有點吃不消,吃嗎丁啉不一定好使,砸鍵盤也解決不了問題。

  

  3、搭建流程

      a、引用

        

        

        都能搜索到,搜索不到就打全。

?

      b、編寫跨語言服務文件(.proto),內(nèi)容如下

syntax = "proto3";

package gRPCDemo;

service gRPC {

? rpc SayHello (HelloRequest) returns (HelloReply) {}

}


message HelloRequest {

? string name = 1;

}


message HelloReply {

? string message = 1;

}

      c、這時開始用到了tools, 敲命令:

        首先你的路徑能識別下面兩個exe,如果不能,就搜索這兩個exe,我當時就沒找到,用everthing搜索,然后復制粘貼。

        命令:protoc.exe -I GrpcConsole --csharp_out GrpcConsole GrpcConsole\helloworld.proto --grpc_out GrpcConsole?--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe

        對,你找文章都這一長串,demo也是,運行時候各種報錯,神特么煩,也不跟你細說選項作用,注意事項。

        這里就詳細說一下:

          ①、?-I 指定一個或者多個目錄,用來搜索.proto文件的。所以上面那行的GrpcConsole\helloworld.proto 已經(jīng)可以換成helloworld.proto了,因為-I已經(jīng)指定了。注意:如果不指定,那就是當前目錄,沒毛病。

          ②、--csharp_out 生成C#代碼,當然了還能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 這時候你就應該知道,這玩意就是支持多語言的,才用的,生成一些文件,然后給各個語言平臺調用。參數(shù)1是輸出路徑,參數(shù)2是proto的文件名或者路徑。?

          ③、--grpc_out 到這里可能有人會懵逼,咋回事?C#不是有一個自己的輸出目錄么?怎么又一個輸出? ?

            csharp_out是輸出類似于咱們平時寫的實體類,接口,定義之類的。生成的文件叫,額,就叫xxx.cs吧.

            grpc_out是跟服務相關,創(chuàng)建,調用,綁定,實現(xiàn)相關。生成的玩意叫xxxGrpc.cs。 對比上個選項生成的文件名,大概能了解個十之八九吧。

          ④、--plugin=protoc-gen-grpc=grpc_csharp_plugin.exe 這個就是csharp的插件,python有python的,java有java的。你不指定它,你毛都生成不了。

?

      d、開發(fā)

          請允許我做被悲傷、絕望地砸鍵盤動作,你忙活了那么久,現(xiàn)在剛剛進入開發(fā)階段,具體的,自己個去看官方demo. ?畢竟本文重點并不是這貨。

?

0x02、MagicOnion

  1、介紹

     ?首先這里聲明一點,技術無國界。

      MagicOnion 是一位來自日本的 CTO (目前就職于Grani游戲公司), UniRx、MsgPack序列化CSharp實現(xiàn)的作者,連續(xù)...反正好多年的MVP(從2011年開始),叫Yoshifumi Kawai ?(咋這么像‘卡哇伊’??)。作品集:https://github.com/neuecc。

      MagicOnion是對Grpc的封裝,并且采用了MessagePack序列化技術,提高性能,隨后支持了SwaggerUI。

      MessagePack (msgPack)是很早之前的一個序列化技術,各文章媒體介紹說比json快10倍,之前關注過,json這兩年的勢頭太猛了。 MessagePack-CSharp 去年(2017年)開始浮出水面的,實測比json.net序列化快很多很多,不是一個數(shù)量級,這里我就不談protobuf和mesasgepack的差別了,因為我可能寫了假代碼(他的readme說MessagePack比protobuf效率要高,我測protobuf序列化性能比他要高)。

      Swagger, 必應一大把。

      MIT協(xié)議,寫著放心,用著舒心。

?

  2、吐槽

      兩個月沒更新了,Github上有灰。

?

  3、普通C/S框架搭建流程

      ?a、Nuget上搜MagicOnion,下載安裝。

      b、非常非常重要的接口,你不得不寫的接口,這個接口服務端和客戶端都要定義。

      

1   //不管你在哪里寫,反正服務端和客戶端都要寫,對!要么引用,要么寫一模一樣的。 2   //你能看懂的那都是你寫的。 3   //你看不懂的都是它庫里自帶的,比如IService,UnaryResult<>。 4   public interface IHello : IService<IHello> 5   { 6     UnaryResult<string> Hello(string name); 7   } 8   public interface IWorld : IService<IWorld> 9   {10     UnaryResult<string> World(string name);11   }12 15 16    //不管你在哪寫,反正服務端需要實現(xiàn),客戶端遠程調用接口的時候走的就是這方法17 public class HelloServices : ServiceBase<IHello>, IHello18 {19 public UnaryResult<string> Hello(string name)20 {21 return new UnaryResult<string>($"hello {name}");22 }23 }24 public class WorldServices : ServiceBase<IWorld>, IWorld25 {26 public UnaryResult<string> World(string name)27 {28 return new UnaryResult<string>($"This is {name}'s world!");29 }30 }  

      c、編寫客戶端和服務端,簡單到我不好意思貼代碼,貼圖吧

      

      

      各位老鐵,這代碼能看懂吧?沒毛病。流傳輸去官網(wǎng)下看Readme的例子,也挺容易。

?

  4、集成在Web中,做成接口。

      a、引用

        MagicOnion.HttpGateway (其中包含了MagicOnion、Asp.net core 中間件擴展、Json.net、MagicOnion.HttpGetway)

        Swashbuckle.AspNetCore

?      b、有了第3個C/S的基礎,那么你就可以繼續(xù)干了。寫你的接口,并且配上注釋,因為Swagger要用!

        ReturnResult是我自己定義的返回值,跟這些庫無關,你隨便寫。

        

      c、寫你的代碼,實體類,要支持MessagePack序列化,打個標簽。

        

      d、其他的工作(都隨你便)

        

      

public class Test :ServiceBase<ITest>, ITest{ public UnaryResult<ReturnResult> GetStudent(int sid){ //GetStudentBySidFromDatabase(sid) ? ? ? ? ? ?//GetModelStudent student;student.Name = "Test_小明";student.Sid = sid; //FillResultReturnResult result = new ReturnResult() {Data = student,Status = 0}; //Returnreturn UnaryResult(result);}}

        這是是實現(xiàn)你定義的接口,你想返回啥都行,讀數(shù)據(jù)庫,讀緩存都隨便你,我就是簡單寫個例子。

      e、然后就是添加服務,你這個rpc是作為服務集成在web中的。

      

public void ConfigureServices(IServiceCollection services){ //這代碼跟咱們之前定義服務的那個代碼一個樣子var service = MagicOnionEngine.BuildServerServiceDefinition(new MagicOnionOptions(true){MagicOnionLogger = new MagicOnionLogToGrpcLogger()}); var server = new Server{Services = { service },Ports = { new ServerPort("localhost", 8800, ServerCredentials.Insecure) }}; //這里開始不同,你要把注釋生成到xml里給swagger,這里是swagger的用法,看不懂去學swaggerservices.AddSwaggerGen(c =>{ var filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "Swagger.xml");c.IncludeXmlComments(filePath);});server.Start(); //這里添加服務services.Add(new ServiceDescriptor(typeof(MagicOnionServiceDefinition), service));services.AddMvc();}

      f、配置,各種配置。

     public void Configure(IApplicationBuilder app, IHostingEnvironment env){ //獲取添加了的服務var magicOnion = app.ApplicationServices.GetService<MagicOnionServiceDefinition>(); //使用MagicOnion的Swagger擴展,就是讓你的rpc接口也能在swagger頁面上顯示 ? ? ? ? ? ?//下面這些東西你可能乍一看就懵逼,但你看到頁面的時候就會發(fā)現(xiàn),一個蘿卜一個坑。 ? ? ? ? ? ?//注意:swagger原生用法屬性都是大寫的,這里是小寫。app.UseMagicOnionSwagger(magicOnion.MethodHandlers, new SwaggerOptions("MagicOnion.Server", "Swagger Integration Test", "/"){Info = new Info(){title = "MGrpc",version = "v1",description = "This is the API-Interface for MGrpc",termsOfService = "By NMS",contact = new Contact{name = "LanX",email = "2765968624@qq.com"}}, //使用Swagger生成的xml,就是你接口的注釋XmlDocumentPath = PlatformServices.Default.Application.ApplicationBasePath + "Swagger.xml"}); //要想讓rpc成為該web服務的接口,流量和協(xié)議被統(tǒng)一到你寫的這個web項目中來,那么就要用個方法鏈接你和rpc ? ? ? ? ? ?//這個web項目承接你的請求,然后web去調用rpc獲取結果,再返回給你。 ? ? ? ? ? ?//因此需要下面這句話app.UseMagicOnionHttpGateway(magicOnion.MethodHandlers, new Channel("localhost:8800", ChannelCredentials.Insecure));
  
       if (env.IsDevelopment()){app.UseDeveloperExceptionPage();} //以下是swagger的用法,不贅述app.UseSwagger(c =>{c.RouteTemplate = "swagger/{documentName}/swagger.json";});app.UseSwaggerUI(c =>{c.SwaggerEndpoint("/swagger/v1/swagger.json", "API-v1");c.ShowJsonEditor();c.ShowRequestHeaders();});app.UseSwagger();app.UseMvc();}

   5、成果:


      

?

0x03、窺視你的通信過程

    1、抓包查看它們的通信過程,裝Wireshark, 但是它不抓本地包,只抓網(wǎng)卡的,本地環(huán)回地址實際上是走的是操作系統(tǒng)內(nèi)部,跟網(wǎng)卡無關,因此需要借助一個工具,Npcap,下載頁面https://nmap.org/npcap/#download,文章中間有下載的地方。某些人會留意到神器Nmap,吊得一比。裝完之后你的Wireshark會多一個接口,本地接口,然后你就偵聽吧,過濾語句:http || tcp.port == 8800,復制粘貼就是干。

  效果:

    
      
      
      交互過程以及三次握爪
      
      發(fā)送數(shù)據(jù),可靠傳輸
      

0x04、廣告時間
    

0x05、結束
     
     

    
感謝各位老鐵能堅持看完,沒有彩蛋,拜拜~

原文地址:https://www.cnblogs.com/nmslanx/articles/8242105.html


.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的入门干货之Grpc的.Net 封装-MagicOnion的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。