.net core微服务——gRPC(下)
序
上一篇博客把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(下)的更多相关文章
- NET Core微服务之路:实战SkyWalking+Exceptionless体验生产环境下的追踪系统
前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的问题: 从APM上说,知道某个节点出现异常,或延迟过过高,却不能及时知道日志反馈情况,总不可能去相应的节点 ...
- NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统
原文:NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统 前言 当一个APM或一个日志中心实际部署在生产环境中时,是有点力不从心的. 比如如下场景分析的 ...
- 微服务框架下的思维变化-OSS.Core基础思路
如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务 ...
- .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)
前言 上一篇[.Net Core微服务入门全纪录(二)--Consul-服务注册与发现(上)]已经成功将我们的服务注册到Consul中,接下来就该客户端通过Consul去做服务发现了. 服务发现 同样 ...
- .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)
前言 上一篇[.Net Core微服务入门全纪录(四)--Ocelot-API网关(上)]已经完成了Ocelot网关的基本搭建,实现了服务入口的统一.当然,这只是API网关的一个最基本功能,它的进阶功 ...
- .NET Core微服务之服务间的调用方式(REST and RPC)
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.REST or RPC ? 1.1 REST & RPC 微服务之间的接口调用通常包含两个部分,序列化和通信协议.常见的序列化 ...
- ASP.NET Core 微服务初探[1]:服务发现之Consul
ASP.NET Core 微服务初探[1]:服务发现之Consul 在传统单体架构中,由于应用动态性不强,不会频繁的更新和发布,也不会进行自动伸缩,我们通常将所有的服务地址都直接写在项目的配置文件 ...
- .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)
微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...
- .NET Core 微服务之Polly重试策略
接着上一篇说,正好也是最近项目里用到了,正好拿过来整理一下,园子里也有一些文章介绍比我详细. 简单介绍一下绍轻量的故障处理库 Polly Polly是一个.NET弹性和瞬态故障处理库 允许我们以非常 ...
随机推荐
- Android开发学习笔记Intent 一
Inten的概念 1.Intent是Android四大组件直接沟通的桥梁 2.Intent是一种运行时绑定(runtime binding)机制 Intent对象的属性 Itent的种类 Inten过 ...
- Redis进阶之使用Lua脚本自定义Redis命令
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1.在Redis ...
- JavaWeb网上图书商城完整项目--day02-21.退出功能的实现
1.当用户点击退出的时候,跳转到登陆页面 当用户点击退出的时候,需要将session中保存的登陆的用户销毁掉 当用户点击退出的时候,调用UserServlet的quit方法 退出按钮在top.jsp中 ...
- linux网络编程-socket(2)
当客户端调用close函数的时候,服务器的read函数读到的数据是0读到文件结束通知,表示对端关闭了tcp连接 我们现实实现下面的功能: 1.tcp客户端从标准的输入流中得到输入数据发送到服务器,服务 ...
- 慕课网 性能优化之MySQL优化--- max 和count的性能优化
注:在执行SQL语句前加上explain可以查看MySQL的执行计划 数据库:MySQL官方提供的sakila数据库 Max优化: 例如:查询最后支付时间 explain select max(pay ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- python脚本中调用其他脚本
如果只关注脚本中调用他脚本直接看代码30行 PS:该脚本功能有:自动清理目录,创建目录,自动运行脚本,以此提升工作效率 import numpy as np import os from shutil ...
- 读取和写入blob类型数据
读写oracle blob类型 http://zyw090111.iteye.com/blog/607869 http://blog.csdn.net/jeryjeryjery/article/de ...
- MSIL入门(一)C#代码与IL代码对比
基础概念 Microsoft中间语言(MSIL),也成为通用中间语言(CIL),是一组与平台无关的指令,由特定于语言的编译器从源代码生成.MSIL是独立于平台的,因此,他可以在任何公共语言基础架构支持 ...
- html中绝对路径和相对路径的区别?比较相对路径和绝对路径的优缺点
绝对路径和相对路径的区别? 1. 绝对路径:就是你的文件或目录在硬盘上的真正的路径例如“bg.jpg”这个图片是存放在硬盘的“E:\img”目录下,那么 “bg.jpg”这个图片的绝对路径就是“E:\ ...