在现代分布式系统中,服务之间的通信是一个非常重要的环节。随着微服务架构的流行,服务之间的通信方式也在不断演进。grpc作为一种高性能、跨语言的rpc框架,逐渐成为了我们的首选。
一、简介
grpc 是一种高性能、开源的远程过程调用(rpc)框架,基于 http/2 协议,支持双向流、头部压缩等特性。它默认使用 protocol buffers(protobuf)作为接口定义语言(idl)和数据序列化格式,适用于微服务、实时通信等场景。
在 .net core(.net 8)中,grpc 提供了原生的支持,我们可以轻松创建 grpc 服务端和客户端,并将其集成到 web api 或其他应用中。
本文将围绕以下几个方面介绍如何在 .net core (.net 8) 中使用 grpc:
- 创建 grpc 服务端
- 创建 grpc 客户端
- 在 web api 中集成 grpc
二、创建 grpc 服务端
1. 创建 grpc 项目
首先,使用 .net cli 创建一个 grpc 服务端项目。也可以通过vs2022直接进行创建。
dotnet new grpc -o grpcdemo.service cd grpcdemo.service

这将创建一个包含 grpc 模板的项目,其中包含一个示例的 grpc 服务。

2. 编写自己的服务
在 protos 文件夹中,默认会生成一个 greet.proto 文件。我们可以修改或创建新的 .proto 文件来定义自己的服务。
例如,创建一个 order.proto 文件:
syntax = "proto3";
option csharp_namespace = "grpcdemo.service";
package order;
// 订单服务定义
service order {
// 创建订单
rpc createorder (createrequest) returns (createresult);
//查询订单
rpc queryorder (queryrequest) returns (queryresult);
}
//创建订单请求参数
message createrequest {
string orderno = 1;
string ordername=2;
double price=3;
}
//创建订单返回结果
message createresult {
bool issuccess = 1; // 是否成功
string message = 2; // 错误信息
}
//查询订单请求参数
message queryrequest{
int32 id=1;
}
//查询订单返回结果
message queryresult{
int32 id=1;
string orderno=2;
string ordername=3;
double price=4;
}
接下来,在 services 文件夹中实现服务逻辑。创建一个 orderservice.cs 文件:
using grpc.core;
namespace grpcdemo.service.services
{
public class orderservice : order.orderbase
{
private readonly ilogger<orderservice> _logger;
public orderservice(ilogger<orderservice> logger)
{
_logger = logger;
}
/// <summary>
/// 创建订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override task<createresult> createorder(createrequest request, servercallcontext context)
{
//报存数据库 todo
return task.fromresult(new createresult
{
issuccess = true,
message = "订单创建成功"
});
}
/// <summary>
/// 查询订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override task<queryresult> queryorder(queryrequest request, servercallcontext context)
{
//查询数据库 //todo
return task.fromresult(new queryresult
{
id = request.id,
orderno = datetime.now.tostring("yyyymmddhhmmss"),
ordername = "年货大礼包",
price = 699
});
}
}
}在 program.cs 中注册服务:
using grpcdemo.service.services; var builder = webapplication.createbuilder(args); // 添加 grpc 服务 builder.services.addgrpc(); var app = builder.build(); // 映射 grpc 服务 app.mapgrpcservice<orderservice>(); app.run();
运行项目后,grpc 服务端将启动并监听指定的端口。
三、创建 grpc 客户端
1. 创建客户端项目
使用 .net cli 创建一个控制台项目作为 grpc 客户端:
dotnet new console -o grpcdemo.client cd grpcdemo.client
2. 添加 grpc 客户端依赖
在客户端项目中,添加 grpc.net.client 和 google.protobuf 包:
dotnet add package grpc.net.client dotnet add package google.protobuf dotnet add package grpc.tools
将服务端的 order.proto 文件复制到客户端项目的 protos 文件夹中,并在 .csproj 文件中添加以下内容以生成 c# 代码:

3. 编写客户端代码
在 program.cs 中编写 grpc服务https调用的代码:
static void main(string[] args)
{
console.writeline("hello, world!");
//常规使用,https
string url = "https://localhost:7231";
using (var channel = grpcchannel.foraddress(url))
{
var client = new order.orderclient(channel);
var reply = client.createorder(new createrequest()
{
orderno = datetime.now.tostring("yyyymmddhhmmssfff"),
ordername = "年货大礼包",
price = 699
});
console.writeline($"grpc服务https的调用结果:{reply.issuccess},message:{reply.message}");
}
console.readkey();
}
结果:

如果 grpc 服务端使用 http(非 https),可以在客户端中直接使用 http 地址:
//使用http
appcontext.setswitch("system.net.http.socketshttphandler.http2unencryptedsupport", true);
string url = "http://localhost:5147";
using (var channel = grpcchannel.foraddress(url))
{
var client = new order.orderclient(channel);
var reply = client.createorder(new createrequest()
{
orderno = datetime.now.tostring("yyyymmddhhmmssfff"),
ordername = "年货大礼包",
price = 699
});
console.writeline($"ggrpc内网http调用结果:{reply.issuccess},message:{reply.message}");
}
console.readkey();
结果:

四、web api 中加入 grpc
在 web api 项目中,可以同时提供 restful api 和 grpc 服务。以下是如何在 web api 中集成 grpc 的步骤:
1. 添加 grpc 服务
在 program.cs 中注册 grpc 服务:
var builder = webapplication.createbuilder(args); // 添加 grpc 服务 builder.services.addgrpc(); var app = builder.build(); // 映射 grpc 服务 app.mapgrpcservice<orderservice>(); app.run();
2. 提供 restful api
在 web api 中,可以通过控制器提供 restful api,并在内部调用 grpc 服务:
using microsoft.aspnetcore.mvc;
namespace grpcdemo.api.controllers
{
[apicontroller]
[route("api/[controller]")]
public class ordercontroller : controllerbase
{
private readonly order.orderclient _client;
public ordercontroller(order.orderclient client)
{
_client = client;
}
[httpget("create")]
public async task<iactionresult> createorder()
{
var response = await _client.createorderasync(
new createrequest {
orderno = datetime.now.tostring("yyyymmddhhmmssfff"),
ordername = "年货大礼包",
price = 699
});
return ok(response);
}
}
}3. 配置 grpc 客户端
在 program.cs 中注册 grpc 客户端:
builder.services.addgrpcclient<order.orderclient>(options =>
{
options.address = new uri("http://localhost:5147");
});
结果:

总结
在 .net core 中,grpc 提供了高性能的通信方式,适用于微服务、实时通信等场景。我们可以轻松创建 grpc 服务端和客户端,并将其集成到 web api 中。
关键点:
- 使用
.proto文件定义服务接口。 - 实现 grpc 服务端逻辑。
- 在客户端中调用 grpc 服务。
- 在 web api 中集成 grpc,提供 restful api 和 grpc 服务。
通过以上步骤,我们就可以在 .net core 项目中充分利用 grpc 的优势,构建高效的分布式系统。
以上就是.net8中grpc的使用方法详解的详细内容,更多关于.net8 grpc的资料请关注代码网其它相关文章!
发表评论