为什么要用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 Only

2) 选择这两个之后 我们需要重新生成一下项目

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);
}
}

4、编写Client客户端代码

  1. 我们把服务端的Proto 文件复制一份到Client 端代码 生成一份Client 代码如下图

  2. 需要注意

在编写客户端代码的时候,我遇到了一个错误,提示证书验证失败!,(没有配置证书)

所以我们要加上不对证书进行验证

使用 GrpcChannelOptions() 对证书验证

 using var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions()
{
HttpClient = null,
HttpHandler = new HttpClientHandler
{
//方法一
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
//方法二
//ServerCertificateCustomValidationCallback = (a, b, c, d) => true
}
});

Demo 地址:https://gitee.com/Lovely_Rabbit/basic-principle-exercise

AspNetCore中 使用 Grpc 简单Demo的更多相关文章

  1. websocket在.net4.5中实现的简单demo

    以下代码环境要求:win8或win10, .net4.5+IIS8 win7上是IIS7,win7上.net本身不直接支持websocket, win7可以用superwebsocket, 或自己根据 ...

  2. Managed DirectX中的DirectShow应用(简单Demo及源码)

    阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...

  3. demo工程的清单文件及activity中api代码简单示例

    第一步注册一个账户,并创建一个应用.获取app ID与 app Key. 第二步下载sdk 第三步新建工程,修改清单文件,导入相关的sdk文件及调用相应的api搞定. 3.1 修改清单文件,主要是加入 ...

  4. 在cengos中安装zabbix server/agent, 并创建一个简单demo

    添加zabbix更新源 rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch ...

  5. Spring的简单demo

    ---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...

  6. 使用Spring缓存的简单Demo

    使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...

  7. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  8. angular实现了一个简单demo,angular-weibo-favorites

    前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...

  9. C#中使用gRPC

    C#中使用gRPC 我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目 ...

随机推荐

  1. 云原生Devops 的实现方法

    DevOps 是一个持续改善软件产品的过程,它通过极短的发布周期.全面自动化的集成和交付流水线,以及团队间的紧密协作来不断改善产品.DevOps 的目标是缩短将创意变成用户可以使用的产品的时间,并降低 ...

  2. 蔚来杯2022牛客暑期多校训练营6 ABGJM

    比赛链接 A 题解 知识点:数学,构造. 题目要求构造一个长为 \(m\) 的序列 \(c\) ,\(m\) 自选,使得 \(c\) 的无限循环序列 \(b\) 中任意连续 \(a_i\) 个数中都存 ...

  3. Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递

    python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...

  4. CF10D LCIS(线性DP)

    题意:\(LCIS\)输出方案 变迁の时刻,标记它 P.S:特判没\(LCIS\)的情况 //#include <iostream> #include <cstdio> #in ...

  5. LuoguP2523 [HAOI2011]Problem c(概率DP)

    傻逼概率\(DP\),熊大坐这,熊二坐这,两熊体积从右往左挤,挤到\(FFF\)没座位了就不合理了 否则就向左歇斯底里爬,每个\(FFF\)编号就组合一下,完闭 #include <iostre ...

  6. java学习第二天多态.day09

    接口 接口总结 接口表示一种规约(规范.标准),它里面定义了一些列抽象方法(功能),它可以被多个类实现. 1接口名称首写字母用I,表示一个接口,后命名使用驼峰命名 2.接口中定义的都是抽象方法,所以可 ...

  7. 前端知识之CSS(1)-css语法、css选择器(属性、伪类、伪元素、分组与嵌套)、css组合器

    目录 前端基础之css 1.关于css的介绍 2.css语法 3.三种编写CSS的方式 3.1.style内部直接编写css代码 3.2.link标签引入外部css文件 3.3.标签内直接书写 4.c ...

  8. Sirni题解(最小生成树,埃氏筛)(继 Liang-梁)

    目录 前言 题意 思路 一些建议 前言 本篇是对Liang-梁的Sirni(最小生成树,埃氏筛)的后继博客. 通篇原文:https://blog.csdn.net/qq_37555704/articl ...

  9. centos7使用tar包安装mysql5.7

    特别注意: 文档中涉及到密码的都是用的是弱密码,是存在安全风险的,一定要根据自己的情况修改为复杂度更高的密码! centos 7.6 mysql 5.7.31 基础目录: /srv/{app,data ...

  10. 没有二十年功力,写不出Thread.sleep(0)这一行“看似无用”的代码!

    你好呀,我是喜提七天居家隔离的歪歪. 这篇文章要从一个奇怪的注释说起,就是下面这张图: 我们可以不用管具体的代码逻辑,只是单单看这个 for 循环. 在循环里面,专门有个变量 j,来记录当前循环次数. ...