欢迎大家来到IT世界,在知识的湖畔探索吧!
概念
RPC
远程过程调用(远程函数调用)
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项目
方式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