zoukankan      html  css  js  c++  java
  • GRPC在NET上的应用

    GRPC是什么?

    GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffers)序列化协议,主流语言都支持 主要是支持C#

    使用场景?

    实现客户端调用服务端方法并取返回值 GRPC可以实现跨语言的访问

    下面跟着官网文档开始干

    1)先了解下protobuf?

    Protocol Buffers是Google开源的一个语言无关、平台无关的通信协议,其小巧、高效和友好的兼容性设计,使其被广泛使用。

    2)VS2015下新建项目

    分别建立两个项目跟一个类库 分别代表着服务端 客户端  基础类库 

    3)引用dll

    需要使用NuGet下载安装 *并引用* Google.Protobuf   Grpc.Core   Grpc.Tools   网站项目需要共同Publicl类库

    4)定义服务 

    在Public类库新建文件夹命名为protos用来存放.proto文件,在文件夹下新建GetUser.proto文件 内容如下

    syntax = "proto3";
    
    option java_multiple_files = true;
    option java_package = "io.grpc.examples.Public";
    option java_outer_classname = "GetUserProto";
    option objc_class_prefix = "HLW";
    
    package Public;
    //定义的服务
    service GetUserList {
     rpc GetList(pharm) returns (Userlist) {}
    }
    //服务的参数
    message pharm {
      string name = 1;
    }
    
    //返回参数
    message Userlist {
    user userinfo=1;
    int32 no=2;
    }
    
    message user{
     string name=1;
     string detail=2;
    }
    

    5)生成代码

    生成代码需要使用官网提供的grpc_csharp_plugin.exe跟protoc.exe ,工具位置在 _你的项目>> packages>>Grpc.Tools.1.14.1>>tools>>windows_x64

    (也可在官网demo中找到 https://github.com/grpc/grpc)

    把两个exe跟刚建好的GetUser.proto放入同一个文件夹下 地址栏运行cmd

    执行命令如下:protoc.exe -I=. --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe GetUser.proto

    6)把cs文件剪切到Public类库下 ,目录结构如下

    7)建立服务端

    服务端重写定义的服务GetUserList  

    GrpcDemoWebServer项目->新建GetUserI.cs文件 代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Public;
    using Grpc.Core;
    using System.Threading.Tasks;
    
    namespace GrpcDemoWeb.Models
    {
        public class GetUserI:GetUserList.GetUserListBase
        {
            public override Task<Userlist> GetList(pharm request, ServerCallContext context)
            {
                var users = new user();
                users.Name = "姓名";
                users.Detail = "描述";
    //以下注意 不能将null值赋值给Userinfo
    return Task.FromResult(new Userlist { Userinfo= users, No=1 }); } } }

    在服务端Global.asax->Application_Start中启动服务 代码如下:

                const int Port = 50051;
                Server server = new Server
                {
    //重要,每次新建服务都需要在下方注册,否则会出现错误 【Status(StatusCode=Unimplemented,Detail="")】 Services
    = {   GetUserList.BindService(new GetUserI()) }, Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } }; server.Start(); //server.ShutdownAsync().Wait();

    8)建立客户端

    GRpcDemoWebClient-》新建控制器index->代码如下:

      public ActionResult Index()
            {
                //链接对应的服务端
                Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
                var result = new GetUserList.GetUserListClient(channel);
                //var client = new GetUser.GetUserClient(channel);
    
                //调用对应方法并传递参数
                var reply = result.GetList(new pharm {Name="1"});
                //var reply1 = client.GetFeature(new Point { Latitude = 111, Longitude = 222 });
                //等待计划完成
                channel.ShutdownAsync().Wait();
                //返回页面
                return Content(reply.Userinfo.Name);
            }

    9)IIS上部署两个项目 按顺序打开 1服务端 2打开客户端下/index 展示内容为“”姓名“”表示成功

    9)难点记录:

     还需要多加理解Protocolbuffers

     rpc流式传递

     原文地址:http://www.cnblogs.com/songjl/p/NETGRPC.html

     源码位置:https://github.com/MrsongJl/GRPCDEMO

  • 相关阅读:
    测 试 报 告模板
    浅谈如何设计自动化测试框架
    GET与POST类型接口
    测试用例设计总结
    Java OO知识总结
    Java基础知识总结
    MIT 6.824学习笔记3 Go语言并发解析
    Go语言_并发
    MIT 6.824学习笔记4 Lab1
    Leetcode Lect3 二分法总结
  • 原文地址:https://www.cnblogs.com/songjl/p/NETGRPC.html
Copyright © 2011-2022 走看看