在单体应用中,相互调用都是在一个进程内部调用,也就是说调用发生在本机内部,因此也被叫做本地方法调用;在微服务中,服务之间调用就变得比较复杂,需要跨网络调用,他们之间的调用相对于与本地方法调用,可称为远程过程调用,简称RPC(Remote procedure call)。

看过上篇API网关篇,知道案例中包含商品、订单两个微服务,本文将会演示如何采用开源的,高性能rpc框架(grpc),通过订单微服务调用产品微服务内的接口。没有看过上篇文章不影响,我先提供下项目代码结构图,方便你阅读。下面将会一步一步分享如何使用Grpc进行服务之间调用。

步骤1:首先定义服务锲约-proto文件

1.创建类库(.NET Standard),作为服务契约项目,命名为-AAStore.ProductCatalog.DataContracts如图:

2.安装三个nuget包

Google.Protobuf
Grpc
Grpc.Tools

3.开始定义proto文件:product.api.proto

syntax = "proto3";

option csharp_namespace = "AAStore.ProductCatalog.Api.V1";
package AAStore; service ProductApi{ rpc GetProduct(GetProductRequest) returns (GetProductResponse);
} //请求消息体
message GetProductRequest{
int32 Id=;
}
//返回消息体
message GetProductResponse{
string productName=;
}

Grpc协议使用Protobuf简称proto文件来定义接口名、调用参数以及返回值类型。比如product.api.proto文件,定义一个接口GetProduct方法,它的请求结构体是GetProductRequest,包含一个int类型的id属性,它的返回结构体GetProductResponse包含一个输出string类型的产品名称属性。

4.添加product.api.proto文件到项目中,双击项目或者右键-》编辑项目文件,添加一下代码

<ItemGroup>
<ProjectReference Include="..\AAStore.ProductCatalog\AAStore.ProductCatalog.csproj" />
</ItemGroup>
然后build项目,此时gprc代码已经生成了,在obj文件项目,如图

步骤2:Grpc服务端实现

选择项目AAStore.ProductCatalog(详情见项目代码结构图)安装包Grpc.AspNetCore,同时添加引用项目AAStore.ProductCatalog.DataContracts

<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.29.0" />
</ItemGroup> <ItemGroup>
<ProjectReference Include="..\AAStore.ProductCatalog.DataContracts\AAStore.ProductCatalog.DataContracts.csproj" />
</ItemGroup>
然后定义获取产品方法的逻辑和实现,供产品api站点项目调用
   public class GrpcProductServices
{
public Task<GetProductResponse> GetProduct(GetProductRequest request, ServerCallContext context)
{
return Task.FromResult(new GetProductResponse
{
//todo 具体的逻辑 下面代码仅为显示
ProductName = "测试商品grpc"
}) ;
}
}

选择AAStore.ProductCatalog.Api产品api项目添加引用项目AAStore.ProductCatalog

  <ItemGroup>
<ProjectReference Include="..\AAStore.ProductCatalog\AAStore.ProductCatalog.csproj" />
</ItemGroup>

新增ProductServices.cs并继承ProductApiBase类,实现grpc服务

    public class ProductServices : ProductApi.ProductApiBase
{
public override Task<GetProductResponse> GetProduct(GetProductRequest request, ServerCallContext context)
{
return new GrpcProductServices().GetProduct(request, context);
}
}

由于AAStore.ProductCatalog.Api项目不是通过grpc模板项目创建的,所以在Startup类中手工添加gprc服务和中间件代码:

        public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddGrpc();
} app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<ProductServices>();
endpoints.MapControllers();
});

最后在Program文件配置站点启动监听8081端口,我们并运行它

webBuilder.ConfigureKestrel(options =>
{
// Setup a HTTP/2 endpoint without TLS.
options.ListenLocalhost(, o => o.Protocols =
HttpProtocols.Http2);
});

步骤3:Grpc客户端实现-调用Grpc服务

选择AAStore.Orde项目(具体见项目代码结构图),安装Grpc.AspNetCore包,并且添加项目引用AAStore.ProductCatalog.DataContracts

<ItemGroup>
<ProjectReference Include="..\AAStore.ProductCatalog.DataContracts\AAStore.ProductCatalog.DataContracts.csproj" />
</ItemGroup>

