上一篇博客把grpc的概念说了个大概,介绍了proto的数据类型,基本语法,也写了个小demo,是不是没那么难?

今天要从理论到实际,写两个微服务,并利用grpc完成两者之间的通信。只是作为demo写的话会十分简单,毕竟理解为主。

服务端

首先要拿出之前写好的proto文件,然后修改两个属性:

Build Action => Protobuf compiler

gRpc Stub Classes => Server only

如图:

当然也可以在项目文件里看到它:

然后重新生成项目 ,会自动根据proto文件生成server端的文件。

引用

经过刚才,已经生成了对应的服务,我们可以直接在代码里调用。

这是之前写好的proto:

syntax = "proto3";

option csharp_namespace = "gRPCApiDemo.Protos";

package Demo;

service MyMath{
rpc MathAdd (AddRequest) returns (AddRespones) {}
} message AddRequest{
int32 a=;
int32 b=;
} message AddRespones{
int32 a=;
}

生成以后,会有一个MyMath.MyMathBase这个类,我们来继承一下:

注意看命名空间,这是刚才项目生成以后根据proto生成的。

现在来重写一下里面的方法(下图是生成,也可以手动写):

根据proto文件可知:

AddRequest包含两个int参数:A、B

AddRespones包含一个名为A的int参数

那我们把AB相加然后返回:

using Grpc.Core;
using gRPCApiDemo.Protos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace gRPCApiDemo.Grpc
{
public class GrpcServiceMath : MyMath.MyMathBase
{
public override Task<AddRespones> MathAdd(AddRequest request, ServerCallContext context)
{
var respones = new AddRespones
{
A = request.A + request.B
};
return Task.FromResult(respones);
}
}
}

再然后进入StartUp设置一下:

 app.UseHttpsRedirection();

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

服务端到这里就写完了。

如果写了更多service,那就需要在这里声明更多的实现类;而且https是必须的。

客户端

我准备了一个空白项目。接下来你可以把之前服务端的proto文件拷贝过来,或者选择重新写一份,然后修改属性以后生成一下项目:

其实还有一个选项是Client and Server,一次生成客户端和服务端。

接下来注入灵魂:

services.AddGrpcClient<MyMath.MyMathClient>(o => o.Address = new Uri("https://localhost:5001"));

MyMath是proto里声明的服务,MyMathClient是刚才生成的,里面的Uri是服务端所在的域名。

因为gRpc是基于http/2,而想要以http/2访问有个比较麻烦的证书要搞,如果不想搞证书可以接着添加这一行:

AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

当然,别忘了下面https的设置。

再接着我们新建一个controller,直接调用方法:

    public class IndexController : Controller
{
private readonly MyMath.MyMathClient _client; public IndexController(MyMath.MyMathClient client)
{
this._client = client;
} public async Task<int> Add(int a, int b)
{
var respones = await _client.MathAddAsync(new AddRequest()
{
A = a,
B = b
});
return respones.A;
}
}

MyMathClient就和MyMathBase一样,也是自动生成的。而且现在这个版本会自动生成rpc调用的异步版本,就像代码里的MathAddAsync。

我们跑一下看看:

完美。

源码地址

最后小小的提醒一下,server和client端必须要有https,不然的话:

希望对初入微服务的同学有所帮助。

最后附上源码:

https://gitee.com/muchengqingxin/GrpcServerDemo.git

https://gitee.com/muchengqingxin/GrpcClientDemo.git

.net core微服务——gRPC(下)的更多相关文章

  1. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产环境下的追踪系统

    前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的问题: 从APM上说,知道某个节点出现异常,或延迟过过高,却不能及时知道日志反馈情况,总不可能去相应的节点 ...

  2. NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

    原文:NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统 前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的 ...

  3. 微服务框架下的思维变化-OSS.Core基础思路

    如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务 ...

  4. .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

    前言 上一篇[.Net Core微服务入门全纪录(二)--Consul-服务注册与发现(上)]已经成功将我们的服务注册到Consul中,接下来就该客户端通过Consul去做服务发现了. 服务发现 同样 ...

  5. .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

    前言 上一篇[.Net Core微服务入门全纪录(四)--Ocelot-API网关(上)]已经完成了Ocelot网关的基本搭建,实现了服务入口的统一.当然,这只是API网关的一个最基本功能,它的进阶功 ...

  6. .NET Core微服务之服务间的调用方式(REST and RPC)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.REST or RPC ? 1.1 REST & RPC 微服务之间的接口调用通常包含两个部分,序列化和通信协议.常见的序列化 ...

  7. ASP.NET Core 微服务初探[1]:服务发现之Consul

    ASP.NET Core 微服务初探[1]:服务发现之Consul   在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...

  8. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  9. .NET Core 微服务之Polly重试策略

    接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细. 简单介绍一下绍轻量的故障处理库 Polly  Polly是一个.NET弹性和瞬态故障处理库 允许我们以非常 ...

随机推荐

  1. (九)logback.xml文件配置(按时间、文件大小和log名称生成日志)

    原文链接:https://www.cnblogs.com/hhhshct/p/9084036.html rollingPolicy 设置:<rollingPolicy class="c ...

  2. CVE-2020-0796—远程代码执行漏洞

    一.漏洞名称: 微软SMBv3 Client/Server - 远程代码执行漏洞——CVE-2020-0796 二.识别点: 445端口 三.影响范围: Windows 10 Version 1903 ...

  3. 记一次Idea+Gradle编译Spring源码遇到的坑

    打算开始研究Spring源码,于是照着书上的指导从网上下载了Spring5.0.2版本和Gradle4.0(必须JDK1.8.60以上),本地编译的时候没有任何问题,就是导入Idea的时候一直报下面这 ...

  4. zip矩阵转至

    list01=[1,2,3,4] list02=["a","b","c","d"] for itme in zip(li ...

  5. 第二章、Web中使用shiro(实现登陆)

    虽然Apache Shiro的核心设计目标允许它用于保护任何基于JVM的应用程序(如命令行应用程序,服务器守护程序,Web应用程序等),但本指南将着重讨论最常见的用例:确保运行的Web应用程序一个Se ...

  6. JavaScript 集合基本操作

    参考 MDN 集合 Array 1. 2种创建数组的方式 var fruits = [] ; var friuits = new Array(); 2. 遍历 fruits.forEach(funct ...

  7. 黎活明8天快速掌握android视频教程--19_采用ListView实现数据列表显示

    1.首先整个程序也是采用mvc的框架 DbOpenHelper 类 package dB; import android.content.Context; import android.databas ...

  8. JavaWeb网上图书商城完整项目--day02-12.激活功能各层实现

    1.我们来看程序的代码 数据库层: 1.通过激活码查找到对应的用户 2.设置用户的激活状态 2.业务层 1.通过数据库接口通过验证码得到对应的用户 2.判断当用户是否为空,如果没有通过激活码查找到对应 ...

  9. 设计模式:JDK和Spring中常见的设计模式

    设计模式 总结 类 工厂模式 封装创建过程,只对结果负责 BeanFactory.Calender 单例模式 全局唯一 ApplicationContext.Calender 原型模式 多重影分身之术 ...

  10. 入门大数据---HDFS,Zookeeper,ZookeeperFailOverController(简称:ZKFC),JournalNode是什么?

    HDFS介绍: 简述: Hadoop Distributed File System(HDFS)是一种分布式文件系统,设计用于在商用硬件上运行.它与现有的分布式文件系统有许多相似之处.但是,与其他分布 ...