.Net Core 3.0使用Grpc进行远程过程调用
因为.Net Core3.0已经把Grpc作为一等臣民了,作为爱好新技术的我,当然要尝鲜体验一下了,当然感觉是Grpc作为跨语言的产品做的相当好喽,比起Dubbo这种的,优势和劣势还是比较明显的。
我这里的环境是VS2019以及,Net Core3.0预览5版,.Net Core3.0预览SDK没有随着VS2019一同安装,如果大家想要体验的话,需要先安装.Net Core3.0的SDK,并在VS2019设置中开启.Net Core的预览才可以使用。

* .Net Core 3.0提供了Grpc的模板可以快速生成Grpc Server的模板代码,当然,我这里还是手动去创建项目。

⒈Server端
1.创建一个ASP.NET Core Web应用程序
2.引入依赖
Install-Package Grpc.AspNetCore.Server -pre
Install-Package Google.Protobuf
Install-Package Grpc.Tools
3.编写Proto文件
syntax = "proto3";
package Service;
service UserService{
rpc GetUserById (UserId) returns (User) {}
}
message UserId{
int32 id = 1;
}
message User{
int32 id = 1;
string username = 2;
string password = 3;
string phone = 4;
string email = 5;
}
4.编辑当前项目的csproj文件,配置Proto的生成策略
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup> <ItemGroup>
<Protobuf Include="Protos/*.proto" GrpcServices="Server" OutputDir="%(RelativeDir)" CompileOutputs="false" />
</ItemGroup> <ItemGroup>
<None Remove="Protos\user.proto" />
</ItemGroup> <ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.7.0" />
<PackageReference Include="Grpc.AspNetCore.Server" Version="0.1.20-pre1" />
<PackageReference Include="Grpc.Tools" Version="1.20.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0-preview5-19227-01" />
</ItemGroup> <ItemGroup>
<Protobuf Update="Protos\user.proto">
<OutputDir>%(RelativeDir)</OutputDir>
</Protobuf>
</ItemGroup> </Project>
5.编写服务的实现
using Grpc.Core;
using Microsoft.Extensions.Logging;
using Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace GrpcGreeter.Services
{
public class UserServiceImpl:UserService.UserServiceBase
{
public ILogger<UserServiceImpl> _logger;
public UserServiceImpl(ILogger<UserServiceImpl> logger)
{
this._logger = logger;
}
public static IList<User> users = new List<User>
{
new User
{ Id = ,Username = "fanqi",Password = "admin",Phone="",Email="fanqi@coreqi.cn"
},
new User
{
Id = ,Username = "gaoxing",Password="admin",Phone="",Email = "gaoxing@coreqi.cn"
}
};
public override Task<User> GetUserById(UserId request, ServerCallContext context)
{
var httpContext = context.GetHttpContext(); //我没有用到httpContext
_logger.LogInformation("成功调用");
User user = users.FirstOrDefault(f => f.Id == request.Id);
return Task.FromResult(user);
}
}
}
⒍在Startup中配置Grpc
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using GrpcGreeter.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; namespace GrpcGreeterServer
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseRouting(); app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<UserServiceImpl>();
});
}
}
}
7.在launchSettings.json中配置Grpc
{
"profiles": {
"GrpcGreeter": {
"commandName": "Project",
"launchBrowser": false,
"applicationUrl": "http://localhost:50051",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
8.在appsettings.json中配置Grpc
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
⒉Client端
1.创建一个ASP.NET Core Web应用程序
2.引入依赖
Install-Package Grpc.Core
Install-Package Google.Protobuf
Install-Package Grpc.Tools
3.将Server的Proto文件复制到Client项目中来
4.编辑当前项目的csproj文件,配置Proto的生成策略
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup> <ItemGroup>
<None Remove="Protos\greet.proto" />
<None Remove="Protos\user.proto" />
</ItemGroup> <ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<OutputDir>%(RelativeDir)</OutputDir>
<CompileOutputs>false</CompileOutputs>
<Generator>MSBuild:Compile</Generator>
</Protobuf>
<Protobuf Include="Protos\user.proto" GrpcServices="Client">
<OutputDir>%(RelativeDir)</OutputDir>
<CompileOutputs>false</CompileOutputs>
</Protobuf>
</ItemGroup> <ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.7.0" />
<PackageReference Include="Grpc.Core" Version="1.20.1" />
<PackageReference Include="Grpc.Tools" Version="1.20.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0-preview5-19227-01" />
</ItemGroup> </Project>
5.在代码中使用Grpc
public async Task<IActionResult> Index()
{
var channel = new Channel("localhost:50051", ChannelCredentials.Insecure);
var client = new UserService.UserServiceClient(channel);
var user = await client.GetUserByIdAsync(new UserId { Id = });
await channel.ShutdownAsync();
return Json(new { User = user });
}
.Net Core 3.0使用Grpc进行远程过程调用的更多相关文章
- ASP.NET Core 3.0 使用gRPC
一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...
- Thrift架构~从图中理解thrift,它事实上是一种远程过程调用
thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...
- RabbitMQ入门教程(八):远程过程调用RPC
原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...
- .net core 1.0 Web MVC 自定义认证过程
通过官方的介绍可知,若要本地开始部署搭建一个基于.net core 1.0的Web应用,需要下载dotnet SDK,或在Visual Studio IDE之上安装相关插件以布置开发环境.为了使开发环 ...
- net core 3.0 之Grpc新特性小试牛刀
相信微服务大家伙都有听说和知道,好处弊端咱也不多说了,Grpc算是一个比较全面的微服务框架,也得到微软的支持 总结下来就是,跨平台,可靠,通信快,扩展性强,网络消耗小,模板多语言通用 光说好处,没 ...
- ASP.NET Core 3.0 使用 gRPC无法编译问题
一.问题 创建了gRPC项目后,编译发现报错: 二.解决 1.检查项目路径是否存在中文 2.检查当前Windows用户目录是否为非英文字符,如果是则必须改为英文 修改方法: https://jingy ...
- rabbitMQ学习3-RPC远程过程调用
将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 比喻 将计算机服务运行理解为厨师做饭 ...
- RabbitMQ九:远程过程调用RPC
定义 RPC(Remote Procedure Call Protocol)——远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...
- RPC之远程过程调用
一. 简介 将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 1. 类比: 将计算机服 ...
随机推荐
- CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)H
题面 被神葱安利安利了本题. 我们贪心的想,如果有那么一坨相等的学号,那么肯定是保留一个人学号不变,其余的再推到学号+1的位置(准备与那个位置的其他人合并)处理. 虽然a[i]可大至1e18,不过如果 ...
- [CSP-S模拟测试]:答题(meet in the middle)
题目传送门(内部题142) 输入格式 输入文件的第一行为两个数$n,P$. 接下来一行$n$为个正整数,表示每道题的分数. 输出格式 输出一行一个正整数,为至少需要获得的分数. 样例 样例输入: 2 ...
- Java-JDK-windows和linux版-百度云下载
链接: https://pan.baidu.com/s/15vjk4PNzuItd5vHJ6deq3Q 关注以下公众号,回复[9757],获取提取码 linux:jdk-8u221-linux-x64 ...
- Nginx-rtmp直播之业务流程分析
1. 综述 1.1 直播原理 使用 obs 向 nginx 推送一个直播流,该直播流经 nginx-rtmp 的 ngx_rtmp_live_module 模块转发给 application live ...
- Windows下Git的下载与安装
1).打开百度,输入Git进行搜索,如下图所示: 2).进入Git官网,由于电脑是Windows系统,选择Downloads for Windows,如下图所示: 3).电脑是64位操作系统,选择下载 ...
- php laravel左连接leftJoin多条where语句
通常情况下我们在做leftjoin连接时需要对不止一个条件进行进行匹配,这时候就需要使用闭包方式,如下: leftjoin('db', function ($join) {···}); leftjoi ...
- 一、Vue基础之常用方法
一.JSON.parse() 与 JSON.stringify() 1.JSON.parse() :是从一个字符串中解析出 json 对象 //定义一个字符串 var data='{"nam ...
- java传递String参数
java传递String参数不会改变原String参数,此处传递的是copy package numCombine; public class NumComberAll { public static ...
- 01 numpy库(一)
01-numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. NumPy 是一个运行 ...
- 阶段3 3.SpringMVC·_07.SSM整合案例_05.ssm整合之Spring整合SpringMVC的框架
点击超连接,执行controller里面的方法 那么就需要在Controller里面定义Service对象,就需要依赖注入进来. 启动tomcat服务器,web.xml里面的前端控制器会帮我加载spr ...