.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的生成策略
netcoreapp3.0 all runtime; build; native; contentfiles; analyzers; buildtransitive %(RelativeDir)
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 _logger;
14 public UserServiceImpl(ILogger logger)
15 {
16 this._logger = logger;
17 }
18 public static IList users = new List
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 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();
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的生成策略
netcoreapp3.0 Always %(RelativeDir) false MSBuild:Compile %(RelativeDir) false all runtime; build; native; contentfiles; analyzers; buildtransitive
5.在代码中使用Grpc
1 public async Task作者:奇 出处:https://www.cnblogs.com/fanqisoft/ 本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。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 }