.Net Core 3.0使用Grpc进行远程过程调用
2023-09-11 14:18:14 时间
因为.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.编写服务的实现
1 using Grpc.Core; 2 using Microsoft.Extensions.Logging; 3 using Service; 4 using System; 5 using System.Collections.Generic; 6 using System.Linq; 7 using System.Threading.Tasks; 8 9 namespace GrpcGreeter.Services 10 { 11 public class UserServiceImpl:UserService.UserServiceBase 12 { 13 public ILogger<UserServiceImpl> _logger; 14 public UserServiceImpl(ILogger<UserServiceImpl> logger) 15 { 16 this._logger = logger; 17 } 18 public static IList<User> users = new List<User> 19 { 20 new User 21 { Id = 1,Username = "fanqi",Password = "admin",Phone="13800138000",Email="fanqi@coreqi.cn" 22 }, 23 new User 24 { 25 Id = 2,Username = "gaoxing",Password="admin",Phone="138001380000",Email = "gaoxing@coreqi.cn" 26 } 27 }; 28 public override Task<User> GetUserById(UserId request, ServerCallContext context) 29 { 30 var httpContext = context.GetHttpContext(); //我没有用到httpContext 31 _logger.LogInformation("成功调用"); 32 User user = users.FirstOrDefault(f => f.Id == request.Id); 33 return Task.FromResult(user); 34 } 35 } 36 }
⒍在Startup中配置Grpc
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Threading.Tasks; 5 using GrpcGreeter.Services; 6 using Microsoft.AspNetCore.Builder; 7 using Microsoft.AspNetCore.Hosting; 8 using Microsoft.AspNetCore.HttpsPolicy; 9 using Microsoft.Extensions.Configuration; 10 using Microsoft.Extensions.DependencyInjection; 11 using Microsoft.Extensions.Hosting; 12 13 namespace GrpcGreeterServer 14 { 15 public class Startup 16 { 17 public Startup(IConfiguration configuration) 18 { 19 Configuration = configuration; 20 } 21 22 public IConfiguration Configuration { get; } 23 24 public void ConfigureServices(IServiceCollection services) 25 { 26 services.AddGrpc(); 27 } 28 29 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 30 public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 31 { 32 if (env.IsDevelopment()) 33 { 34 app.UseDeveloperExceptionPage(); 35 } 36 37 app.UseRouting(); 38 39 app.UseEndpoints(endpoints => 40 { 41 endpoints.MapGrpcService<UserServiceImpl>(); 42 }); 43 } 44 } 45 }
7.在launchSettings.json中配置Grpc
1 { 2 "profiles": { 3 "GrpcGreeter": { 4 "commandName": "Project", 5 "launchBrowser": false, 6 "applicationUrl": "http://localhost:50051", 7 "environmentVariables": { 8 "ASPNETCORE_ENVIRONMENT": "Development" 9 } 10 } 11 } 12 }
8.在appsettings.json中配置Grpc
1 { 2 "Logging": { 3 "LogLevel": { 4 "Default": "Information", 5 "Microsoft": "Warning", 6 "Microsoft.Hosting.Lifetime": "Information" 7 } 8 }, 9 "AllowedHosts": "*", 10 "Kestrel": { 11 "EndpointDefaults": { 12 "Protocols": "Http2" 13 } 14 } 15 }
⒉Client端
1.创建一个ASP.NET Core Web应用程序
2.引入依赖
1 Install-Package Grpc.Core 2 Install-Package Google.Protobuf 3 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
1 public async Task<IActionResult> Index() 2 { 3 var channel = new Channel("localhost:50051", ChannelCredentials.Insecure); 4 var client = new UserService.UserServiceClient(channel); 5 var user = await client.GetUserByIdAsync(new UserId { Id = 1}); 6 await channel.ShutdownAsync(); 7 return Json(new { User = user }); 8 }
相关文章
- centos 7 下设置.net core项目开机自启动
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)
- abp(net core)+easyui+efcore实现仓储管理系统——入库管理之九(四十五)
- abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之三(二十九)
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
- RSA in .net and dotnet core
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
- 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange
- (六)Net Core项目使用Controller之一 c# log4net 不输出日志 .NET Standard库引用导致的FileNotFoundException探究 获取json串里的某个属性值 common.js 如何调用common.js js 筛选数据 Join 具体用法
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
- .NET Core快速入门教程 5、使用VS Code进行C#代码调试的技巧
- 扒一扒.NET Core的环境配置提供程序
- ADO.NET数据库实例教程
- 在ASP.NET MVC中使用Knockout实践04,控制View Model的json格式内容
- 【转】.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现
- .Net Core 3.1 控制器传入时间问题导致
- 四、附加到进程调试(.NET Core)
- 翻译:使用 CoreWCF 升级 WCF 服务到 .NET 6
- .Net Core 简单定时任务框架封装