.net core consul grpc--系统服务RPC实现通信(一)
.net core grpc 系统服务实现通信(一)
现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端、服务端通信。
grpc(https://grpc.io/)是google发布的一个开源、高性能、通用RPC(Remote Procedure Call)框架,使用HTTP/2协议,支持多路复用,并用ProtoBuf作为序列化工具,提供跨语言、跨平台支持。下面以.net core演示如何使用grpc框架实现通信。
软件版本
.net core:2.0
grpc:1.11.0
项目结构
InstallGrpc .net framework类库 只为得到生成协议代码工具protoc.exe、grpc_csharp_plugin.exe,没有其他作用,如果已有工具,可以不用
Snai.GrpcClient 客户端 .net core 2.0控制台程序
Snai.GrpcService.Hosting 服务端宿主 .net core 2.0控制台程序
Snai.GrpcService.Impl 协议方法实现 .net standard 2.0类库
Snai.GrpcService.Protocol 生成协议方法 .net standard 2.0类库
运行结果
服务端
客户端
客户端调用服务端求和方法成功。
项目实现
一、服务端
新建Snai.GrpcService解决方案
1、编写协议
新建 Snai.GrpcService.Protocol协议类库项目,在 依赖项 右击 管理NuGet程序包 浏览 找到 Grpc.Core 版本1.11.0,Google.Protobuf 版本3.5.1 包下载安装
在项目根目录下新建一个 msg.proto 文件,打开 msg.proto 文件,在其中编写基于proto3语言的协议代码,用于自动生成到各语言协议,如果需要更深入的学习proto3语言可以打开该网站Proto3语言指南。msg.proto 代码如下
定义当前使用的是proto3语言并且包名(生成为C#则为命名空间):
- syntax = "proto3";
- package Snai.GrpcService.Protocol;
定义了1个服务,且有1个方法:
- service MsgService{
rpc GetSum(GetMsgNumRequest) returns (GetMsgSumReply){}
}
方法的接收参数和返回参数

- message GetMsgNumRequest {
int32 Num1 = 1;
int32 Num2 = 2;
}- message GetMsgSumReply {
int32 Sum = 1;
}

2、将协议生成C#代码
生成协议代码需 protoc.exe、grpc_csharp_plugin.exe工具,在.net framework 项目下引用安装 Grpc.Tools 组件程序包,会得到protoc.exe、grpc_csharp_plugin.exe,但.net core 项目引用安装是不会下载工具到项目目录的,所以我们需要建一个.net framework项目,我建了个 InstallGrpc .net framework类库 用于引用安装得到工具。
这里得到工具有个小插曲,引用Grpc.Tools版本1.11.0得到protoc.exe、grpc_csharp_plugin.exe 拷到 Snai.GrpcService.Protocol 目录下生成不了,我再引用Google.Protobuf.Tools版本3.5.1里面有 protoc.exe,用 Grpc.Tools下的 grpc_csharp_plugin.exe, Google.Protobuf.Tools下protoc.exe 根据当前系统选择,拷贝到 Snai.GrpcService.Protocol 目录下。
先用Grpc.Tools 下的,如果生成不了,再用 Grpc.Tools下的 grpc_csharp_plugin.exe, Google.Protobuf.Tools下protoc.exe
然后在项目中新建一个名为ProtocGenerate.cmd的文件,在其中输入以下指令:
- protoc -I . --csharp_out . --grpc_out . --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe msg.proto
然后直接双击运行,项目下生成了“Msg.cs”和“MsgGrpc.cs”两个文件,这样协议部分的所有工作就完成了,最终项目结构如下:
3、编写协议实现代码
新建Snai.GrpcService.Impl实现类库项目,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol
在项目根目录下新建 MsgServiceImpl.cs 类文件,继承 MsgService.MsgServiceBase 协议类,实现服务方法,代码如下:

- using Grpc.Core;
using Snai.GrpcService.Protocol;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;- namespace Snai.GrpcService.Impl
{
public class MsgServiceImpl: MsgService.MsgServiceBase
{
public MsgServiceImpl()
{
}- public override async Task<GetMsgSumReply> GetSum(GetMsgNumRequest request, ServerCallContext context)
{
var result = new GetMsgSumReply();- result.Sum = request.Num1 + request.Num2;
- return result;
}
}
}

在项目根目录下新建 RpcConfig.cs 类文件,编写绑定服务到服务端,服务端 地址 端口 等信息,实现启动方法,代码如下:

- using Grpc.Core;
using Snai.GrpcService.Protocol;
using System;
using System.Collections.Generic;
using System.Text;- namespace Snai.GrpcService.Impl
{
public static class RpcConfig
{
private static Server _server;- public static void Start()
{
_server = new Server
{
Services = { MsgService.BindService(new MsgServiceImpl()) },
Ports = { new ServerPort("localhost", 40001, ServerCredentials.Insecure) }
};
_server.Start();- Console.WriteLine("grpc ServerListening On Port 40001");
Console.WriteLine("任意键退出...");
Console.ReadKey();- _server?.ShutdownAsync().Wait();
}
}
}

最终项目结构如下:
aaarticlea/png;base64,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" alt="" />
4、编写服务端启动程序
新建Snai.GrpcService.Hosting 控制台程序,项目引用Snai.GrpcService.Impl
打开 Program.cs 文件,修改 Main 方法,加入服务启动,代码如下:

- using Snai.GrpcService.Impl;
using System;- namespace Snai.GrpcService.Hosting
{
class Program
{
static void Main(string[] args)
{
RpcConfig.Start();
}
}
}

最终项目结构如下:
到此服务端所有代码已编写完成,下面开始编写客户端。
二、客户端
新建Snai.GrpcClient 控制台程序,在 依赖项 下载安装Grpc.Core 包,项目引用Snai.GrpcService.Protocol
在项目根目录下新建 MsgServiceClient.cs 类文件,编写与服务端通信的 地址 端口 等信息,并调用服务端方法,代码如下:

- using Grpc.Core;
using Snai.GrpcService.Protocol;
using System;
using System.Collections.Generic;
using System.Text;- namespace Snai.GrpcClient
{
public static class MsgServiceClient
{
private static Channel _channel;
private static MsgService.MsgServiceClient _client;- static MsgServiceClient()
{
_channel = new Channel("127.0.0.1:40001", ChannelCredentials.Insecure);
_client = new MsgService.MsgServiceClient(_channel);
}- public static GetMsgSumReply GetSum(int num1, int num2)
{
return _client.GetSum(new GetMsgNumRequest
{
Num1 = num1,
Num2 = num2
});
}
}
}

打开 Program.cs 文件,修改 Main 方法,得到服务端返回结果,显示结果,代码如下:

- using Snai.GrpcService.Protocol;
using System;- namespace Snai.GrpcClient
{
class Program
{
static void Main(string[] args)
{
GetMsgSumReply msgSum = MsgServiceClient.GetSum(10, 2);- Console.WriteLine("grpc Client Call GetSum():" + msgSum.Sum);
- Console.WriteLine("任意键退出...");
Console.ReadKey();
}
}
}

最终项目结构如下:
到此所有代码都已编写完成
三、启动
右击生成解决方案,生成完成后,先启动服务端,再启动客户端
命令行到服务端目录 Snai.GrpcService.Hosting\bin\Debug\netcoreapp2.0\,用命令 dotnet Snai.GrpcService.Hosting.dll 启动服务端
命令行到客户端目录 Snai.GrpcClient\bin\Debug\netcoreapp2.0\,用命令 dotnet Snai.GrpcClient.dll 启动客户端
客户端调用服务端方法成功,实现grpc
它们之间是通过Grpc.Core中的 Server 和 Channel 来通信
源码访问地址:https://github.com/Liu-Alan/Snai.GrpcService
.net core consul grpc--系统服务RPC实现通信(一)的更多相关文章
- .NET Core使用gRPC打造服务间通信基础设施
一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...
- dotnet core 之 gRPC
dotnet core gRPC 原文在本人公众号中,欢迎关注我,时不时的会分享一些心得 HTTP和RPC是现代微服务架构中很常用的数据传输方式,两者有很多相似之处,但是又有很大的不同.HTTP是一种 ...
- 使用gRPC打造服务间通信基础设施
一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制. 利用这种传输机制,不同进程(或服务)间像调用本地进程中 ...
- 使用 ASP.NET Core 的 gRPC 服务
将 gRPC 服务添加到 ASP.NET Core 应用 gRPC 需要gRPC包. 配置 gRPC 在 Startup.cs 中: gRPC 是通过AddGrpc方法启用的. 每个 gRPC 服务通 ...
- (转)微服务_.NET Core Consul服务发现与治理
原文地址:https://www.cnblogs.com/waynechan/p/9354909.html Consul官网:https://www.consul.io Consul下载地址:http ...
- HDC 2021 | HMS Core 6.0:连接与通信论坛,为App打造全场景连接体验
如何在弱网环境下让用户享受无中断沉浸体验? 如何在全场景互联中让多设备交互如丝般顺滑? 如何在无网区域让移动终端发出紧急求助信息? 连接无处不在,连接与体验息息相关!流畅的网络体验已成为应用开发的关键 ...
- .net core中Grpc使用报错:The remote certificate is invalid according to the validation procedure.
因为Grpc采用HTTP/2作为通信协议,默认采用LTS/SSL加密方式传输,比如使用.net core启动一个服务端(被调用方)时: public static IHostBuilder Creat ...
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...
- 解决go-micro与其它gRPC框架之间的通信问题
在之前的文章中分别介绍了使用gRPC官方插件和go-micro插件开发gRPC应用程序的方式,都能正常走通.不过当两者混合使用的时候,互相访问就成了问题.比如使用go-micro插件生成的gRPC客户 ...
随机推荐
- ajax常见的面试问题
1:什么是ajax?ajax作用是什么? 异步的javascript和xml AJAX 是一种用于创建快速动态网页的技术. ajax用来与后台交互 2:原生js ajax请求有几个步骤?分别是什么 / ...
- 变量和基本类型——复合类型,const限定符,处理类型
一.复合类型 复合类型是指基于其他类型定义的类型.C++语言有几种复合类型,包括引用和指针. 1.引用 引用并非对象,它只是为一个已存在的对象所起的另外一个名字. 除了以下2种情况,其他所有引用的类型 ...
- Struts2的基础知识
Struts2属于MVC框架 Struts2的优点: 1.侵入性低 2.提供了拦截器,可以利用拦截器进行AOP编程 3.提供了类型转换器 4.支持多种表示层技术:jsp,freeMarker,Vele ...
- RabbitMQ 队列、消息持久化
RabbitMQ的消息队列的持久化是一个很不错的功能,设置也非常简单.如下代码: 1.设置队列持久化(在声明队列的时候设置) channel.QueueDeclare(queue: "q.l ...
- 每天CSS学习之text-indent
text-indent是CSS的一个属性,其作用是定义首行文本的缩进.其值如下: 1.length:首行缩进固定的长度.默认值为0. 设置 首行缩进2em的长度. div{ width:300px; ...
- zabbix安装部署(server部分)
Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员. 今天开始研究下Zabbix,使 ...
- MII接口介绍(转)
1.简介 MII (Media Independent Interface(介质无关接口)或称为媒体独立接口,它是IEEE-802.3定义的以太网行业标准.它包括一个数据接口和一个MAC和PHY之间的 ...
- Android开发 ---如何操作资源目录中的资源文件2
Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...
- git中误删提交(commit)后,怎么恢复
“xml文件存储数据”提交被我误操作,即使用reset --hard删除了,然后又进行了三次提交,发现删除的提交有用,需要找回来, 于是找了好久,找到好方法: 1.进入工程下的.git文件下,git ...
- mybatis 配置文件 配置别名
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC &q ...