.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. 类比: 将计算机服 ...
随机推荐
- Codeforces Round #567 (Div. 2) E2 A Story of One Country (Hard)
https://codeforces.com/contest/1181/problem/E2 想到了划分的方法跟题解一样,但是没理清楚复杂度,很难受. 看了题解觉得很有道理,还是自己太菜了. 然后直接 ...
- [CSP-S模拟测试]:最大或(数学)
题目传送门(内部题141) 输入格式 输入文件包含多组测试数据,第一行为一个正整数$T$,表示数据组数. 接下来$T$行,每行两个正整数$l,r$.数据保证$l\leqslant r$成立. 输出格式 ...
- Nginx-rtmp之 ngx_rtmp_send.c 文件分析
1. 简述 1.1 RTMP 消息类型 /* RTMP message types */ #define NGX_RTMP_MSG_CHUNK_SIZE 1 #define NGX_RTMP_MSG_ ...
- .NET DLL 保护措施详解(非混淆加密加壳)
为什么要保护DLL,我就不多说了,各人有各人的理由.总的来说,就是不想核心逻辑泄露及授权验证被破解两大方面的因素.市面上的混淆加密工具对.NET源码保护的效果天差地别,很多网上下到的混淆工具破解版对. ...
- Python——语言基础
1.数据类型 1.1.字符串 1.1.1.变量声明 1.1.2.相关函数 1.2.布尔类型 1.2.1.变量声明 1.2.2.相关函数 1.3.数字类型 1.3.1.变量声明 1.3.2.相关函数 1 ...
- Java-JVM 自定义类加载器
一.sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建) public Launcher() { Launcher.ExtClassLoade ...
- DP&图论 DAY 1 下午
DP&图论 DAY 1 下午 区间和序列上的DP 序列上的DP >序列上的dp状态设计最基本的形式 F[i]表示以 i 结尾的最优值或方案数.◦ F[i][k]表示以 i 结尾附加 ...
- RGB颜色透明度转换
100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...
- javascript之Number对象
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 内存数据库:memcached与redis技术的对比试验
本文以高性能nginx服务器为应用背景,想利用缓存技术来减轻系统负荷,加快响应时间,从而增加web服务器的吞吐量. redis是一种分布式内存数据库,memcached是一种内存缓存技术,它们都采用k ...