此文章简单残暴,学习成本较低,你可以跟着我一起撸代码,一起吐槽,一起砸键盘。以下操作均为 core2.0 环境。

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 = ;
} message HelloReply {
string message = ;
}

    

      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、非常非常重要的接口,你不得不写的接口,这个接口服务端和客户端都要定义。

      

   //不管你在哪里写,反正服务端和客户端都要写,对!要么引用,要么写一模一样的。
  //你能看懂的那都是你写的。
  //你看不懂的都是它库里自带的,比如IService,UnaryResult<>。
  public interface IHello : IService<IHello>
  {
    UnaryResult<string> Hello(string name);
  }
  public interface IWorld : IService<IWorld>
  {
    UnaryResult<string> World(string name);
  }    //不管你在哪写,反正服务端需要实现,客户端远程调用接口的时候走的就是这方法
public class HelloServices : ServiceBase<IHello>, IHello
{
public UnaryResult<string> Hello(string name)
{
return new UnaryResult<string>($"hello {name}");
}
}
public class WorldServices : ServiceBase<IWorld>, IWorld
{
public UnaryResult<string> World(string name)
{
return new UnaryResult<string>($"This is {name}'s world!");
}
}  

      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)
//GetModel
Student student;
student.Name = "Test_小明";
student.Sid = sid; //FillResult
ReturnResult result = new ReturnResult() {
Data = student,
Status =
}; //Return
return 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", , ServerCredentials.Insecure) }
}; //这里开始不同,你要把注释生成到xml里给swagger,这里是swagger的用法,看不懂去学swagger
services.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、结束
     
     
    感谢各位老铁能坚持看完,没有彩蛋,拜拜~ [转载请注明出处]

入门干货之Grpc的.Net实现-MagicOnion的更多相关文章

  1. 入门干货之用DVG打造你的项目主页-Docfx、Vs、Github

    由于这三项技术涉及到的要点以及内容较多,希望大家有空能自己挖掘一下更多更深的用法. 0x01.介绍 VS,即VS2017以及以上版本,宇宙最好的IDE,集成了宇宙最有前景的平台,前阶段也支持了宇宙最好 ...

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

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

  3. Swoole引擎原理的快速入门干货

    更多内容,欢迎关注微信公众号:全菜工程师小辉~ 过去一年使用PHP和Java两种技术栈完成了一个游戏服务器项目.由于项目中有高频的网络请求,所以PHP技术栈尝试使用Swoole引擎(基于事件的高性能异 ...

  4. Vue入门干货,以及遇到的坑

    一.安装环境及Vue脚手架搭建 参考文档:https://www.jianshu.com/p/1626b8643676 二.开发文档 官方文档:https://cn.vuejs.org/v2/guid ...

  5. 史诗手册!微信小程序新手自学入门宝典!

    一.小程序官方指南 1:官方开发工具下载: https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=201714 0.12 ...

  6. grpc使用记录(二)简单同步服务实例

    目录 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 server.cpp 代码 编译 4.编写客户端代码 client.cpp代码 5.简单测试一下 已经折腾 ...

  7. 《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

  8. Python 3 入门,看这篇就够了(超全整理)

    史上最全Python资料汇总(长期更新).隔壁小孩都馋哭了 --- 点击领取 今天和大家分享的内容是Python入门干货,文章很长. 简介 Python 是一种高层次的结合了解释性.编译性.互动性和面 ...

  9. 跟我一起学Go系列:Go gRPC 安全认证机制-SSL/TLS认证

    Go gRPC 系列: 跟我一起学Go系列:gRPC 拦截器使用 跟我一起学Go系列:gRPC 入门必备 第一篇入门说过 gRPC 底层是基于 HTTP/2 协议的,HTTP 本身不带任何加密传输功能 ...

随机推荐

  1. 零基础学python-2.8 字典

    字典类型,事实上就是相当于java的map,通过key-value来记录数据,工作原理类似于哈希表 差点儿全部的python对象都能够作为key,可是一般最经常使用的还是数字和字符串 字典元素使用{} ...

  2. 基于 HTML5 Canvas 的 3D 机房创建

    对于 3D 机房来说,监控已经不是什么难事,不同的人有不同的做法,今天试着用 HT 写了一个基于 HTML5 的机房,发现果然 HT 简单好用.本例是将灯光.雾化以及 eye 的最大最小距离等等功能在 ...

  3. maven安装配置及使用maven创建一个web项目

    今天开始学习使用maven,现在把学习过程中的资料整理在这边. 第一部分.maven安装和配置. http://jingyan.baidu.com/article/295430f136e8e00c7e ...

  4. 深入理解计算机系统_3e 第三章家庭作业 CS:APP3e chapter 3 homework

    3.58 long decode2(long x, long y, long z) { int result = x * (y - z); if((y - z) & 1) result = ~ ...

  5. SQL_Server 常用语句以及语法整理

    下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE, ...

  6. 【正则表达式】匹配时间格式:hh:mm或h:m

    ^(0?[0-9]|1[0-9]|2[0-3]):(0?[0-9]|[1-5][0-9])$

  7. JavaWeb之Java Servlet完全教程(转)

    Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...

  8. bzoj 4872: [Shoi2017]分手是祝愿

    Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态 ...

  9. ElasticSearch 学习记录之如任何设计可扩容的索引结构

    扩容设计 扩容的单元 一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合 一个分片即为 扩容的单元 . 一个最小的索引拥有一个分片. 一个只有一个分片的索引 ...

  10. 前端MVC Vue2学习总结(五)——表单输入绑定、组件

    一.表单输入绑定 1.1.基础用法 你可以用 v-model 指令在表单控件元素上创建双向数据绑定.它会根据控件类型自动选取正确的方法来更新元素.尽管有些神奇,但 v-model 本质上不过是语法糖, ...