为什么要用Grpc
跨语言进行 , 调用服务 , 获取跨服务器调用等目前我的需要使用 我的抓取端是go 写的 查询端用 Net6 写的 导致很多时候 我需要把一些临时数据写入到 Redis 在两个服务器进行处理参考地址:哔哩哔哩杨旭大佬:https://www.bilibili.com/video/BV1eE411T7GC/?spm_id_from=333.999.0.0强烈建议去看一遍杨旭大佬讲的这篇Grpc 没有那么繁琐 清晰明了
1、依赖安装:Grpc.AspNetCore Server 端包
2、编写proto 文件syntax = "proto3";option csharp_namespace= "GrpcServer.Web.Protos";message Employee{ int32 id = 1; int32 no = 2; string firstName = 3; string lastName =4; float salary = 5;}message GetByNoRequest{ int32 no =1;}message EmployeeResponse{ Employee employee =1;}message GetAllRequest{}message AddPhotoRequest{ bytes data = 1;}message AddPhotoResponse{ bool isOK = 1;}message EmployeeRequest{ Employee employee = 1;}service EmployeeService { rpc GetByNo(GetByNoRequest) returns (EmployeeResponse); rpc GetAll(GetAllRequest) returns (stream EmployeeResponse); rpc AddPhoto(stream AddPhotoRequest) returns (AddPhotoResponse); rpc Save (EmployeeRequest) returns(EmployeeResponse); rpc SaveAll(stream EmployeeRequest) returns(stream EmployeeResponse);}3、编写Server端代码在编写服务端代码之前 , 我们需要对proto 文件进行生成代码
文章插图
如上图:1)我们要先进行勾选Build Action 选择 , 如图所示 , 因为我们这里需要的只是 Server 端 , 选择生成Server Only2) 选择这两个之后 我们需要重新生成一下项目
EmployeeService.EmployeeServiceBase 是我们Proto 生成的代码 , 我们要去重写父类的这些方法 public class MyEmployeeService : EmployeeService.EmployeeServiceBase { private readonly ILogger<MyEmployeeService> _logger; public MyEmployeeService(ILogger<MyEmployeeService> logger) { _logger = logger; } public override async Task<EmployeeResponse> GetByNo(GetByNoRequest request, ServerCallContext context) { var employee = InMemoryData.Employees.SingleOrDefault(x => x.No == request.No); if (employee != null) { var response = new EmployeeResponse { Employee = employee }; return await Task.FromResult(response); } throw new Exception($"employee is not found :{request.No}"); } public override async Task GetAll(GetAllRequest request, IServerStreamWriter<EmployeeResponse> responseStream, ServerCallContext context) { foreach (var item in InMemoryData.Employees) { await responseStream.WriteAsync(new EmployeeResponse { Employee = item }); } //return base.GetAll(request, responseStream, context); } public override async Task<AddPhotoResponse> AddPhoto( IAsyncStreamReader<AddPhotoRequest> requestStream , ServerCallContext context) { Metadata md = context.RequestHeaders; foreach (var item in md) { Console.WriteLine($"{item.Key}:{item.Value}"); } var data = new List<byte>(); while (await requestStream.MoveNext()) { Console.WriteLine($"Received: {requestStream.Current.Data.Length}"); data.AddRange(requestStream.Current.Data); } Console.WriteLine($"data file with {data.Count} bytes"); return new AddPhotoResponse { IsOK = true }; } public override async Task SaveAll( IAsyncStreamReader<EmployeeRequest> requestStream , IServerStreamWriter<EmployeeResponse> responseStream , ServerCallContext context) { while (await requestStream.MoveNext()) { var employee = requestStream.Current.Employee; lock (this) { InMemoryData.Employees.Add(employee); } await responseStream.WriteAsync(new EmployeeResponse { Employee = employee }); } Console.WriteLine("Employees"); foreach (var item in InMemoryData.Employees) { Console.WriteLine(item); } //return base.SaveAll(requestStream, responseStream, context); } }
经验总结扩展阅读
- 分布式存储系统之Ceph集群RadosGW基础使用
- springboot H2 linux下搭建使用
- 长期银壶烧水的危害
- 恋爱中谨小慎微的星座男
- 哪些星座夫妻能够在婚姻中一起成长
- 感情中极度缺乏安全感的星座女
- 2023年10月17日装修厨房行吗 2023年10月17日是装修厨房的黄道吉日吗
- 2023年10月17日补墙行吗 2023年10月17日补墙好吗
- 2023年10月17日修补破洞好吗 2023年10月17日修补破洞行吗
- 黄瓜吃法