ibcadmin 发表于 2019-10-22 09:05:00

.Net Core3.0使用gRPC

<h2><div align="center"></div></h2>
<h2>gRPC是什么</h2>
<p>gRPC是可以在任何情况中运行的今世开源高性能RPC框架。它可以通过可插拔的支持来有用地毗连数据中心内和跨数据中心的服务,以实现负载均衡,跟踪,运行状况查抄和身份验证。它也适用于分布式盘算的末了一英里,以将装备,移动应用步伐和欣赏器毗连到后端服务。</p>
<h3 data-source-line="11">proto文件</h3>
<p data-source-line="11">用于界说gRPC服务和消息的协定;服务端和客户端共享proto文件。</p>
<h2 data-source-line="11">利用新模板创建gRPC服务端</h2>
<p data-source-line="13">.NETcore 3.0创建项目提供了一个新的gRPC模板,可以轻松地利用ASP.NET Core构建gRPC服务。我们按照步调一步一步创建AA.GrpcService 服务,固然你可以利用命令:dotnet new grpc -o GrpcGreeter</p>
<p data-source-line="16"> 选择gRPC服务项目模板</p>
<p data-source-line="16"><div align="center"></div></p>
<p data-source-line="16">终极天生的项目</p>
<p data-source-line="16"><div align="center"></div></p>
<h4 data-source-line="16">greet.proto文件</h4>

syntax = "proto3";

option csharp_namespace = "AA.GrpcService";

package Greet;

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings.
message HelloReply {
string message = 1;
}

<h4>GreeterService.cs</h4>

public class GreeterService : Greeter.GreeterBase
    {
      private readonly ILogger<GreeterService> _logger;
      public GreeterService(ILogger<GreeterService> logger)
      {
            _logger = logger;
      }

      public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
      {
            return Task.FromResult(new HelloReply
            {
                Message = "Hello " + request.Name
            });
      }
    }

<h4>Startup.cs</h4>

public void ConfigureServices(IServiceCollection services)
      {
            services.AddGrpc();
      }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGrpcService<GreeterService>();

                endpoints.MapGet("/", async context =>
                {
                  await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
                });
            });
      }

<p>创建完成之后,主动包罗了包的引用、proto文件的创建、services服务的天生,模板项目在配景执行一些操纵如</p>
<ul data-source-line="17">
<li>创建一个包罗全部gRPC依赖项的ASP.NET Core项目。</li>
<li>创建一个名为的gRPC服务界说文件greet.proto。</li>
<li>根据服务界说文件主动天生全部gRPC存根。</li>
<li>GreeterService.cs根据主动天生的gRPC存根创建gRPC服务。</li>
<li>在Startup.cs中配置gRPC管道映射到GreeterService.cs</li>
</ul>
<h4 data-source-line="23">运行服务</h4>
<p data-source-line="23"><div align="center"></div></p>
<h2 data-source-line="26">创建gRPC客户端</h2>
<h4 data-source-line="28">下面,我们创建一个控制台应用步伐作为客户端调用gRPC服务;</h4>
<p data-source-line="28"><div align="center"></div></p>
<h4>引用gRPC服务,步调:右键项目添加=》服务引用弹出以下页面;</h4>
<p><div align="center"></div></p>
<h4 data-source-line="34">点击确定</h4>
<p data-source-line="34"><div align="center"></div></p>
<p data-source-line="34"><div align="center"></div></p>
<h4 data-source-line="34">我们看项目布局,他们会主动帮我们处理处罚一下操纵:</h4>
<ul data-source-line="35">
<li>添加引用包:</li>
</ul>
<ol>
<li> package Grpc.Net.ClientFactory</li>
<li> package Google.Protobuf</li>
<li> package Grpc.Tools</li>
</ol>
<ul data-source-line="35">
<li>Protos 文件(包罗greet.proto)主动从AA.GrpcService项目拷贝</li>
<li>主动添加节点</li>
</ul>

<ItemGroup>
    <Protobuf Include="..\AA.GrpcService\Protos\greet.proto" GrpcServices="Client">
      <Link>Protos\greet.proto</Link>
    </Protobuf>
</ItemGroup>

<p>末了,添加以下代码举行gRPC哀求;</p>

class Program
    {
      static async Task Main(string[] args)
      {
            using var channel = GrpcChannel.ForAddress("https://localhost:5005");
            var client = new Greeter.GreeterClient(channel);
            var response = await client.SayHelloAsync(new HelloRequest { Name = "gRPC" });
            Console.WriteLine("Greeting:" + response.Message);
            Console.WriteLine("Press a key to exit");
            Console.ReadKey();
      }
    }

<p>运行结果图:</p>
<p><div align="center"></div></p>
<p data-source-line="53">小结: .NETcore 3.0 使得利用gRPC黑白常方便集成到项目中,希望这篇文章使你可以了解.NETcore与gRPC结合利用。那gRPC适用于以了局景</p>
<ul data-source-line="54">
<li>
<p>微服务– gRPC专为低耽误和高吞吐量通信而计划。 gRPC对于效率至关告急的轻量级微服务非常有用。</p>
</li>
<li>
<p>点对点实时通信– gRPC对双向流具有出色的支持。 gRPC服务可以实时推送消息而无需轮询。</p>
</li>
<li>
<p>多种语言情况– gRPC工具支持全部流行的开发语言,因此gRPC是多语言情况的理想选择。</p>
</li>
<li>
<p>网络受限的情况– gRPC消息利用轻量级消息格式Protobuf举行了序列化。 gRPC消息始终小于等效的JSON消息。</p>
</li>
</ul>
<p data-source-line="65">参考:</p>
<ul data-source-line="66">
<li>https://docs.microsoft.com/zh-cn/aspnet/core/grpc/?view=aspnetcore-3.0</li>
<li>https://www.grpc.io/</li>
<li>https://developers.google.com/protocol-buffers/docs/proto3</li>
<li>https://www.cnblogs.com/stulzq/p/11581967.html</li>
</ul><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/chengtian/p/11714694.html" target="_blank">https://www.cnblogs.com/chengtian/p/11714694.html</a>
页: [1]
查看完整版本: .Net Core3.0使用gRPC