.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弹性和瞬态故障处理库 允许我们以非常 ...
随机推荐
- 写一个通用的List集合导出excel的通用方法
前几天要做一个数据导出Excel 我就打算写一个通用的. 这样一来用的时候也方便,数据主要是通过Orm取的List.这样写一个通用的刚好. public static void ListToExcel ...
- Flutter学习笔记(33)--GestureDetector手势识别
如需转载,请注明出处:Flutter学习笔记(33)--GestureDetector手势识别 这篇随笔主要记录的学习内容是GestureDetector手势识别,内容包括识别单击.双击.长按.组件拖 ...
- elasticsearch中query和filter的区别
参考博客来自: https://mp.weixin.qq.com/s/tiiveCW3W-oDIgxvlwsmXA?utm_medium=hao.caibaojian.com&utm_sour ...
- mysql事务的坑----MyISAM表类型不支持事务操作
最近需要通过JDBC对数据库做事务型操作,实践时发现,并没有达到想要的效果,表现在:1.每次执行executeUpdate()后,数据就马上能在DB中查到.但按理来说,我还没执行commit(),DB ...
- weblogic之高级进阶JMS的应用
不仅Activemq提供的jms服务,Weblogic也提供了jms服务,很多项目是部署在Weblogic中,使用其提供的jms服务也是很多企业的选择,一直没亲手试过,今天试了下,遇到的小问题还挺多, ...
- 入门大数据---Spark_Streaming基本操作
一.案例引入 这里先引入一个基本的案例来演示流的创建:获取指定端口上的数据并进行词频统计.项目依赖和代码实现如下: <dependency> <groupId>org.apac ...
- IDEA 2020.1 插件市场无法找到官方的汉化包解决办法
问题: idea 终于更新了2020.1版本,新增了好多的特性,官方也终于支持了中文语言包,但是下载后在插件市场无法找到官方的汉化包 解决: 去IDEA插件中心 (https://plugins.je ...
- VSCode 使用 Settings Sync 同步配置和插件
简要说明: Settings Sync插件可以在不同的计算机同步VSCode配置和插件. 安装和配置 在VSCode的插件栏搜索settings sync并安装.在安装完成之后如果需要重新载入就点击重 ...
- 化繁就简,如何利用Spring AOP快速实现系统日志
1.引言 有关Spring AOP的概念就不细讲了,网上这样的文章一大堆,要讲我也不会比别人讲得更好,所以就不啰嗦了. 为什么要用Spring AOP呢?少写代码.专注自身业务逻辑实现(关注本身的业务 ...
- java语言进阶(一)_Object类_常用API
第一章 Object类 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如 ...