因为.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进行远程过程调用的更多相关文章

  1. ASP.NET Core 3.0 使用gRPC

    一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架. gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协 ...

  2. Thrift架构~从图中理解thrift,它事实上是一种远程过程调用

    thrift为我们简化了tcp通讯,它可以使用我们方便的建立各种语言的服务端与客户端,并实现客户端对服务器的远程过程调用,简单的说就是服务器通过thrift架构对外开放一些接口,并自己实现这些接口,如 ...

  3. RabbitMQ入门教程(八):远程过程调用RPC

    原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...

  4. .net core 1.0 Web MVC 自定义认证过程

    通过官方的介绍可知,若要本地开始部署搭建一个基于.net core 1.0的Web应用,需要下载dotnet SDK,或在Visual Studio IDE之上安装相关插件以布置开发环境.为了使开发环 ...

  5. net core 3.0 之Grpc新特性小试牛刀

      相信微服务大家伙都有听说和知道,好处弊端咱也不多说了,Grpc算是一个比较全面的微服务框架,也得到微软的支持 总结下来就是,跨平台,可靠,通信快,扩展性强,网络消耗小,模板多语言通用 光说好处,没 ...

  6. ASP.NET Core 3.0 使用 gRPC无法编译问题

    一.问题 创建了gRPC项目后,编译发现报错: 二.解决 1.检查项目路径是否存在中文 2.检查当前Windows用户目录是否为非英文字符,如果是则必须改为英文 修改方法: https://jingy ...

  7. rabbitMQ学习3-RPC远程过程调用

    将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 比喻 将计算机服务运行理解为厨师做饭 ...

  8. RabbitMQ九:远程过程调用RPC

    定义 RPC(Remote Procedure Call Protocol)——远程过程调用协议:它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...

  9. RPC之远程过程调用

    一. 简介 将一个函数运行在远程计算机上并且等待获取那里的结果,这个称作远程过程调用(Remote Procedure Call)或者 RPC. RPC是一个计算机通信协议. 1. 类比: 将计算机服 ...

随机推荐

  1. 灰度图像--图像分割 Sobel算子

    学习DIP第44天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  2. Parallels Desktop 安装centos7

    配置网卡: vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO=dhcp,ONBOOT=yes. 保存后重启网卡 service netw ...

  3. 微信小程序_(表单组件)button组件的使用

    微信小程序表单组件button官方文档 传送门 Learn 一.button组件的使用 一.button组件的使用 size:按钮的大小[默认值default] type:按钮的样式类型[默认值def ...

  4. javascript 取小数点后几位四种方法

    javascript 取小数点后几位方法总结 Javascript取float型小数点后两位,例22.123456取成22.12,如何做? 1.通过substring截取. function getn ...

  5. 【软件工程】团队Git现场编程实战

    组长博客链接 博客链接 组员职责分工 队员 职责分工 恩泽 进行任务的划分与安排,调用API,负责餐饮商铺及商圈信息的获取 金海 解析API返回的json数据,提取有关信息 君曦 部分算法编写 季城 ...

  6. 黑马vue---13、事件修饰符的介绍

    黑马vue---13.事件修饰符的介绍 一.总结 一句话总结: .stop 阻止冒泡:input type="button" value="戳他" @click ...

  7. FScapture录屏后导致麦克风无声问题

  8. C++中的to_string()

    目录 C++中的to_string() 注:原创不易,转载请务必注明原作者和出处,感谢支持! C++中的to_string() C++中的 to_string()系列函数将数值转换成字符串形式.注意, ...

  9. Java之HSF搭建demo

    1.去阿里云官网下载Demo edas-app-demo.zip 2.下载Ali-Tomcat和Pandora,注意红色下面字体 a)下载 Ali-Tomcat,保存后解压至相应的目录(如:d:\wo ...

  10. flask 学习 (五)

    之前照着书去做的时候经常出现一些小问题,由于对于flask核心内容还不甚了解,我觉定先从更简单的做起,再根据别的需要对搭建的网站进行扩展. 上网找了一下,发现这位http://zhanghonglun ...