新建ProductGateway.cs,封装产品微服务公开grpc服务的调用

public class ProductGateway
{
private readonly ProductApiClient _client;
public ProductGateway()
{
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
_client = new ProductApiClient(GrpcChannel.ForAddress("http://localhost:8081"));//TODO 根据动态配置
} public async Task<GetProductResponse> GetProduct(GetProductRequest request)
{
return await _client.GetProductAsync(request);
}
}

新建OrderService.cs,添加GetOrder方法,在其方法内调用产品微服务GetProduct方法

   public async Task<string> GetOrder()
{
var productModel = await _productGateway.GetProduct(new GetProductRequest() { Id = });
return $"Order Service=>从产品微服务获取产品信息:{productModel.ProductName}";
}

然后在订单控制器中调用

[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
private readonly RestOrderService _restOrderService;
public OrderController()
{
_restOrderService = new RestOrderService();
}
[HttpGet(template:"Get")]
public async Task<string> GetOrder()
{
return await _restOrderService.GetOrder();
}
}

至此,客户端代码已经完成,我们运行来看看

通过网关访问订单服务,查看调用结果

我们发现结果也是一样的,以上演示了如何使用grpc进行服务间的调用,最后使用一张图作结。

.NET Core微服务开发服务间调用篇-GRPC的更多相关文章

  1. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 基础篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与美化, ...

  2. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 中级篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与Mat ...

  3. .net core——Docker化开发和部署

    原文:.net core--Docker化开发和部署 本篇文章是使用Vs2017生成的Dockerfile进行部署的. 目录 VS2017生成Docker部署项目 Dockerfile内容 在开发服务 ...

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

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

  5. 【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

    <ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-tr ...

  6. 使用 ASP.NET Core 3.1 的微服务开发指南

    使用 ASP.NET Core 3.1 的微服务 – 终极详细指南 https://procodeguide.com/programming/microservices-asp-net-core/ A ...

  7. Asp.Net Core使用SignalR进行服务间调用

    网上查询过很多关于ASP.NET core使用SignalR的简单例子,但是大部分都是简易聊天功能,今天心血来潮就搞了个使用SignalR进行服务间调用的简单DEMO. 至于SignalR是什么我就不 ...

  8. net core 微服务框架 Viper 调用链路追踪

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  9. 基于gin的golang web开发:服务间调用

    微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...

随机推荐

  1. MFC基于CAsyncSocket套接字客户端代码示范

    MFC基于CAsyncSocket套接字客户端代码示范 https://blog.csdn.net/txwtech/article/details/93016190

  2. Java 从入门到进阶之路(二十四)

    在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的泛型,本章我们来看一下 Java 集合框架中的Collection 的子接口 List. Collection 接口有 ...

  3. django xadmin 配置过程

    1.拷贝xadmin的一个下的一个xadmin文件夹放到项目里

  4. Flutter学习笔记(37)--动画曲线Curves 效果

    如需转载,请注明出处:Flutter学习笔记(37)--动画曲线Curves 效果

  5. Jmeter之仿真高并发测试-集合点

    场景: 大家在使用Jmeter测试的时候应该发现了, (1)线程启动了就会直接发送测试请求:--如果要模拟在一瞬间高并发量测试的时候,需要调高线程数量,这很耗测试机器的性能,往往无法支持较大的并发数, ...

  6. VulnHub CengBox2靶机渗透

    ​本文首发于微信公众号:VulnHub CengBox2靶机渗透,未经授权,禁止转载. 难度评级:☆☆☆☆官网地址:https://download.vulnhub.com/cengbox/CengB ...

  7. springBoot--集成RocketMQ

    1.导入依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>sprin ...

  8. 源码剖析@contextlib.contextmanager

    示例 @contextlib.contextmanager def result(a): print('before') yield print('after') 外层装饰源码 包装func函数,真实 ...

  9. windows 下 node 安装 react

    当前node.npm都已安装了. 可是在执行 安装 react的时候总是报错 最后会生成一个报错的txt文件(  <npm-@googlegroups.com>npm-debug.log) ...

  10. [SCOI2016]背单词 题解

    背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想 ...