0x01、Grpc

  1、介绍

Google主导开发的RPC框架,使用HTTP/2协议并用ProtoBuf作为序列化工具,支持多种语言。在.NET Core “大更新” 之前,也就是目前来说还算是个很不错的选择。

  

  2、吐槽

      a、有很多性能比较的文章拿Grpc开涮.

      b、搭建困难,恶心,复杂,反胃,有点吃不消,吃吗丁啉不一定好使,砸键盘也解决不了问题。

  

  3、搭建流程

      a、引用

        

        

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

      b、编写跨语言服务文件(.proto),内容如下

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 已经可以换成helloworld.proto了,因为-I已经指定了。注意:如果不指定,那就是当前目录,没毛病。

          ②、--csharp_out 生成C#代码,当然了还能cpp_out、java_out、javanano_out、js_out、objc_out、php_out、python_out、ruby_out 这时候你就应该知道,这玩意就是支持多语言的,才用的,生成一些文件,然后给各个语言平台调用。参数1是输出路径,参数2是proto的文件名或者路径。

          ③、--grpc_out 到这里可能有人会懵逼,咋回事?C#不是有一个自己的输出目录么?怎么又一个输出?

            csharp_out是输出类似于咱们平时写的实体类,接口,定义之类的。生成的文件叫,额,就叫xxx.cs吧.

            grpc_out是跟服务相关,创建,调用,绑定,实现相关。生成的玩意叫xxxGrpc.cs。 对比上个选项生成的文件名,大概能了解个十之八九吧。

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

      d、开发

          请允许我做被悲伤、绝望地砸键盘动作,你忙活了那么久,现在刚刚进入开发阶段,具体的,自己个去看官方demo.  毕竟本文重点并不是这货。

0x02、MagicOnion

  1、介绍

      首先这里声明一点,技术无国界。

      MagicOnion 是一位来自日本的 CTO (目前就职于Grani游戏公司), UniRx、MsgPack序列化CSharp实现的作者,连续...反正好多年的MVP(从2011年开始),叫Yoshifumi Kawai ?(咋这么像‘卡哇伊’??)。作品集:https://github.com/neuecc。

      MagicOnion是对Grpc的封装,并且采用了MessagePack序列化技术,提高性能,随后支持了SwaggerUI。

      MessagePack (msgPack)是很早之前的一个序列化技术,各文章媒体介绍说比json快10倍,之前关注过,json这两年的势头太猛了。 MessagePack-CSharp 去年(2017年)开始浮出水面的,实测比json.net序列化快很多很多,不是一个数量级,这里我就不谈protobuf和mesasgepack的差别了,因为我可能写了假代码(他的readme说MessagePack比protobuf效率要高,我测protobuf序列化性能比他要高)。

      Swagger, 必应一大把。

      MIT协议,写着放心,用着舒心。

  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    //不管你在哪写,反正服务端需要实现,客户端远程调用接口的时候走的就是这方法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、编写客户端和服务端,简单到我不好意思贴代码,贴图吧

      

      

      各位老铁,这代码能看懂吧?没毛病。流传输去官网下看Readme的例子,也挺容易。

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

      a、引用

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

        Swashbuckle.AspNetCore

      b、有了第3个C/S的基础,那么你就可以继续干了。写你的接口,并且配上注释,因为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);}}

        这是是实现你定义的接口,你想返回啥都行,读数据库,读缓存都随便你,我就是简单写个例子。

      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页面上显示            //下面这些东西你可能乍一看就懵逼,但你看到页面的时候就会发现,一个萝卜一个坑。            //注意: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服务的接口,流量和协议被统一到你写的这个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, 但是它不抓本地包,只抓网卡的,本地环回地址实际上是走的是操作系统内部,跟网卡无关,因此需要借助一个工具,Npcap,下载页面https://nmap.org/npcap/#download,文章中间有下载的地方。某些人会留意到神器Nmap,吊得一比。装完之后你的Wireshark会多一个接口,本地接口,然后你就侦听吧,过滤语句:http || tcp.port == 8800,复制粘贴就是干。

  效果:

                       交互过程以及三次握爪            发送数据,可靠传输      

0x04、广告时间     

0x05、结束              感谢各位老铁能坚持看完,没有彩蛋,拜拜~

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


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

