zoukankan      html  css  js  c++  java
  • .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="Protosuser.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="Protosuser.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="Protosgreet.proto" />
        <None Remove="Protosuser.proto" />
      </ItemGroup>
    
      <ItemGroup>
        <Protobuf Include="Protosgreet.proto" GrpcServices="Client">
          <CopyToOutputDirectory>Always</CopyToOutputDirectory>
          <OutputDir>%(RelativeDir)</OutputDir>
          <CompileOutputs>false</CompileOutputs>
          <Generator>MSBuild:Compile</Generator>
        </Protobuf>
        <Protobuf Include="Protosuser.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         }

        

  • 相关阅读:
    题解「CF204E Little Elephant and Strings」
    题解「CF1000G Two-Paths」
    消息机制及按钮实效性
    View(视图)——消息机制
    城市线程练习题后续
    城市线程练习题
    View(视图)——对话框之日期对话框和时间对话框文集
    View(视图)——对话框之进度对话框
    删除对话框练习
    拨打电话与发送短信功能
  • 原文地址:https://www.cnblogs.com/fanqisoft/p/10857848.html
Copyright © 2011-2022 走看看