简介

grpc是由google公司开发的一个高性能、开源和通用的RPC框架,采用HTTP/2通信。

1.gRPC的传输使用http/2支持双向流。

2.支持多语言,例如java、go、php、net、node等多种语言.

3.gRPC支持多平台

4.性能好,效率高

1.HTTP/2

HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。

使用

以下演示基于netcore2.2进行创建运行

  运行前准备

因为netcore不会生成依赖包,所以需要先新建一个net framework的类库程序把需要用到的文件下载来

1.新建net framework程序并且安装grpc.tools 

2.安装成功之后项目文件夹里会生成一个packages文件,在这里找到我们所需要的工具(x86还64请根据自己电脑自行选择)

1.环境准备

  •   GrpcClient   命令行程序
  •   GrpcLibray  类库程序
  •   GrpcServer 命令行程序

 

2.安装项目依赖

GrpcClient和GrpcLibray和GrpcServer 都需要安装通用的插件

install-package Grpc
install-package Goole.Protobuf

 3.在GrpcLibray程序当中把前面我们用netframework添加的exe文件添加到该项目当中

4.添加命令行用来生成供其他程序调用的代码(hello.cmd)

protoc -I . --csharp_out ./server --grpc_out ./server --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe hello.proto

5.编写接口服务(hello.proto)

syntax = "proto3";
package GrpcLibrary;
service HelloService{ rpc GetSum(GetMsgNumRequest) returns (GetMsgSumReply){}; rpc test(GetLotID)returns(GetLotAll){};
}
message GetMsgNumRequest { int32 Num1 = ; int32 Num2 = ;}
message GetMsgSumReply { int32 Sum = ;} message GetLotID{int32 Num1=;string s=;} message GetLotAll{
enum Lists{
mes=;
wip=;
eap=;
dcs=;
}
Lists t=; repeated UserList user=;
} message UserList{
string userName=;
string pwd=;
}

6.在GrpcServer当中引用GrpcLibrary,并且重写定义的方法

using Grpc.Core;
using GrpcLibrary;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace GrpcServer
{
class Program
{
public class GrpcImpl : HelloService.HelloServiceBase
{ public override async Task<GetMsgSumReply> GetSum(GetMsgNumRequest request, ServerCallContext context)
{
var result = new GetMsgSumReply(); result.Sum = request.Num1 + request.Num2; return result;
}
public override async Task<GetLotAll> test(GetLotID request, ServerCallContext context)
{
var result = new GetLotAll();
string s = "这里一共有:";
if (request.Num1 == )
{
s += "1个字符";
}
s += request.S; UserList userList = new UserList();
userList.UserName = "张三";
result.User.Add(userList); List<UserList> userLists = new List<UserList>();
result.User.AddRange(userLists);
result.T = GetLotAll.Types.Lists.Wip;
return result;
} }
private static Server _server;
static void Main(string[] args)
{
_server = new Server {
Services = {HelloService.BindService(new GrpcImpl()) },
Ports = { new ServerPort("localhost",,ServerCredentials.Insecure)}
};
_server.Start();
Console.WriteLine("grpc ServerListening On Port 8088");
Console.WriteLine("任意键退出...");
Console.ReadKey(); _server?.ShutdownAsync().Wait(); }
}
}

7.grpcClient客户端也需要引用GrpcLibrary

using Grpc.Core;
using GrpcLibrary;
using System;
using System.Collections.Generic;
using System.Text; namespace GrpcClient
{
public static class HelloClient
{
private static Channel _channel;
private static HelloService.HelloServiceClient _client; static HelloClient()
{
_channel = new Channel("localhost:8088",ChannelCredentials.Insecure);
_client = new HelloService.HelloServiceClient(_channel);
}
public static GetMsgSumReply getSum(int num1, int num2)
{
return _client.GetSum(new GetMsgNumRequest { Num1=num1,Num2=num2});
}
public static GetLotAll GetLotAll(int num1, string s)
{
return _client.test(new GetLotID { Num1 = num1, S = s });
}
}
}

 8.客户端调用