入门干货之Grpc的.Net 封装-MagicOnion相关推荐

  1. hibernate入门干货

    @hibernate入门干货 一.Hibernate基础知识 纯干货,没有任何添加素 1.什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对 JDBC进行了非常轻量 ...

  2. MyBatis-Plus快速入门-(干货满满+超详细)

    文章目录 一.MyBatis VS JPA 二.MyBatis-Plus简介 三.MyBatis-Plus快速入门 1.lombok简介及安装 2.入门小案例 四.基本使用 1.通用传统模式简介及通用 ...

  3. Scrapy从入门到精通(3)--使用Item封装数据

    使用Item封装数据 前两篇博客介绍了从页面中提取数据的方法,现在用item封装爬取到的数据 Item和Field Scrapy提供了Item和Field类,可以用他们自定义数据类,封装爬取到的数据 ...

  4. 史上最强超融合入门干货:超融合与传统架构特性及收益详细对比

    在IT基础架构领域工作有十年了,亲眼目睹和参与了上一代网络存储架构在中国的兴起和衰败.的确,新IT浪潮已经到来,超融合就是诸多风口之一,成为了近几年IT业界备受关注的话题.虽然超融合这个概念已经被厂商 ...

  5. springMVC_day01_概念_入门_@RequestMapping注解_参数封装与绑定_编码过滤器

    文章目录 一.知识回顾 二.三层架构和MVC设计模式 三.springMVC的概念 四.SpringMVC的HelloWorld(重点) 1.引入依赖 2.spring-mvc.xml配置 3.web ...

  6. JDK8函数式编程快速入门干货

    Java8引入函数式编程,极大地提高了编码效率,对于习惯了原有Java代码风格的coder,确实需要好好熟悉一番才能熟练地coding. 本文每一条讲解都配置了最简短的代码,适合快速入门或者字典使用, ...

  7. Android ---facebook/litho框架 超实用的入门干货

    可能很多人不知道litho是什么,我这里简单说一下litho就是用代码写布局.嗯,就是那么简单.或许你会问为什么用代码来写呢 我 xml用的挺好也方便,至于这些问题 我都不会回答(坏笑) 说了是干货所 ...

  8. 入门干货之Electron的.NET实现-Electron.NET

    0x01.Electron.NET 1.介绍 Electron是由Github上的一支团队和一群活跃贡献者维护.用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Elec ...

  9. java 在已有的so基础上封装jni_[干货]再见,Android JNI 封装

    1 前言 2 JNI 速查表 2.1 Java 和 Native 数据类型映射表 2.2 引用类型 3 JNI 理论基础速览 4 JNI 常用场景示例 4.1 字符串传递(java->nativ ...

最新文章

  1. 交互两个数(不引入第三个变量)
  2. 子网掩码 以及 子网数为什么减去全0和全1
  3. App Store 申请审核加速
  4. 2021年春季学期-信号与系统-第七次作业参考答案-第四小题
  5. Docker:容器的四种网络类型 [十三]
  6. 【C++提高班】c++数组遍历比较相邻的数值
  7. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
  8. java 8 biconsumcr_java8新特性
  9. JavaScript学习(三十三)—事件对象常用的属性和方法
  10. html弹幕效果加入视频,JS实现的视频弹幕效果示例
  11. 深度学习笔记_损失函数softmax和SVM
  12. 安卓第十三天笔记-服务(Service)
  13. 计算机网络谢希仁课后答案第七版答案完整版
  14. ubuntu安装aircrack-ng/reaver/minidwep-gtk用来跑pin
  15. 杭州SEO:独家揭秘网站首页排版布局的详细方法!
  16. 交互式绘图软件源码开发,简单好用功能强大的绘图工具
  17. 自然辩证法小论文选题_新颖的自然辩证法论文题目 自然辩证法论文题目哪个好...
  18. 霍华德大学计算机科学,霍华德大学有哪些专业
  19. 最终结束漂泊的身份-我办理北京人才引进的经历
  20. 修改服务器的ip地址的命令,使用命令提示符更改IP地址和DNS服务器 | MOS86

热门文章

  1. Jenkins入门系列之——03PDF文档下载
  2. ios下划线变量:为什么变量前要加下划线才有用?
  3. 分布式拒绝服务攻击(DDoS)原理及防范
  4. xen虚拟机管理xm的用法
  5. FZU Problem 2030 括号问题
  6. 如何使用windbg查看C#某个线程的栈大小 ?
  7. PowerToys插件扩展(类似Alfred)
  8. 微软 Ignite 大会 PowerBI 划重点
  9. MySQL从原理到实践,一篇从头到尾讲清楚
  10. 叮咚!你有一份来自明源云的圣诞邀约