GRPC入门「终于解决」

GRPC入门「终于解决」概念RPC远程过程调用(远程函数调用)GRPCgoogle开发,跨语言RPC,用来解决微服务通信性能和扩展问题跨语言:通过Protobuffer

欢迎大家来到IT世界,在知识的湖畔探索吧!

概念

RPC

远程过程调用(远程函数调用)

GRPC入门「终于解决」

GRPC

google开发,跨语言RPC,用来解决微服务通信性能和扩展问题
跨语言:通过Protobuffer文件(通用文件)解决跨语言问题的
高并发:GRPC基于http/2协议,多路复用机制(服务端一个线程可以连接任意数量客户端请求)

webapi缺陷

webapi基于HTTP协议,7层通讯协议,高并发存在性能瓶颈。

.NET Core 的 gRPC 功能如下

Grpc.AspNetCore 一个用于在ASP.NET Core承载gRPC服务的框架,将 gRPC和ASP.NET Core 功能集成在一起,如:日志、依赖注入、身份认证和授权。
Grpc.Net.Client 基于HttpClient (HttpClient现已支持HTTP/2)的 gRPC客户端
Grpc.Net.ClientFactory 与gRPC客户端集成的HttpClientFactory,允许对gRPC客户端进行集中配置,并使用DI注入到应用程序中

创建GRPC服务端项目

案例源码:https://gitee.com/fan-microservices/grpc

方式1、新建grpc项目

GRPC入门「终于解决」

方式2、手动创建

  • 1、创建一个web项目,添加Nuget包
<ItemGroup>	<PackageReference Include="Grpc.AspNetCore" Version="2.40.0" /></ItemGroup>

欢迎大家来到IT世界,在知识的湖畔探索吧!

  • 2、创建proto文件:Protos/Product.proto
欢迎大家来到IT世界,在知识的湖畔探索吧!syntax = "proto3";
option csharp_namespace = "ProductService";
package product;//id

service ProductService {
  rpc GetProduct (ProductRequest) returns (ProductReply);
}

message ProductRequest {
  string name = 1;
}
message ProductReply {
  string message = 1;
}
  • 3、项目文件中添加以下代码
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

用来指定proto文件的路径,它会生成以下c#代码:
E:\代码\1_分布式\GRPC\GrpcDemo\ProductService\obj\Debug\net6.0\Protos\Product.cs
E:\代码\1_分布式\GRPC\GrpcDemo\ProductService\obj\Debug\net6.0\Protos\ProductGrpc.cs

  • 4、创建Service
    Services/ProductServiceImpl.cs
欢迎大家来到IT世界,在知识的湖畔探索吧!    public class ProductServiceImpl:ProductService.ProductServiceBase
    {
        public override Task<ProductReply> GetProduct(ProductRequest request, ServerCallContext context)
        {
            var response = new ProductReply {
                Message = #34;Hellog,{request.Name}"
            };
            return Task.FromResult(response);
        }
    }
  • 5、暴露服务
    Program中添加
using Microsoft.AspNetCore.Server.Kestrel.Core;
using ProductService.Services;


var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseKestrel(options => options.ConfigureEndpointDefaults(options => {
    options.Protocols = HttpProtocols.Http2;
}));
builder.Services.AddGrpc();
var app = builder.Build();

app.MapGrpcService<ProductServiceImpl>();

app.Run();

创建GRPC客户端项目

1、创建项目GrpcClient
2、安装Nuget包

Install-Package Grpc.Net.Client
Install-Package Google.protobuf
Install-Package Grpc.Tools

3、拷贝服务端项目的Protos/Product.proto文件到客户端
修改命名空间

option csharp_namespace = "ProductClient";

4、项目文件中添加
会生成c#代码

<ItemGroup>
  <Protobuf Include="Protos\Product.proto" GrpcServices="Client" />
</ItemGroup>

5、请求Grpc服务

using Grpc.Net.Client;
using ProductClient;

//AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://localhost:5002");
var client = new ProductService.ProductServiceClient(channel);
var reply = client.GetProduct(new ProductRequest { Name = "fan" });
Console.WriteLine(reply.Message);
Console.ReadKey();

proto文件介绍

  • syntax:proto文件的版本
syntax = "proto3";
  • csharp_namespace:c#的命名空间,一般是项目名称。生成的服务类最终会放在这个命名空间下
option csharp_namespace = "GrpcService1";
  • package:服务名称的前缀,相当于服务的ID
package greet;
  • service:定义服务,service相当于.net的接口(Interface)
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
  • rpc:定义方法
  • message:入参、出参必须是一个类,由message关键字定义
message HelloRequest {
  string name = 1;//1代表第一个参数
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17846.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信