using GrpcLibrary;
using System; namespace GrpcClient
{
class Program
{
static void Main(string[] args)
{ GetMsgSumReply helloMsg = HelloClient.getSum(,) ; GetLotAll getLotAll = HelloClient.GetLotAll(, "我是老哈哈哈哈");
Console.WriteLine("grpc Client Call GetSum():" + helloMsg.Sum);
string user = string.Empty;
foreach (var item in getLotAll.User)
{
user += item;
}
Console.WriteLine("grpc Client Call GetLotAll():" + user);
Console.WriteLine("任意键退出...");
Console.ReadKey();
}
}
}

运行如下图所示,先运行服务器端,在运行客户端

源码地址:https://github.com/zhengyazhao/grpc.git

netcore中使用grpc的更多相关文章

  1. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  2. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

  3. C#中使用gRPC

    C#中使用gRPC 我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目 ...

  4. 初识google多语言通信框架gRPC系列(三)C#中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  5. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  6. AutoMapper在asp.netcore中的使用

    # AutoMapper在asp.netcore中的使用  automapper 是.net 项目中针对模型之间转换映射的一个很好用的工具,不仅提高了开发的效率还使代码更加简洁,当然也是开源的,htt ...

  7. netcore中的缓存介绍

    Cache(缓存)是优化web应用的常用方法,缓存存放在服务端的内存中,被所有用户共享.由于Cache存放在服务器的内存中,所以用户获取缓存资源的速度远比从服务器硬盘中获取快,但是从资源占有的角度考虑 ...

  8. 在netcore中如何注入同一个接口的多个实现

    netcore中自带了Ioc框架,这也影响了我们的编码习惯,以前都是静态类或者直接new对象,现在有了Ioc框架的支持,我们也不必守旧,应当使用起来,接受这种对象管理方式.使用过java的同仁,都习惯 ...

  9. .NetCore中EFCore的使用整理(二)-关联表查询

    EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core  1.1 1.当前的版本,还不支持延迟加载(Lazy ...

随机推荐

  1. 自学_数据库<三>

    数据库 数据库概述 DBMS(DataBase Management System,数据库管理系统)和数据库.平时谈到"数据库"可能有两种含义:MSSQLServer.Oracle ...

  2. 关于mybtis 使用过程中发生There is no getter for property named 'id' in class 'java.lang.String' 错误

    今天在修改一个关于mybtis语句时,偶然发现的一个错误  There is no getter for property named 'id' in class 'java.lang.String' ...

  3. leaflet 实现克里金插值功能(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  4. Zimbra

    第一步:利用XXE读取配置文件 这里利用了CVE-2019-9670漏洞来读取配置文件,你需要在自己的VPS服务器上放置一个dtd文件,并使该文件能够通过HTTP访问.为了演示,我在GitHub上创建 ...

  5. 27-限制容器的 Block IO

    Block IO 是另一种可以限制容器使用的资源.Block IO 指的是磁盘的读写,docker 可通过设置权重.限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论. 注:目前 ...

  6. sso单点登录系统的压力测试

    环境:vmware centos7.4 2cpu 2核心 工具:ab压力测试工具 测试对象:sso单点登录系统 电脑:win10 4核 项目环境:flask+uwsgi+nginx(uwsgi 2进程 ...

  7. Java学习笔记(6)---正则表达式,方法

    1.正则表达式: a.定义: 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. 在Java,一个字符串其实就是一 ...

  8. goroutine并发之callback回调

    玩玩 package main import ( "fmt" "strings" "sync" ) var wait sync.WaitGr ...

  9. Java实战|Tomcat+Servlet+Sql开发简单网站,从配置环境开始

    课题描述: Java实验五 Servlet (继续使用实验四中创建的students数据库和其中的scores表) 使用Tomcat作为Web服务器和Servlet容器,使用SQL Server/My ...

  10. LEETCODE 1254 统计封闭岛屿的数目 Number of Closed Islands

    地址 https://leetcode-cn.com/contest/weekly-contest-162/problems/number-of-closed-islands/ 有一个二维矩阵 gri ...